Advertisement
Guest User

Untitled

a guest
May 4th, 2016
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <inttypes.h>
  4.  
  5. uint32_t modexp(uint32_t a, unsigned char e[32], uint32_t m)
  6. {
  7. /* TODO: implement */
  8. int i, j;
  9. uint64_t precomputed[16];
  10. precomputed[0] = 1;
  11. for(i=1; i<15;i++)
  12. {
  13. precomputed[i] = precomputed[i-1]*a;
  14. precomputed[i] = precomputed [i] % m;
  15. }
  16.  
  17. uint64_t r = 1;
  18. for(i=31; i>=0; i--)
  19. {
  20. for(j=3; j>=0; j--)
  21. {
  22. r = r*r;
  23. r = r % m;
  24. }
  25. unsigned char x = e[i]<<4;
  26. x = x>>4;
  27. r = r * precomputed[x];
  28. r = r % m;
  29. for(j=3; j>=0; j--)
  30. {
  31. r = r*r;
  32. r = r % m;
  33. }
  34. x = e[i]>>4;
  35. r = r * precomputed[x];
  36. r = r % m;
  37. }
  38. return r;
  39. }
  40.  
  41. /* Pipe output through sage */
  42. #define NTESTS 20
  43. int main(void)
  44. {
  45. //FILE *urandom = fopen("/dev/urandom", "r");
  46. uint32_t a,r,ei, m;
  47. unsigned char e[32];
  48. int i,j;
  49.  
  50. for(i=0;i<NTESTS;i++)
  51. {
  52. a = (uint32_t)rand();
  53. m = (uint32_t)rand();
  54. for(j=0;j<32;j++)
  55. e[j] = (char) rand();
  56. r = modexp(a,e,m);
  57. ei = 0;
  58. for(j=0;j<4;j++)
  59. ei |= (uint32_t)e[j] << 8*j;
  60.  
  61. printf("power_mod(%u,%u,%u) - %u\n", a,ei,m,r);
  62. }
  63.  
  64. //fclose(urandom);
  65. return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement