RSA实现

来源:互联网 发布:手机立绘制作软件 编辑:程序博客网 时间:2024/05/10 14:58

一、运算基础(大数相乘、取模、乘方、素数判定等)

为了方便,封装在一个DLL文件中(代码如下:)

1.头文件

#include <stdio.h> #include <string.h>#include <stdlib.h>extern "C" __declspec(dllexport)void Add (char *tempbuf1,   char *tempbuf2, char *result);  // 大数相加 result = tempbuf1 + tempbuf2extern "C" __declspec(dllexport)void Sub(char *tempbuf1, char *tempbuf2, char *result);     // 大数相减 result = tempbuf1 - tempbuf2 (默认前者大)extern "C" __declspec(dllexport)int Compare(char *tempbuf1,char *tempbuf2);  // 比较两数的大小extern "C" __declspec(dllexport) void Chen (char *tempbuf1,   char *tempbuf2, char *result); // 大数相乘 result = tempbuf1 * tempbuf2void Trans (char *str_num1,   char *str_num2, char *tempbuf1, char *tempbuf2); // 大数转化为等长,且最前面添加 “0”extern "C" __declspec(dllexport)                                             // 大数除法 div_result = tempbuf1 / tempbuf2void  Mod_Div(char *tempbuf1,   char *tempbuf2, char *mod_result  , char *div_result );    // 大数求余 result = tempbuf1 % tempbuf2  extern "C" __declspec(dllexport)void  ChenFang (char *tempbuf1,   int num, char *result);    // 大数乘方   result = tempbuf1 ^ numextern "C" __declspec(dllexport)void  ThrowAway_0 (char *tempbuf );  // 去除结果前面的 连续的无意义的 "0"extern "C" __declspec(dllexport)bool NiYuan(char *str1 , char *str2 , char *result) ;  // str1^(-1) mod str2 = resultextern "C" __declspec(dllexport)void ToHex(char *num , char *Hex);  //大数转换成16进制extern "C" __declspec(dllexport)void ReverseStr(char *str , char *result); // 字符串str 逆序输出到 resultextern "C" __declspec(dllexport)bool Is_Prime_Number(char *num);   //判定素数

2.主要代码:

