Advertisement
Guest User

Untitled

a guest
Apr 1st, 2015
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. // IRA_Lab_2.cpp: определяет точку входа для консольного приложения.
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <math.h>
  6. #include <time.h>
  7. using namespace std;
  8.  
  9. struct ABON {
  10. long long c;
  11. long long d;
  12. long long x;
  13. };
  14.  
  15. struct ABON_RSA{
  16. long long P;
  17. long long Q;
  18. long long N;
  19. long long d;
  20. long long c;
  21. };
  22.  
  23. struct EGMessage {
  24. long long r;
  25. long long e;
  26. long long p;
  27. };
  28.  
  29. struct STR {
  30. long long arg1;
  31. long long arg2;
  32. long long arg3;
  33. };
  34.  
  35. bool simpleChecker(long long p){
  36. for (long long i = 2; i <= sqrt((double)p); i++){
  37. if (p%i == 0)
  38. return false;
  39. }
  40. return true;
  41. };
  42.  
  43. long long simpleGen(long long order){
  44. long long gen, check;
  45. if(order)
  46. gen = (rand() * rand() + rand()) % order;
  47. else
  48. gen = rand() * rand() + rand() + 1;
  49. do{
  50. gen++;
  51. check = simpleChecker(gen);
  52. } while (!check);
  53. return gen;
  54. }
  55.  
  56. STR gcdO(long long a, long long b){
  57. STR U, V, T;
  58. long long q;
  59. U.arg1 = a; U.arg2 = 1; U.arg3 = 0;
  60. V.arg1 = b; V.arg2 = 0; V.arg3 = 1;
  61. while (V.arg1 != 0){
  62. q = U.arg1 / V.arg1;
  63. T.arg1 = U.arg1%V.arg1; T.arg2 = U.arg2 - q*V.arg2; T.arg3 = U.arg3 - q*V.arg3;
  64. U = V; V = T;
  65. }
  66. return U;
  67.  
  68. }
  69.  
  70. long long gcd(long long a, long long b){
  71. long long r;
  72. while (b != 0){
  73. r = a%b; a = b; b = r;
  74. }
  75. return a;
  76. }
  77.  
  78. long long codeMod(long long a, long long x, long long p){
  79. long long rez = 1;
  80. for (long long aCurr=a%p; x>0; x>>=1, aCurr = (aCurr*aCurr)%p)
  81. if (x & 1)
  82. rez = rez*aCurr%p;
  83. return rez;
  84. }
  85.  
  86. long long genC(long long p){
  87. long long c;
  88. do{
  89. c = simpleGen(0);
  90. }while(gcd(c, p - 1)!=1 || c<=1 || c>=p-1);
  91. return c;
  92. }
  93.  
  94. long long calcD(long long p,long long c){
  95. long long result;
  96. STR gcd = gcdO(c,p-1);
  97. result=gcd.arg2;
  98. if (result>0)
  99. return result;
  100. else
  101. return result+p-1;
  102.  
  103. }
  104.  
  105. long long ShamirExample(){
  106. long long p=71,m=10;
  107. ABON A,B;
  108. p = simpleGen(0);
  109. cout<<"p = "<<p<<endl;
  110. A.c = genC(p);
  111. A.d = calcD(p, A.c);
  112. cout<<"A.c = "<<A.c<<" A.d = "<<A.d<<endl;
  113. B.c = genC(p);
  114. B.d=calcD(p,B.c);
  115. cout<<"B.c = "<<B.c<<" B.d = "<<B.d<<endl;
  116. A.x=codeMod(m,A.c,p);
  117. B.x=codeMod(A.x,B.c,p);
  118. A.x=codeMod(B.x,A.d,p);
  119. B.x=codeMod(A.x,B.d,p);
  120. cout<<"message: "<<B.x<<endl;
  121. return B.x;
  122. }
  123.  
  124. EGMessage EGCode(ABON B,long long m,long long p,long long k, long long g){
  125. EGMessage message;
  126. message.p=p;
  127. message.r=codeMod(g,k,p);
  128. message.e=(m*codeMod(B.d,k,p))%p;
  129. return message;
  130. }
  131.  
  132. long long EGDeCode(EGMessage message,ABON B){
  133. long long p=message.p;
  134. long long m=(message.e*codeMod(message.r,p-1-B.c,p))%p;
  135. return m;
  136. }
  137.  
  138. void EGExample(){
  139. EGMessage message;
  140. ABON B;
  141. long long k=7,q,p,g;
  142. while(true)
  143. {
  144. q = simpleGen(0);
  145. if(simpleChecker(2*q+1))
  146. {
  147. p = 2 * q + 1;
  148. cout<<"p = "<<p<<endl;
  149. break;
  150. }
  151. }
  152. for(long long i=2; i < p-1; ++i){
  153. if(simpleChecker(i) && codeMod(i, q, p)!=1){
  154. g=i;
  155. break;
  156. }
  157. }
  158. long long m=15;
  159. B.c=genC(p);
  160. B.d=calcD(p,B.c);
  161. message=EGCode(B,m,p,k,g);
  162. cout<<"message.r = "<<message.r<<" message.e = "<<message.e<<endl;
  163. cout<<"Decoded: "<<EGDeCode(message,B)<<endl;
  164.  
  165. }
  166.  
  167. long long calcF(ABON_RSA B){
  168. long long result=(B.Q-1)*(B.P-1);
  169. return result;
  170. }
  171.  
  172. long long RSACode(ABON_RSA B,long long m) {
  173. long long e=codeMod(m,B.d,B.N);
  174. return e;
  175. }
  176.  
  177. long long RSADecode(long long e, ABON_RSA B){
  178. long long result=codeMod(e,B.c,B.N);
  179. return result;
  180. }
  181.  
  182. long long RSAExample(){
  183. ABON_RSA B;
  184. long long m=15;
  185. long long e;
  186. B.P=3;
  187. B.Q=11;
  188. B.N=33;
  189. B.d=3;
  190. long long F=calcF(B);
  191. STR st1=gcdO(F,B.d);
  192. B.c=st1.arg3;
  193. e=RSACode(B,m);
  194. cout<<RSADecode(e,B);
  195. return 0;
  196. }
  197.  
  198. int main(){
  199. srand(time(NULL));
  200.  
  201. EGExample();
  202. // RSAExample();
  203. //ShamirExample();
  204. return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement