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

金融证券系统

开发平台:

Visual C++

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