RSA.C
上传用户:kelungde
上传日期:2007-01-06
资源大小:3k
文件大小:9k
源码类别:

加密解密

开发平台:

C/C++

  1. #include <windows.h>
  2. #include <dos.h>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <math.h>
  8. #include <time.h>
  9. #define DATALENGTH 350
  10. #define MLENGTH 10
  11. #define TESTNUM 20
  12. #define SKLENGTH 5
  13. #define TEXTLENGTH 20
  14. typedef signed char byteint[DATALENGTH]; //-128 ->127
  15. typedef signed char mtype[MLENGTH];
  16. mtype Model[TESTNUM];
  17. byteint ONEVALUE,ZEROVALUE,TWOVALUE,EIGHTVALUE;
  18. void InitInt(void);
  19. void SetZero(byteint A);
  20. void IntCpy(byteint A,byteint B);
  21. int IntValid(byteint validtemp);
  22. int IntCmp(byteint A,byteint B);
  23. void Plus(byteint A,byteint B,byteint C);
  24. void Substract(byteint SA,byteint SB,byteint SC);
  25. void Multiply(byteint A,byteint B,byteint C);
  26. void SetMode(byteint A,byteint B,byteint C,byteint D);
  27. void IntRandom(byteint RandomA,int num);
  28. void LoadInt(byteint A,mtype B);
  29. void Mdata(void);
  30. void TransBi(byteint B,signed char flag[400]);
  31. int PowerMode(byteint A,byteint C,byteint D,signed char flag[400]);
  32. int Prime(byteint Prm);
  33. int ComputingPK(byteint Rvalue,byteint SK,byteint PK);
  34. int StrToByt(char *str,byteint byt);
  35. void BytToStr(byteint byt,char *str);
  36. void PackInt(byteint A,int B);
  37. byteint R,SK,PK,RsaKey; 
  38. extern int ShoutBlockingHook (void);
  39. extern char szDataPath[128];
  40. int RsaPrepare(byteint sk,byteint pk,byteint r)
  41. {
  42.   byteint p,q,Rvalue,buf1,buf2;
  43. Mdata();
  44. InitInt();
  45. Prime(p);
  46. Prime(q);
  47. Multiply(p,q,r);
  48. Substract(p,ONEVALUE,buf1);
  49. Substract(q,ONEVALUE,buf2);
  50. Multiply(buf1,buf2,Rvalue);
  51. ComputingPK(Rvalue,sk,pk); 
  52. return TRUE;
  53. }
  54. int ReadRsaFile(byteint r,byteint pk,byteint sk)
  55. {
  56. char file[80],temp[100+1];
  57. sprintf(file,"%s\sys\rsa.dat",szDataPath);
  58. if(GetPrivateProfileString("RSA", "R", "", temp,100, file)!=0)
  59. StrToByt(temp,r);
  60. else
  61. return FALSE;
  62. if(GetPrivateProfileString("RSA", "PK", "", temp, 100, file)!=0)
  63. StrToByt(temp,pk);
  64. else
  65. return FALSE;
  66. if(GetPrivateProfileString("RSA", "SK", "", temp, 100, file)!=0)
  67. StrToByt(temp,sk);
  68. else
  69. return FALSE;
  70. return TRUE;
  71. }
  72. int WriteRsaFile(byteint r,byteint pk,byteint sk)
  73. {
  74. char file[80],temp[100+1];
  75. sprintf(file,"%s\sys\rsa.dat",szDataPath);
  76. memset(temp,0,100+1);
  77. BytToStr(r,temp);
  78. if(WritePrivateProfileString("RSA", "R", temp, file)==0)
  79. return FALSE;
  80. memset(temp,0,100+1);
  81. BytToStr(pk,temp);
  82. if(WritePrivateProfileString("RSA", "PK", temp, file)==0)
  83. return FALSE;
  84. memset(temp,0,100+1);
  85. BytToStr(sk,temp);
  86. if(WritePrivateProfileString("RSA", "SK", temp, file)==0)
  87. return FALSE;
  88. return TRUE;
  89. }
  90. int DecipherDesKey(byteint rsakey,byteint r,byteint sk,char *deskey)
  91. {
  92. byteint buf1;
  93. signed char flag[400];
  94. Mdata();
  95. InitInt();
  96. TransBi(sk,flag);
  97. PowerMode(rsakey,r,buf1,flag);
  98.     BytToStr(buf1,deskey);
  99.     
  100. return 0;
  101. }
  102. void InitInt(void)
  103. {
  104. SetZero(ONEVALUE);
  105. ONEVALUE[DATALENGTH-1]=1;
  106. SetZero(ZEROVALUE);
  107. SetZero(TWOVALUE);
  108. TWOVALUE[DATALENGTH-1]=2;
  109. SetZero(EIGHTVALUE);
  110. EIGHTVALUE[DATALENGTH-1]=8;
  111. //randomize();
  112. srand((unsigned)time(NULL));
  113. }
  114. void Multiply(byteint A,byteint B,byteint C)
  115. {
  116. register i,j,w;
  117. int X,Y,Z;
  118. int Avalid=0;
  119. int Bvalid=0;
  120. while(A[Avalid]==0 &&Avalid <DATALENGTH)
  121. Avalid++;
  122. while(B[Bvalid]==0 &&Bvalid <DATALENGTH)
  123. Bvalid++;
  124. SetZero(C);
  125. for(i=DATALENGTH -1;i>=Avalid;i--)
  126. {
  127. for(j=DATALENGTH-1;j>=Bvalid;j--)
  128. {
  129. X=A[i]*B[j];
  130. Y=X/10;
  131. Z=X-10*Y;
  132. w=i+j-(DATALENGTH-1);
  133. C[w]=C[w]+Z;
  134. C[w-1]=C[w-1]+(C[w]/10)+Y;
  135. C[w]=C[w]-(C[w]/10)*10;
  136. }
  137. }
  138. }
  139. void SetZero(byteint A)
  140. {
  141. memset(A,0,DATALENGTH);
  142. }
  143. void IntCpy(byteint A,byteint B)
  144. {
  145. memcpy(A,B,DATALENGTH);
  146. }
  147. void Plus(byteint A,byteint B,byteint C)
  148. {
  149. register i;
  150. int X,Y,Z,m,n,valid;
  151. m=IntValid(A);
  152. n=IntValid(B);
  153. valid=(m>n) ? m+1:n+1;
  154. SetZero(C);
  155. for(i=DATALENGTH -1;i>=DATALENGTH -valid;i--)
  156. {
  157. X=A[i] +B[i];
  158. Y=X/10;
  159. Z=X-10*Y;
  160. C[i]=C[i]+Z;
  161. C[i-1]=C[i-1]+Y;
  162. }
  163. }
  164. void Substract(byteint SA,byteint SB,byteint SC)
  165. {
  166. byteint buf;
  167. register i,j;
  168. int X;
  169. IntCpy(buf,SA);
  170. SetZero(SC);
  171. for(i=DATALENGTH-1;i>=0;i--)
  172. {
  173. if(buf[i]<SB[i]){
  174. buf[i]+=10;
  175. if(buf[i-1]>0)
  176. (buf[i-1])--;
  177. else {
  178. j=i-1;
  179. while (buf[j]==0)
  180. buf[j--]=9;
  181. buf[j]--;
  182. }
  183. }
  184. X=buf[i]-SB[i];
  185. SC[i]=X;
  186. }
  187. }
  188. int IntCmp(byteint A,byteint B)
  189. {
  190. int stat;
  191. stat =memcmp(A,B,DATALENGTH);
  192. if(stat ==0)
  193. return 0;
  194. if(stat>0)
  195. return 1;
  196. return -1;
  197. }
  198. int IntValid(byteint validtemp)
  199. {
  200. register i=0;
  201. while (validtemp[i]==0 && i<DATALENGTH)
  202. i++;
  203. return DATALENGTH-i;
  204. }
  205. void SetMode(byteint A,byteint B,byteint C,byteint D)
  206. {
  207. register i,j,k;
  208. int valid_1,valid_2,valid,sbits,cmpval;
  209. byteint buf1,buf2;
  210. SetZero(D);
  211. IntCpy(C,A);
  212. valid_2=IntValid(B);
  213. while((cmpval =IntCmp(C,B))>0){
  214. valid_1 =IntValid(C);
  215. valid =valid_1-valid_2;
  216. if(valid>0){
  217. i=DATALENGTH -valid_1;
  218. j=DATALENGTH -valid_2;
  219. sbits=0;
  220. for(k=j;k<DATALENGTH;k++){
  221. if(C[i]>B[j])
  222. break;
  223. if(C[i]<B[j]){
  224. sbits=1;
  225. break;
  226. }
  227. i++;j++;
  228. }
  229. valid=valid -sbits;
  230. SetZero(buf1);
  231. for(i=valid;i<DATALENGTH;i++){
  232. j=i-valid;
  233. buf1[j]=B[i];
  234. }
  235. }
  236. else
  237. IntCpy(buf1,B);
  238. D[DATALENGTH-1-valid]++;
  239. Substract(C,buf1,buf2);
  240. IntCpy(C,buf2);
  241. }
  242. if(cmpval==0){
  243. SetZero(C);
  244. D[DATALENGTH-1]++;
  245. }
  246. }
  247. void IntRandom(byteint RandomA,int num)
  248. {
  249. int i;
  250. SetZero(RandomA);
  251. while(!(RandomA[DATALENGTH-1] % 2))
  252. RandomA[DATALENGTH-1]=rand() % 10;
  253. while(!RandomA[DATALENGTH-num])
  254. RandomA[DATALENGTH-num] =rand() % 10;
  255. i=DATALENGTH -2;
  256. while(i>=DATALENGTH -num +1)
  257. RandomA[i--]=rand() % 10;
  258. }
  259. void LoadInt(byteint A,mtype B)
  260. {
  261. register i,j;
  262. SetZero(A);
  263. i=DATALENGTH -1;
  264. j=MLENGTH -1;
  265. while(j>=0)
  266. A[i--]=B[j--];
  267. }
  268. void Mdata(void)
  269. {
  270. register i,j;
  271. int k=MLENGTH -2;
  272. memset(Model,0,TESTNUM*MLENGTH);
  273. for(i=0;i<TESTNUM;i++){
  274. for(j=MLENGTH-1;j>=k;j--)
  275. Model[i][j]=rand()%10;
  276. k-=1;
  277. }
  278. }
  279. void TransBi(byteint B,signed char flag[400])
  280. {
  281. byteint buf;
  282. byteint result;
  283. byteint temp;
  284. register i;
  285. memset(flag,0,400);
  286. i=399;
  287. IntCpy(buf,B);
  288. while(IntCmp(buf,ZEROVALUE)==1){
  289. ShoutBlockingHook();
  290. SetMode(buf,TWOVALUE,temp,result);
  291. flag[i]=temp[DATALENGTH -1];
  292. IntCpy(buf,result);
  293. i--;
  294. }
  295. flag[i] =-1;
  296. }
  297. int PowerMode(byteint A,byteint C,byteint D,signed char flag[400])
  298. {
  299. byteint buf;
  300. byteint result;
  301. byteint temp,P;
  302. register i;
  303. IntCpy(temp,A);
  304. if(flag[399]==1)
  305. IntCpy(result,A);
  306. else
  307. IntCpy(result,ONEVALUE);
  308. i=398;
  309. while(flag[i]!=-1){
  310. ShoutBlockingHook();
  311. Multiply(temp,temp,buf);
  312. SetMode(buf,C,temp,P);
  313. if(flag[i]!=0){
  314. Multiply(temp,result,buf);
  315. SetMode(buf,C,result,P);
  316. }
  317. i--;
  318. }
  319. IntCpy(buf,C);
  320. IntCpy(D,result);
  321. Substract(buf,ONEVALUE,temp);
  322. if(IntCmp(result,ONEVALUE)==0)
  323. return 1;
  324. if(IntCmp(result,temp)==0)
  325. return 2;
  326. return 0;
  327. }
  328. int Prime(byteint Prm)
  329. {
  330. int i,k,ok,cnt=0;
  331. signed char flag[400];
  332. byteint A,B,D,buf1,buf2;
  333. int pass=0,pass_2=0;
  334. while(1){
  335. ShoutBlockingHook();
  336. cnt++;
  337. IntRandom(B,MLENGTH);
  338. IntCpy(Prm,B);
  339. Substract(B,ONEVALUE,buf1);
  340. SetMode(buf1,TWOVALUE,buf2,B);
  341. TransBi(B,flag);
  342. ok=1;
  343. for(i=0;i<TESTNUM;i++){
  344. LoadInt(A,Model[i]);
  345. k=PowerMode(A,Prm,D,flag);
  346. if(k!=1&&k!=2)
  347. break;
  348. if(k==2){
  349. pass_2=1;
  350. }
  351. }
  352. if(ok && pass_2 ){
  353. return 0;
  354. }
  355. }
  356. }
  357. int ComputingPK(byteint Rvalue,byteint SK,byteint PK)
  358. {
  359. register i;
  360. byteint PA,PB,PC,buf,temp,buf2;
  361. SetZero(PK);
  362. while(1)
  363. {
  364. IntRandom(SK,SKLENGTH);
  365. IntCpy(PB,SK);
  366. IntCpy(PA,Rvalue);
  367. while(1) {
  368. ShoutBlockingHook();
  369. SetMode(PA,PB,PC,PK);
  370. i=IntCmp(PC,ONEVALUE);
  371. if(i==0)
  372. break;
  373. i=IntCmp(PC,ZEROVALUE);
  374. if(i==0){
  375. i=-1;
  376. break;
  377. }
  378. IntCpy(PA,PB);
  379. IntCpy(PB,PC);
  380. }
  381. if(i==0)
  382. break;
  383. }
  384. IntCpy(temp,ONEVALUE);
  385. IntCpy(PA,Rvalue);
  386. IntCpy(PB,SK);
  387. while (1){
  388. Multiply(PA,temp,buf);
  389. Plus(buf,ONEVALUE,buf2);
  390. SetMode(buf2,PB,buf,PK);
  391. if(IntCmp(buf,ZEROVALUE)==0)
  392. break;
  393. Plus(temp,ONEVALUE,buf);
  394. IntCpy(temp,buf);
  395. }
  396. return 1;
  397. }
  398. void PackInt(byteint A,int B)
  399. {
  400. register i=DATALENGTH-1;
  401. SetZero(A);
  402. while(B>0){
  403. A[i--]=B % 10;
  404. B=B/10;
  405. }
  406. }
  407. int StrToByt(char *str,byteint byt)
  408. {
  409. unsigned int m;
  410. SetZero(byt);
  411. for(m=0;m<strlen(str);m++)
  412. byt[DATALENGTH-1-m]=str[strlen(str)-m-1]-'0';
  413. return 1;
  414. }
  415. void BytToStr(byteint byt,char *str)
  416. {
  417.   unsigned  int i=0,j=0;
  418.   while(i<DATALENGTH&&byt[i]==0) i++;
  419.   for(;i<DATALENGTH;i++,j++)
  420.   {
  421.   str[j] =byt[i]+'0';
  422.   }
  423. }