fork download
  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <cmath>
  5. #include <cstdlib>
  6. #include <ctime>
  7. using namespace std;
  8.  
  9. int exgcd(int a, int b,int *x,int *y) //拓展欧几里得算法
  10. {
  11. if(b==0)
  12. {
  13. *x=1;
  14. *y=0;
  15. return a;
  16. }
  17. int gcd=exgcd(b,a%b,x,y);
  18. int temp=*x;
  19. *x=*y;
  20. *y=temp-a/b*(*y);
  21. return gcd;
  22. }
  23.  
  24. int isprime(int a) //素数判断
  25. {
  26. int i;
  27. for(i=2;i<1+(a/2);i++){
  28. if(a%i==0)return 1;
  29. }
  30. return 0;
  31. }
  32.  
  33. void primegenerator(int prime[10]) //生成素数表
  34. {
  35. int i,j=0;
  36. for(i=91;i<=1000;i++){
  37. if(isprime(i)==0){
  38. prime[j]=i;
  39. j++;
  40. }
  41. if(j>9)break;
  42. }
  43. }
  44.  
  45.  
  46. int main()
  47. {
  48. int prime[10];
  49. primegenerator(prime);
  50. int seed,p,q;
  51. seed=time(0);
  52. srand((unsigned int)seed); //生成在范围内的随机素数p,q
  53. p=rand()%9;
  54. do{
  55. q=rand()%9;
  56. }while(q==p);
  57. int e,d,n,fi_n,r,nu,w1,w2;
  58.  
  59.  
  60. int a;
  61. cout<<"请选择加密/解密"<<endl;
  62. cout<<"输入0代表加密"<<' '<<"输入1代表解密"<<endl;
  63. cin>>a;
  64. char minwen[1000];
  65.  
  66. int i,j,mi;
  67. if(a==0){
  68. n=prime[p]*prime[q];
  69. fi_n=(prime[p]-1)*(prime[q]-1);
  70. for(r=fi_n/2;n>=1;r--){ //求得公钥
  71. if(exgcd(r,fi_n,&w1,&w2)==1){
  72. e=r;
  73. break;
  74. }
  75. }
  76. r=exgcd(e,fi_n,&d,&nu);
  77. cout<<"请输入明文"<<endl;
  78. scanf("%s",minwen);
  79. int shuma_minwen[strlen(minwen)];
  80. for(i=0;i<strlen(minwen);i++){
  81. shuma_minwen[i]=minwen[i];
  82. }
  83. int shuma_miwen[strlen(minwen)]; //录入结束,开始加密
  84. for(i=0;i<strlen(minwen);i++){
  85. mi=shuma_minwen[i];
  86. shuma_miwen[i]=1;
  87. for(j=1;j<=e;j++){
  88. shuma_miwen[i]=(shuma_miwen[i]*mi)%n;
  89. }
  90. }
  91. cout<<"密文为"<<endl;
  92. for(i=0;i<strlen(minwen);i++){
  93. cout<<shuma_miwen[i]<<' '; //加密结束,输出密文,私钥
  94. }
  95. cout<<endl<<"密文长度为"<<i<<endl;
  96. cout<<endl<<"解密私钥为"<<endl;
  97. cout<<d<<' '<<n<<endl;
  98. }
  99. else if(a==1){
  100. int shuma_jiemiwen[10000];
  101.  
  102. cout<<"请输入密文长度"<<endl;
  103. int k;
  104. cin>>k;
  105. cout<<"请输入密文"<<endl; //录入密文
  106. int t=0;
  107. for(i=0;i<k;i++){
  108. cin>>shuma_jiemiwen[i];
  109. }
  110. int sizel=k;
  111.  
  112. cout<<"请输入私钥(d,n) (分别输入d,n用空格隔开)"<<endl;
  113. int d1,n1;
  114. cin>>d1>>n1;
  115. int ming;
  116. int shuma_jieminwen[sizel]; //开始解密
  117. for(i=0;i<sizel;i++){
  118. ming=shuma_jiemiwen[i];
  119. shuma_jieminwen[i]=1;
  120. for(j=0;j<d1;j++){
  121. shuma_jieminwen[i]=shuma_jieminwen[i]*ming%n1;
  122. }
  123. }
  124.  
  125. char jieminwen[sizel];
  126. for(i=0;i<sizel;i++){
  127. jieminwen[i]=shuma_jieminwen[i];
  128. }
  129. cout<<"明文为"<<endl; //输出明文
  130. for(i=0;i<sizel;i++){
  131. cout<<jieminwen[i];
  132. }
  133. }
  134. return 0;
  135. }
  136.  
Success #stdin #stdout 0s 5284KB
stdin
你好呀
stdout
请选择加密/解密
输入0代表加密 输入1代表解密
请输入明文
密文为
-6806 -5251 -8093 -7601 -5477 -5251 -7601 -12546 -2405 
密文长度为9

解密私钥为
7207 14659