//=============================================================================================================#include "Big__CALC.h"void Trans(char *str_num1, char *str_num2, char *tempbuf1, char *tempbuf2){int len_num1=0;int len_num2=0;int i=0;while(str_num1[i]!='\0'){len_num1++;i++;}//printf("字符串1的长度: length1=%d\n",len_num1);i=0;while(str_num2[i]!='\0'){len_num2++;i++;}//printf("字符串2的长度: length2=%d\n\n",len_num2);tempbuf1[0]='0';tempbuf2[0]='0';//=======================================================================if(len_num2>=len_num1)                                   //补成相同长度{for(i=1;i<=(len_num2-len_num1);i++){tempbuf1[i]='0';}for(i=len_num2-len_num1+1;i<=len_num2;i++){tempbuf1[i]=str_num1[i-(len_num2-len_num1+1)];}for(i=1;i<=len_num2;i++){tempbuf2[i]=str_num2[i-1];}}//------------------------------------------else if(len_num2<len_num1){for(i=1;i<=(len_num1-len_num2);i++){tempbuf2[i]='0';}for(i=len_num1-len_num2+1;i<=len_num1;i++){tempbuf2[i]=str_num2[i-(len_num1-len_num2+1)];}for(i=1;i<=len_num1;i++){tempbuf1[i]=str_num1[i-1];}}}//====================================================================================================extern "C" __declspec(dllexport)void  Chen(char *tempbuf1,   char *tempbuf2 , char *result){char buf1[200]={0};char buf2[200]={0};Trans(tempbuf1,tempbuf2,buf1,buf2);strcpy(tempbuf1,buf1);strcpy(tempbuf2,buf2);int len=0;int i=0;int j=0;int n=0;int jinwei=0;while(tempbuf1[i]!='\0')  // 字符串长度{len++;i++;}int temp[200]={0};        // 该数组用来存储各次方的系数 10为底int max=2*len;for(i=0;i<=max;i++){if(i<len-1){for(j=0;(j<=len-1)&&(j>=i+1-len)&&(j<=i);j++){temp[i]+=((int)tempbuf1[len-1-j]-48 )*((int)tempbuf2[len-1-i+j]-48);  }temp[i]+=jinwei;if (temp[i]>=10)  //&&temp[i]<100{jinwei  = temp[i]/10;temp[i] = temp[i]%10;}else jinwei=0;}else if (i>=len-1){for(j=i-len+2;(j<=len-1)&&(j>=i+1-len)&&(j<=i);j++){temp[i]+=((int)tempbuf1[len-1-j]-48 )*((int)tempbuf2[len-1-i+j]-48);  }temp[i]+=jinwei;if (temp[i]>=10)  //&&temp[i]<100{jinwei  = temp[i]/10;temp[i] = temp[i]%10;}else jinwei=0;}}i=max;while(i>=0){if(temp[i]!=0)break;else i--;}//printf("str1 * str2= ");int num=i; // 科学计数法次数   /*for (j=num;j>=0;j--)   {    printf("%d",temp[j]);    }   printf("\t%d\n",num);*///===========================================memset(result,0,200);for(i=num;i>=0;i--){result[num-i]=(char)(temp[i]+48);}//printf("result = %s\t%d\n",result,strlen(result)-1);ThrowAway_0 (result);}//=====================================================================extern "C" __declspec(dllexport) void  ChenFang(char *tempbuf1,   int num, char *result)    // 大数乘方{static int count=0;if (count==0){char c[200]={'1',0,0};memset(result,0,200);Chen( tempbuf1 , c , result);}count++;if(num==1){return ;}    else if(num>1){Chen( tempbuf1 , result , result);if (strlen(result)>100){printf("超过100位!\n");printf("%d!\n\n",num);return ;}num--;        ChenFang(tempbuf1,num,result);}ThrowAway_0 (result);}//=================================================extern "C" __declspec(dllexport) void  Mod_Div(char *tempbuf1,   char *tempbuf2, char *mod_result , char *div_result )    // 大数求余{strcpy(tempbuf1,tempbuf1);strcpy(tempbuf2,tempbuf2);memset(mod_result,0,200);ThrowAway_0 (tempbuf1);ThrowAway_0 (tempbuf2);if (tempbuf2[0]=='0'){printf("除数不能为0!\n");return ;}int  max1 = strlen(tempbuf1);int  max2 = strlen(tempbuf2);int  temp=0;int  ret=1;int  count=0;char div[200]={0};char buf[200]={0};char buf1[200]={0}; //存放temp2 * bufchar AfterSub[200]={0};ret=Compare(tempbuf1,tempbuf2); if(ret==0)  //tempbuf1 =tempbuf2,取模就是 0 ,商就是1{strcpy (mod_result,"0");memset(div_result,0,sizeof(div_result));div_result[0]='1';return ;}if(ret==-1)  // tempbuf1 < tempbuf2 取模就是 tempbuf1 ,商就是0{   strcpy (mod_result,tempbuf1);ThrowAway_0 (mod_result);memset(div_result,0,200);div_result[0]='0';return ;}if(ret==1) // tempbuf1 > tempbuf2{ThrowAway_0(tempbuf1);ThrowAway_0(tempbuf2);buf[0]=(char)( ((int)tempbuf1[0]-48) / ((int)tempbuf2[0]-48+1) +48);for (int i=1;i<=max1-max2;i++){buf[i] = '0';}Chen(tempbuf2 ,buf , buf1);Sub (tempbuf1 ,buf1,AfterSub); memset(tempbuf1,0,200);strcpy(tempbuf1,AfterSub);ret=Compare(tempbuf1,tempbuf2);while(ret==1||ret==0)   // tempbuf1 > tempbuf2 ,继续减{    Sub (tempbuf1,tempbuf2,AfterSub);  memset(tempbuf1,0,200);strcpy (tempbuf1,AfterSub);ret=Compare(tempbuf1,tempbuf2);ThrowAway_0 (tempbuf1);ThrowAway_0 (tempbuf2); count++;if(count>=1000){itoa(count,div,10);Add(div_result,div,div_result);count=0;}}strcpy (mod_result,tempbuf1);ThrowAway_0 (mod_result);itoa(count,div,10);Add(div_result,div,div_result);Add(div_result ,buf , div_result);}}//========================================================extern "C" __declspec(dllexport) void Add(char *tempbuf1,   char *tempbuf2, char *result) // 大数相加 result = tempbuf1 + tempbuf2{char buf1[200]={0};char buf2[200]={0};Trans(tempbuf1,tempbuf2,buf1,buf2);strcpy(tempbuf1,buf1);strcpy(tempbuf2,buf2);int i=0;int temp=0;int jinwei=0;int len=0;while(tempbuf1[i]!='\0'){len++;i++;}for(i=len-1;i>=0;i--){   temp=(int)(tempbuf1[i]+tempbuf2[i]+jinwei-96);if(temp>=10){temp=temp-10;jinwei=1;}else jinwei=0;result[i]=(char)(temp+48);}ThrowAway_0 (result);}//================================================extern "C" __declspec(dllexport) void  ThrowAway_0 (char *tempbuf )  // 去除结果前面的 连续的无意义的 "0"{char buf[200]={0};int n = strlen(tempbuf)-1;int i=0;while(i<n){if (tempbuf[i]!='0'){break;}else {i++;}}int Throw = i;for (i=0;i<=n-Throw;i++){buf[i]=tempbuf[i+Throw];}strcpy(tempbuf,buf);}//=======================================================extern "C" __declspec(dllexport) void Sub(char *tempbuf1, char *tempbuf2, char *result)     // 大数相减 result = tempbuf1 - tempbuf2{ThrowAway_0 (tempbuf1);ThrowAway_0 (tempbuf2);memset(result,0,200);char buf1[200]={0};char buf2[200]={0};Trans(tempbuf1,tempbuf2,buf1,buf2);strcpy(tempbuf1,buf1);strcpy(tempbuf2,buf2);int i=0;int temp=0;int jiewei=0;int len=0;int ret=1;while(tempbuf1[i]!='\0')    // tempbuf1 和 tempbuf2 的长度相等{len++;i++;}ret = Compare(tempbuf1,tempbuf2);if(ret==1){for(i=len-1;i>=0;i--){  temp = (int)tempbuf1[i] - (int)tempbuf2[i] - jiewei;if (temp>=0){result[i]=(char)(temp+48);jiewei=0;}else if (temp<0){result[i]=(char)(temp+10+48);jiewei=1;}}ThrowAway_0 (result);}else if(ret==0) {memset(result,0,200);result[0]='0';}else if(ret==-1) {for(i=len-1;i>=0;i--){  temp = (int)tempbuf2[i] - (int)tempbuf1[i] - jiewei;if (temp>=0){result[i]=(char)(temp+48);jiewei=0;}else if (temp<0){result[i]=(char)(temp+10+48);jiewei=1;}}ThrowAway_0 (result);memset(buf1,0,200);sprintf(buf1,"-%s",result);strcpy(result,buf1);}}//======================================================================//===================================================================================extern "C" __declspec(dllexport) int Compare(char *tempbuf1,char *tempbuf2){ThrowAway_0 (tempbuf1);ThrowAway_0 (tempbuf2);char buf1[200]={0};char buf2[200]={0};Trans(tempbuf1,tempbuf2,buf1,buf2);memset(tempbuf1,0,200);memset(tempbuf2,0,200);strcpy(tempbuf1,buf1);strcpy(tempbuf2,buf2);int ret=1;int count=0;while(count<200){int m=(int)tempbuf1[count]-48;int n=(int)tempbuf2[count]-48;if(m==n){count++;ret=0;}else if(m>n){//printf("tempbuf1>tempbuf2\n");ret=1;break;}else if(m<n){//printf("tempbuf1<tempbuf2\n");ret=-1;break;}}return ret;}//=====================================================extern "C" __declspec(dllexport) bool NiYuan(char *str1 , char *str2 , char *result)  // str1^(-1) mod str2 = result{char To_Div[200]={0};   //保存每次的   除数char To_Div_ed[200]={0}; //保存每次的  被除数char Mod[200]={0};      //保存每次的   余数char Div[200][200]={0}; //保存每次的   商char X[200][200]={0};   //保存每次     X系数char Y[200][200]={0};   //保存每次     Y系数char ZERO[200]={'0'};int i=0;memset(result,0,sizeof(result));strcpy(To_Div_ed, str2);strcpy(To_Div   , str1);while (1) //得到各循环时的商{Mod_Div(To_Div_ed , To_Div , Mod , Div[i]);ThrowAway_0(Mod);if ( Mod[0]=='0' ){break;}ThrowAway_0(To_Div);strcpy(To_Div_ed , To_Div);strcpy(To_Div , Mod);i++;}int n=i;i=0;int t=1;X[n-1][0]='1';X[n][0]='0';for (i=0;i<n-1;i++){Chen(Div[n-1-i] , X[n-1-i] , Y[n-1-i]);Add (Y[n-1-i] , X[n-i] ,  Y[n-1-i]);ThrowAway_0(Y[n-1-i]);strcpy( X[n-2-i] , Y[n-1-i]);}Chen(Div[0] , X[0] , Y[0]);Add (Y[0]   , X[1] , Y[0]);ThrowAway_0(Y[0]);strcpy( result, Y[0]);return true;//以下两种方式效率低下/*char  YI[200]={'1',0};    char buf[200]={'1',0}; // 存放每次递增的测试值char buf_mod[200]={0};char buf_div[200]={0};char temp[200]={0};while (1){Chen(str2,buf,temp);Add(temp,YI,temp);Mod_Div(temp,str1,buf_mod,buf_div);ThrowAway_0 (buf_mod);if(strcmp(buf_mod,"0")==0){strcpy(result,buf_div);ThrowAway_0 (result);return true;}Add(buf,YI,buf);}return true;*//*Mod_Div(str2,str1,buf,buf);while(1){Chen(str1,buf,result);ThrowAway_0 (buf);ThrowAway_0 (str1);Mod_Div(result,str2,buf_mod,buf_div);ThrowAway_0 (buf_mod);if(strcmp(buf_mod,"1")==0){strcpy(result,buf);ThrowAway_0 (result);return true;}Add(buf,YI,buf);if(strlen(result)>50){printf("找不到逆元!\n");return false;}}*/}//==============================================extern "C" __declspec(dllexport) void ToHex(char *num , char *Hex){static int count = 0;char ToDiv[200] = "16";//char Yi[200] = "1";char str_mod[200]  = {0};    //每次的余数char str_div[200]  = {0};    //每次的商static char mod[200]  = {0}; //每次的余数的16进制char _num[200]  = {0};if (count==0){strcpy(_num,num);}Mod_Div(_num,ToDiv,str_mod,str_div);ThrowAway_0 (str_mod);ThrowAway_0 (str_div);int n_num = atoi(str_mod); switch(n_num){case 10:mod[count]='A';break;case 11:mod[count]='B';break;case 12:mod[count]='C';break;case 13:mod[count]='D';break;case 14:mod[count]='E';break;case 15:mod[count]='F';break;default:mod[count]=str_mod[0];break;}if( -1== Compare(str_div,ToDiv)) //结束的条件{count++;ThrowAway_0 (str_div);n_num = atoi(str_div); switch(n_num){case 10:mod[count]='A';break;case 11:mod[count]='B';break;case 12:mod[count]='C';break;case 13:mod[count]='D';break;case 14:mod[count]='E';break;case 15:mod[count]='F';break;default:mod[count]=str_div[0];break;}strcpy(Hex , mod);memset(str_div,0,sizeof(str_div));ReverseStr(Hex,str_div);memset(Hex,0,sizeof(Hex));strcpy(Hex,str_div);ThrowAway_0 (Hex);return ;}count++;memset(_num,0,200);strcpy(_num,str_div);ToHex(_num,Hex);}//==========================================extern "C" __declspec(dllexport) void ReverseStr(char *str, char *result){int count = strlen(str);int i = 0;for (i=0;i<count;i++){result[i] = str[count-1-i];}}//====================================extern "C" __declspec(dllexport) bool Is_Prime_Number(char *num){int  count=2;int  n_mod=0;int  n_temp=0;char YI[200]="1";char SHIWAN[200]="10000";char temp_num[200]={0};char buf[200]="2";char str_div[200]={0};char str_mod[200]={0};strcpy(temp_num,num); //暂存numint ret = -1;printf("----------------\n"); //测试++++++++++++++++++++++++++++++++++++++++++++++if (Compare(SHIWAN,temp_num)==1){ThrowAway_0 (temp_num);n_temp=atoi(temp_num);while(count<n_temp){n_mod=n_temp%count;if (n_mod==0){return false;}count++;}return true;}    else {while(ret==-1){memset(str_div,0,200);memset(str_mod,0,200);Mod_Div(temp_num,buf,str_mod,str_div);ThrowAway_0 (str_mod);if(str_mod[0]=='0')       // (strcmp(str_mod,"0") == 0) {return false;}memset(temp_num,0,200);strcpy(temp_num,num);Add(buf,YI,buf);printf("%s\t%s\t%s\t\n",temp_num,buf,str_mod);//测试++++++++++++++++++++++++++++++++++++++++++++++ThrowAway_0(buf);ThrowAway_0(YI);ret=Compare(buf,temp_num);}    printf("buf is: %s ----------------\n",buf);        return true;}}//WITNESS算法--判定大素数/*while(ret==-1){Chen(buf,buf,temp);Mod_Div(temp,temp_num,str_mod,str_mod); //不关心商if (strcmp(str_mod,"1") == 0) {return false;}Add(buf,YI,buf);ret=Compare(buf,temp_num);}return true;*/

