fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. unsigned long long P,Q,E,D;
  5.  
  6. int ExtendedGCD(long long A,long long B, long long *C, long long *D)
  7. {
  8. int I;
  9. long long J;
  10. if (A%B==0)
  11. {
  12. (*C)=0;
  13. (*D)=1;
  14. return B;
  15. }
  16. else
  17. {
  18. I = ExtendedGCD(B,A%B,C,D);
  19. J=(*C);
  20. (*C)=(*D);
  21. (*D)=(*D)*(-A/B)+J;
  22. return I;
  23. }
  24. }
  25.  
  26. void GenerateKeys()
  27. {
  28. long long I,J;
  29. P=6469; /*944659*/
  30. Q=5431; /*817907*/
  31. E=65537;
  32. ExtendedGCD((P-1)*(Q-1),E,&I,&J);
  33. while (J<=0)
  34. J+=(P-1)*(Q-1);
  35. D=J;
  36. }
  37.  
  38. unsigned long long ExponentBySquaring(unsigned long long V,unsigned long long Exp)
  39. {
  40. unsigned long long I;
  41. if (Exp==0)
  42. {
  43. return 1;
  44. }
  45. else if (Exp==1)
  46. {
  47. return V%(P*Q);
  48. }
  49. else
  50. {
  51. if (Exp%2==0)
  52. {
  53. I=ExponentBySquaring(V,Exp/2);
  54. I=(I*I)%(P*Q);
  55. }
  56. else
  57. {
  58. I=ExponentBySquaring(V,Exp/2);
  59. I=((I*I)%(P*Q))*(V%(P*Q));
  60. }
  61. return I%(P*Q);
  62. }
  63. }
  64.  
  65. unsigned long long MyEncrypt(unsigned long long M)
  66. {
  67. return ExponentBySquaring(M,E);
  68. }
  69.  
  70. unsigned long long MyDecrypt(unsigned long long C)
  71. {
  72. return ExponentBySquaring(C,D);
  73. }
  74.  
  75. int main()
  76. {
  77. GenerateKeys();
  78. printf("%llu\n",MyDecrypt(MyEncrypt(65)));
  79. return 0;
  80. }
  81.  
Success #stdin #stdout 0s 2252KB
stdin
Standard input is empty
stdout
65