我是个VC 的菜鸟 仅限于对 字符的加密
大家给我说说什么地方不好 ,谢谢!!!
[此贴子已经被作者于2006-3-16 12:26:34编辑过]
我是个VC 的菜鸟 仅限于对 字符的加密
大家给我说说什么地方不好 ,谢谢!!!
[此贴子已经被作者于2006-3-16 12:26:34编辑过]
int prime_num(int cout) //产生大素数函数
{
int i=0,n=0,a=0;
int s[1000]; //s[i]为 1 时该数不为素数。
for(i=1;i<=cout;i++)s[i]=0; //赋初值。
for(n=4;n<=cout;n+=2) //对除2外的偶数位数组赋1
{
s[n]=1;
}
for(i=3;i<=cout/2;i+=2) //对奇数的倍数判断是否为素数。
{
if(s[i])continue; //s[i]为 1 时继续循环。
for(n=i+i;n<=cout;n+=i) //对通过了if语句的奇数执行;将它们的倍数的项赋值为 1。
{
s[n]=1;
}
}
for(i=2,n=0;i<=cout;i++)
{
if(s[i]==0) //s[i]为0的对应的 i 是素数。
{
a=i; //将素数i赋值给啊
n++;
}
} //最后将 cout 内最大的素数赋给a。
return a;
}
void CRSADlg::OnButton1N()
{
// TODO: Add your control notification handler code here
int mm_p,mm_q;
srand((unsigned)time(NULL)); //产生随机数的函数的前提。
mm_p=rand()%200+1; //产生随机数的格式 rand()%n。
mm_q=rand()%200+1;
//m_p对应 p,m_q对应 q.
m_p=prime_num(mm_p); //调用素数产生函数。
m_q=prime_num(mm_q);
m_n=m_p*m_q; //m_n对应 n,得到n=p*q;
m_o=(m_p-1)*(m_q-1); //m_o对应 偶拉函数。
UpdateData(false);
}
void CRSADlg::OnButton1E()
{
// TODO: Add your control notification handler code here
UpdateData(true);
int m,n,temp;
int i,A[3],B[3],C[3],Q;
//m=m_e;
//m_Pk=m;
if(m_e>m_o)
{
MessageBox("你输入的e大于了欧拉值");
}
else
{
m=m_o;
n=m_e;
while(n!=0&&n!=1)//测验e是否与偶拉函数互素。
{ //用辗转相除法得到。
temp=m%n;
m=n;
n=temp;
}
if(n==0)
{
MessageBox("你输入的e不与欧拉值互素");
}
if(n==1)////根据计算一个数的逆元的步骤。
{
MessageBox("你输入的e通过验证");
A[0]=1;
A[1]=0;
A[2]=m_o;
B[0]=0;
B[1]=1;
B[2]=m_e;
while(B[2]!=0&&B[2]!=1)//求逆元
{
Q=A[2]/B[2];
for(i=0;i<3;i++)
C[i]=A[i]-Q*B[i];
for(i=0;i<3;i++)
A[i]=B[i];
for(i=0;i<3;i++)
B[i]=C[i];
}
if(B[2]==0)
MessageBox("你输入的e与欧拉值没有逆元,请重新输入");
if(B[2]==1)
{
m_d=(B[1]+m_o)%m_o; //得到密钥d,它对应的是m_d。
}
}
}
UpdateData(false);
}
void CRSADlg::OnBUTTON1PkSk()
{
// TODO: Add your control notification handler code here
UpdateData(true);
//显示出公钥(e,n)和私钥(d,n)。
m_Pk.Format("(e,n)=(%d,%d) ",m_e,m_n);
m_Sk.Format("(d,n)=(%d,%d) ",m_d,m_n);
UpdateData(false);
}
void CRSADlg::OnEncrypt() //明文加密。
{
// TODO: Add your control notification handler code here
UpdateData(true);
unsigned long int C,M;
int i,j,k,len,n=0;
int p,q;
char ch;
char ch1[1000];//存储密文字符。
k=0;
for(i=0;i<100;i++)
{
cun[i]=0;
//cun[i]为定义的类的public变量,用于存储每个字符加密后的密文自负个数。
}
for(i=0;i<1000;i++)
{
ch1[i]='\0';
}
len=m_m.GetLength(); //得到明文的长度。
for(i=0;i<len;i++)
{
ch=m_m.GetAt(i);
//从文本框Edit中提取第i个字符,它的函数是GetAt(i)。
M=(int)ch;
C=1;
for(j=0;j<m_e;j++)//求每个明文的密文的数值C。
C=(C*M)%m_n; //用每个C模n后再乘C再赋值给C,用定理得到。
p=q=C;
if(q==0)
{
ch1[k]=(char)q;
k++;
cun[n]++;
n++;
}
//由于算出的C的值很大系统无法运算,
//将C分为2位一个的数并且将其转化为字符存入ch1[]中
while(q!=0)
{
p=q%100;
q=q/100;
ch1[k]=(char)p;
k++;
//j--;
cun[n]++;
}
n++;
//ch1[k]=' ';
//k++;
}
m_c=ch1; //将密文赋给m_c显示出来。
UpdateData(false);
}
void CRSADlg::OnJimi() //解密。
{
// TODO: Add your control notification handler code here
UpdateData(true);
int i,j,l,n=0;
int len1;
char ch[100];//存储明文字符。
unsigned long int M1,C1;
for(i=0;i<100;i++)
{
ch[i]='\0';
}
len1=m_c.GetLength();
//m_ppppp=cun[0];
for(i=0;i<len1;)
{
C1=0;
for(j=i;j<i+cun[n];j++)
{
C1+=((int)m_c.GetAt(j))*((int)pow(100,j-i)); //计算每个字符对应的密文的值C1。
}
M1=1;
for(l=0;l<m_d;l++) //求每个密文的明文的数值M1。
M1=(M1*C1)%m_n; //用每个M1模n后再乘M1再赋值给M1,用定理得到。
ch[n]=(char)M1; //将明文字符赋给ch[]。
i+=cun[n]; //每个明文字符对应了cun[i]个密文字符,所以用i+=cun[i]。
n++;
}
m_jm=ch; //将密文赋给m_jm显示出来。
UpdateData(false);
}
void CRSADlg::OnButton1()
{
// TODO: Add your control notification handler code here
CDialog::DestroyWindow();
}