二、RSA加密解密部分
基本代码:
void CRSADlg::OnEncrypt() // 加密文件内容{CString strPath="";char    buf[200]={0};char    EncryptedFile[200]={0};char    chenfang[200]={0};char    PubKey[1024]={0};char    PubKey_N[200]={0};char    PubKey_D[200]={0};CFileDialog FileDlg(TRUE , ".txt" , NULL , OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,                "dat file(*.dat)|*.dat|txt file(*.txt)|*.txt|all files(*.*)|*.*||",NULL);if( FileDlg.DoModal()==IDOK){strPath=FileDlg.GetPathName();}CFile PubKeyFile("PubKey.dat",CFile::modeRead);  // 解析并读出密钥PubKeyFile.Read(PubKey,1024);PubKeyFile.Close();CString str=PubKey;  int index1=str.Find('D');int index2=str.Find('N');CString temp1=str.Left(index2);                                  CString temp2=temp1.Mid(index1+3,index2-index1-1);strcpy(PubKey_D,temp2.GetBuffer(0));          //MessageBox(PubKey_E);temp1=str.Right(str.GetLength()-index2-3);  strcpy(PubKey_N,temp1.GetBuffer(0));  //MessageBox(PubKey_N);int ret=3;CFile PlainFile(strPath,CFile::modeRead);CFile File("Encrypted.dat",CFile::modeCreate |CFile::modeReadWrite );//while(ret==3){ret = PlainFile.Read(buf,3); //读出需要加密的文件内容MessageBox(buf);//ChenFang(buf,atoi(PubKey_E),chenfang);             //Mod_Div(chenfang,PubKey_N,EncryptedFile,EncryptedFile); //此处效率极低,换成下面这张种,实现在DLL中ChengFang_Mod(buf,PubKey_D,PubKey_N,EncryptedFile);//MessageBox(EncryptedFile);File.Write(EncryptedFile,strlen(EncryptedFile)+1);}PlainFile.Close();File.Close();MessageBox("Over !");}void CRSADlg::OnDecrypt() // 解密文件内容{CString strPath="";char    buf[200]={0};char    DecryptedFile[200]={0};char    chenfang[200]={0};char    PrivateKey[1024]={0};char    PrivateKey_N[200]={0};char    PrivateKey_E[200]={0};CFileDialog FileDlg(TRUE , ".txt" , NULL , OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,                    "dat file(*.dat)|*.dat|txt file(*.txt)|*.txt|all files(*.*)|*.*||",NULL);if( FileDlg.DoModal()==IDOK){strPath=FileDlg.GetPathName();}CFile PrivateKeyFile("PrivateKey.dat",CFile::modeRead); //读出密钥PrivateKeyFile.Read(PrivateKey,1024);PrivateKeyFile.Close();CString str=PrivateKey;  int index1=str.Find('D');int index2=str.Find('N');CString temp1=str.Left(index2);                                  CString temp2=temp1.Mid(index1+3,index2-index1-1);strcpy(PrivateKey_E,temp2.GetBuffer(0));          //MessageBox(PubKey_D);temp1=str.Right(str.GetLength()-index2-3);  strcpy(PrivateKey_N,temp1.GetBuffer(0));  //MessageBox(PubKey_N);CFile PlainFile(strPath,CFile::modeRead);CFile File("Encrypted.dat",CFile::modeCreate |CFile::modeReadWrite );int ret=4;while(ret==4){ret = PlainFile.Read(buf,4); //读出需要加密的文件内容//MessageBox(buf);//enFang(buf,atoi(PrivateKey_D),chenfang);//d_Div(chenfang,PrivateKey_N,DecryptedFile,EncryptedFile);//此处效率极低,换成下面这张种,实现在DLL中ChengFang_Mod(buf,PrivateKey_E,PrivateKey_N,DecryptedFile);File.Write(DecryptedFile,strlen(DecryptedFile)+1);}PlainFile.Close();File.Close();}void CRSADlg::OnSignatul()  // 进行数字签名{}void CRSADlg::OnRenzheng() // 验证数字签名{}void CRSADlg::OnQuit() // 退出程序{PostQuitMessage(1);}void CRSAInit::OnCreateP() //生成大素数 P{//SetDlgItemText(IDC_EDIT_P,"正在生成....请等待");//UpdateData(FALSE);//Invalidate();char ch_rand[200]={0};char buf[256]={0};while(1){srand( (unsigned)time( NULL ) );for (int i=0;i<KEYLENGTH;i++){ch_rand[i]=(char)(rand()%10+48);}if ((int)(ch_rand[KEYLENGTH-1]-48)%2==0){continue;}ThrowAway_0(ch_rand);bool ret=Is_Prime_Number(ch_rand);if (ret==true){//sprintf(buf,"%s \n是素数!",ch_rand);//MessageBox(buf);SetDlgItemText(IDC_EDIT_P,ch_rand);memset(m_P,0,200);strcpy(m_P,ch_rand);return ;}//else sprintf(buf,"%s \n不是素数!",ch_rand);}}void CRSAInit::OnCreateQ() //生成大素数 Q{//SetDlgItemText(IDC_EDIT_Q,"正在生成....请等待");//UpdateData(FALSE);char ch_rand[200]={0};char buf[256]={0};memset(m_Q,0,200);while(1){srand( (unsigned)time( NULL ) );for (int i=0;i<KEYLENGTH;i++){ch_rand[i]=(char)(rand()%10+48);}if ((int)(ch_rand[KEYLENGTH-1]-48)%2==0){continue;}ThrowAway_0(ch_rand);if (strlen(ch_rand)<KEYLENGTH){memset(ch_rand,0,200);continue;}bool ret=Is_Prime_Number(ch_rand);if (ret==true){//sprintf(buf,"%s \n是素数!",ch_rand);//MessageBox(buf);SetDlgItemText(IDC_EDIT_Q,ch_rand);strcpy(m_Q,ch_rand);return ;}//else sprintf(buf,"%s \n不是素数!",ch_rand);}}void CRSAInit::OnCreateN() //生成 N=P*Q{if (strlen(m_P)<1){MessageBox("请先生成P");}if (strlen(m_Q)<1){MessageBox("请先生成Q");}Chen(m_P , m_Q , m_N);SetDlgItemText(IDC_EDIT_N,m_N);UpdateData(FALSE);}void CRSAInit::OnCreateFi() // 计算 FI(n)=(P-1)*(Q-1);                                                        {char temp1[200]={0};char temp2[200]={0};char YI[200]="1";Sub(m_P , YI , temp1);      Sub(m_Q , YI , temp2);Chen(temp1 , temp2 , m_FI);SetDlgItemText(IDC_EDIT_FI,m_FI);UpdateData(FALSE);}void CRSAInit::OnCreateE() //生成私钥 E{char ch_rand[200]={0};char buf[256]={0};memset(m_E,0,200);while(1){srand( (unsigned)time( NULL ) );for (int i=0;i<KEYLENGTH-1;i++){ch_rand[i]=(char)(rand()%10+48);}if ((int)(ch_rand[KEYLENGTH-2]-48)%2==0){continue;}ThrowAway_0(ch_rand);bool ret=Is_Prime_Number(ch_rand);if (ret==true){//sprintf(buf,"%s \n是素数!",ch_rand);//MessageBox(buf);SetDlgItemText(IDC_EDIT_E,ch_rand);strcpy(m_E,ch_rand);return ;}}}void CRSAInit::OnCreateD() //生成公钥的 D{memset(m_D,0,200);NiYuan(m_E , m_FI , m_D);SetDlgItemText(IDC_EDIT_D,m_D);UpdateData(FALSE);}void CRSAInit::OnSavepubkey()    // 保存公钥{CFile file("PubKey.dat",CFile::modeCreate |CFile::modeReadWrite );char  buf[1000]={0};sprintf(buf , "publickey:\r\nD: %s\r\nN: %s",m_D,m_N);file.Write(buf,strlen(buf)+1);file.Close();}void CRSAInit::OnSaveprivatekey() //保存私钥{CFile file("PrivateKey.dat",CFile::modeCreate |CFile::modeReadWrite );char  buf[1000]={0};sprintf(buf , "privatekey:\r\nE: %s\r\nN: %s",m_E,m_N);file.Write(buf,strlen(buf)+1);file.Close();}void CRSAInit::OnOver()  //生成密钥完成{CDialog::OnOK();}void CRSAInit::OnCancel() {CDialog::OnCancel();}


部分代码待完善

原创粉丝点击