我是个VC 的菜鸟  仅限于对 字符的加密 
大家给我说说什么地方不好  ,谢谢!!!
[此贴子已经被作者于2006-3-16 12:26:34编辑过]
我是个VC 的菜鸟  仅限于对 字符的加密 
大家给我说说什么地方不好  ,谢谢!!!
[此贴子已经被作者于2006-3-16 12:26:34编辑过]
 2006-03-02 22:22
	    2006-03-02 22:22
  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();
}

 2006-03-02 22:26
	    2006-03-02 22:26
   2006-03-02 22:35
	    2006-03-02 22:35
   2006-03-02 22:37
	    2006-03-02 22:37
   2006-03-02 22:55
	    2006-03-02 22:55
   2006-03-02 23:16
	    2006-03-02 23:16
  我看明白了,觉得挺好。
 2006-05-31 18:36
	    2006-05-31 18:36
   2006-06-01 08:37
	    2006-06-01 08:37
  为什么中文就不能加密呢?
 2006-06-24 22:42
	    2006-06-24 22:42
  很好啊,思路很清晰!
[此贴子已经被作者于2007-4-26 9:42:23编辑过]
 2007-04-26 09:42
	    2007-04-26 09:42