Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5.  
  6. long long p,q,e,d;
  7.  
  8.  
  9.  
  10. //Euklideszi algoritmus:
  11. long long euk(long long a,long long b) {
  12. long long csere;
  13.  
  14. //amíg az a / b nem nulla, b mardék, a meg az előző b
  15. while(a%b!=0)
  16. {
  17. csere=b;
  18. b=a%b;
  19. a=csere;
  20. }
  21. return b;
  22. }
  23. //kibovitett euklideszi módosított
  24. long long kibeukmod(long long a,long long b) {
  25.  
  26. long long x0 = 1, x1 = 0, y0 = 0, y1 = 1;
  27. long long csere1, csere2, csere3;
  28. long long elojel1 = -1, elojel2 = 1;
  29. long long fi=a;
  30. while(a % b != 0) {
  31. csere1 = (a / b) * y1 + y0 ;//yk sort számolja
  32. csere3 = (a / b) * x1 + x0 ;
  33. x0 = x1 ;
  34. y0 = y1 ;
  35. x1 = csere3 ;
  36. y1=csere1 ;
  37. csere2=b ;
  38. b= a % b ;//törtész
  39. a=csere2;
  40. elojel1=-elojel1;//kitevő és páratlanról indul
  41. elojel2=-elojel2;
  42. }
  43. x1= x1 * elojel1 ;
  44. y1 = y1 * elojel2;
  45.  
  46. return y1;//d-t kapjuk vissza
  47. }
  48.  
  49. long long kibeukmod2(long long a, long long b)
  50. {
  51.  
  52. /*long long y0=1;
  53. long long y1=0;
  54. long long y2 = 0;
  55. long long csere;//rk
  56. long long csere2;//qk
  57. long long elojel=-1;
  58. long long fi=a;
  59. while(a%b!=0)
  60. {
  61. csere=(a/b)*y1+y0;//yk sort számolja
  62. y0=y1;
  63. y1=csere;
  64. csere2=b;
  65. b=a%b;//törtész
  66. a=csere2;
  67. elojel=elojel * -1;//kitevő és páratlanról indul
  68. }
  69. y1=elojel*y1;
  70. while(y1<0) {
  71. y1=y1+fi;//d kiszámolása, d mindig pozitív
  72. }*/
  73. long long x0 = 1, x1 = 0, y0 = 0, y1 = 1;
  74. long long csere1, csere2, csere3;
  75. long long elojel1 = -1, elojel2 = 1;
  76. long long fi=a;
  77. while(a % b != 0) {
  78. csere1 = (a / b) * y1 + y0 ;//yk sort számolja
  79. csere3 = (a / b) * x1 + x0 ;
  80. x0 = x1 ;
  81. y0 = y1 ;
  82. x1 = csere3 ;
  83. y1=csere1 ;
  84. csere2=b ;
  85. b= a % b ;//törtész
  86. a=csere2;
  87. elojel1=-elojel1;//kitevő és páratlanról indul
  88. elojel2=-elojel2;
  89. }
  90. x1= x1 * elojel1 ;
  91. y1 = y1 * elojel2;
  92.  
  93. return x1;//visszafejtésnél a c1 értékéhez kell
  94. }
  95.  
  96. long long gyorshatvanyozas(long long alap, long long kitevo, long long mod)
  97. {
  98. long long result = 1;
  99. while (kitevo > 0)
  100. {
  101. if (kitevo % 2 == 1)
  102. result = (result * alap) % mod;
  103. kitevo = kitevo >> 1;
  104. alap = (alap * alap) % mod;
  105. }
  106. return result;
  107. }
  108.  
  109. long long miller_rabin(long long n) {
  110. long long a=2;
  111. long long d;
  112. long long s=0;
  113. long long n1=n-1;
  114. long long r;
  115. if(n%2==0)
  116. {
  117. return 0;
  118. }
  119. else
  120. {
  121. while(n1%2==0)//megszámolja hány S van benne
  122. {
  123. s++;
  124. n1=n1/2;
  125. }
  126. d=(n-1)/(int)pow(2,s);
  127. if(gyorshatvanyozas(a,d,n)==1)
  128. {
  129. return 1;
  130. }
  131. else
  132. {
  133. for(r=0; r<s; r++)
  134. {
  135. if(gyorshatvanyozas(a,(int)pow(2,r)*d,n)==n-1)
  136. {
  137. return 1;
  138. }
  139. }
  140. }
  141. return 0;
  142. }
  143.  
  144. }
  145.  
  146. //addig generál, amíg két prímet nem ad vissza
  147. void kulcsgeneralas() {
  148. long long n,fi;
  149. while(1) {
  150. p=rand();
  151. if(miller_rabin(p)==1)
  152. {
  153. break;
  154. }
  155. }
  156.  
  157. p = 17 ;
  158. while(1) {
  159. q=rand();
  160. if(miller_rabin(q)==1)
  161. {
  162. break;
  163. }
  164. }
  165. q = 13 ;
  166.  
  167. //a p-nek és a q-nak prímnek kell lenni
  168. //Miller-Rabin kell még ide, mert ez teszteli, hogy prím-e a p és a q
  169. n=p*q; //n es e a nyilvanos kulcs
  170. // generálni kell majd e-t
  171. fi=(p-1)*(q-1);
  172.  
  173. while(1) //ide fogjuk belerakni az e generalast
  174. {
  175. //e=rand()%(fi-2)+2;
  176. e=rand()%(fi-2)+2;
  177. if(euk(fi,e)==1)// ezért írom előre a fi-t ,mert az nagyobb mlong long az e (füzet)
  178. {
  179. break;
  180. }
  181. }
  182. d=kibeukmod(fi,e);
  183. while(d < 0) {
  184. d += (p-1) * (q-1);
  185. }
  186.  
  187. }
  188.  
  189. long long titkositas (long long m) {
  190.  
  191. return gyorshatvanyozas(m,e,p*q);
  192.  
  193. }
  194. long long visszafejtes (long long c) {
  195. long long m;
  196. /*cp=c%p;
  197. cq=c%q;
  198. dp=d%(p-1);
  199. dq=d%(q-1);
  200. m=gyorshatvanyozas(cp,dp,p*q)*gyorshatvanyozas(q,p-1,p*q)+gyorshatvanyozas(cq,dq,p*q)*gyorshatvanyozas(p,q-1,p*q);*/
  201. long long nagyobb, kisebb ;
  202. long long c1, c2 ;
  203. long long y1, y2;
  204. long long kitevo1, kitevo2;
  205. if(p > q) {
  206. nagyobb = p;
  207. kisebb = q;
  208. }
  209. else {
  210. nagyobb = q;
  211. kisebb = p;
  212. }
  213. //y1 = kibeukmod2(nagyobb, kisebb);
  214. y1 = kibeukmod(nagyobb, kisebb);
  215. //y2 = kibeukmod(nagyobb, kisebb);
  216. y2 = kibeukmod2(nagyobb, kisebb);
  217. printf("y1: %lld\n",y1) ;
  218. printf("y2: %lld\n",y2) ;
  219. kitevo1 = d % (p - 1);
  220. kitevo2 = d % (q - 1);
  221. c1 = gyorshatvanyozas(c, kitevo1 , p);
  222. c2 = gyorshatvanyozas(c, kitevo2 , q);
  223. printf("c1: %lld\n",c1) ;
  224. printf("c2: %lld\n",c2) ;
  225. m = (y1 * q * c1 )+ (y2 * p * c2) ;
  226. while (m < 0) {
  227. m += (p*q);
  228. }
  229. m = m % (p * q);
  230.  
  231. return m;
  232.  
  233.  
  234. }
  235.  
  236. int main() {
  237. srand (time(NULL));
  238. long long szam;
  239. long long m;
  240. char c[100];
  241. kulcsgeneralas();
  242.  
  243.  
  244. for (int i = 0; i <10; i++) {
  245. if (miller_rabin(12))
  246. printf("yes") ;
  247. }
  248.  
  249.  
  250. printf("p= %lld \nq= %lld \ne= %lld \nd= %lld \np * q= %lld\n fi(n)= %lld\n",p,q,e,d,p*q, (p-1) * (q - 1) );
  251. printf("#####################\n");
  252. printf("Adjon meg egy uzenetet, amit titkositunk: "), scanf("%lld", &m);
  253. //printf("Adja meg a kodlando szoveget: ", &c);
  254. szam=titkositas(m);
  255. printf("%lld titkositva: %lld\n",m, szam);
  256. printf("sima: %lld\n",gyorshatvanyozas(szam, d, p * q));
  257. printf("kinai:%lld\n",visszafejtes(szam));
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement