一、运算基础(大数相乘、取模、乘方、素数判定等)
为了方便,封装在一个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 + tempbuf2
extern "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 * tempbuf2
void Trans (char *str_num1, char *str_num2, char *tempbuf1, char *tempbuf2); // 大数转化为等长,且最前面添加 “0”
extern "C" __declspec(dllexport) // 大数除法 div_result = tempbuf1 / tempbuf2
void 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 ^ num
extern "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 = result
extern "C" __declspec(dllexport)
void ToHex(char *num , char *Hex); //大数转换成16进制
extern "C" __declspec(dllexport)
void ReverseStr(char *str , char *result); // 字符串str 逆序输出到 result
extern "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 * buf
char 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); //暂存num
int 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();
}
部分代码待完善