php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 327|回复: 0

RSA 算法

[复制链接]

2945

主题

2955

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7472
贡献
0
注册时间
2021-4-14
最后登录
2024-10-7
在线时间
730 小时
QQ
发表于 2023-11-16 20:29:23 | 显示全部楼层 |阅读模式
  1. #include <iostream.h>
  2. #include <math.h>
  3. long code(long m,long e,long n)//-----------加解密函数:用c=m^e(modn)加密,用m=c^d(modn)解密
  4. { long c=1;
  5.   e=e+1;
  6.   while(e!=1)
  7.   {
  8.     c=c*m;
  9.     c=c%n;
  10.     e--;
  11.   }

  12.   return c;
  13. }
  14. int gcd(long a,long b)//--------------------判断两个数是否互素
  15. {
  16.         long r0=a;
  17.         long r1=b;
  18.         int q,temp;
  19.         while(r1!=0)
  20.         {
  21.                 q=r0/r1;
  22.                 temp=r0;
  23.                 r0=r1;
  24.                 r1=temp-q*r1;
  25.         }
  26.         if(r0==1)//------------------------------最大公因数为1时两数互素
  27.         return 1;            
  28.         else return 0;        
  29. }


  30. long privatekey(long a,long b)//-------------用欧几里德算法求私钥d
  31.    
  32. {
  33.         long r,r1=1;
  34.         long r0=b;
  35.         long s0,t0,e,s1,q,temprivatekey;
  36.         r1=a;
  37.         t0=0;
  38.         e=1;
  39.         s0=1;
  40.         s1=0;
  41.         q=r0/r1;
  42.         r=r0-q*r1;
  43.         while(r>0)         
  44.         {
  45.                 temprivatekey=t0-q*e;
  46.             t0=e;
  47.                 e=temprivatekey;
  48.                 temprivatekey=s0-q*s1;
  49.                 s0=s1;
  50.                 s1=temprivatekey;
  51.                 r0=r1;
  52.                 r1=r;
  53.                 q=r0/r1;
  54.                 r=r0-q*r1;
  55.         }
  56.         while(e<0)
  57.         {
  58.                 e=e+b;
  59.         }
  60.         return e;   
  61. }
  62. void main()//----------------------------------------主函数
  63. {
  64. long p,q,e,d,m,n,t;
  65.   
  66.   cout<<"请输入两个素数 p,q: ";
  67.   cin>>p>>q;
  68.   
  69.   n=p*q;
  70.   cout<<"n为 :"<<n<<endl;
  71.   t=(p-1)*(q-1);//------------------------------------欧拉函数值
  72.   cout<<"n的欧拉函数值 :"<<t<<endl;
  73.   cout<<"请输入公钥e: ";
  74.   cin>>e;//-------------------------------------------输入公钥e,满足t>e>1
  75. int u;
  76. u=gcd(e,t);//----------------------------------------判断e是否与n的欧拉函数值互素
  77.   if(1<e&&e<t&&u==0)
  78.   {
  79.      cout<<"请重新输入: ";
  80.      cin>>e;
  81.   }
  82. int w;
  83. cout<<"输入1加密,输入2解密:";
  84. cin>>w;
  85. switch(w)//--------------------------------------------w为1时加密,为2时解密
  86. {
  87. case 1 ://----------------------------------------------加密
  88. {
  89.             cout<<"请输入明文:";
  90.         cin>>m;//---------------------------------------输入明文
  91.         if(m<=n)
  92.         cout<< "密文为:"<<code(m,e,n)<<endl;//----------明文数值小于n时直接加密
  93.         else
  94.          {
  95.             long i=0,g,h;
  96.         g=n;
  97.             h=m;
  98.    while(g!=0)//----------------------------------------求n的长度
  99.          {
  100.       g/=10;
  101.       i++;
  102.          }
  103.          long j=0;
  104.    while(h!=0)//----------------------------------------求明文长度
  105.         {
  106.       h/=10;
  107.       j++;
  108.         }
  109.     long x=0,long c[1000];//-----------------------------数组c用来存放加密后的各个分组
  110.         int k=0;//-------------------------------------------k将记录明文分的组数
  111.    while(j!=0)
  112.    {
  113.      x=m/pow(10,j-i);
  114.      if(x>n)
  115.          {
  116.       x=x/10;
  117.       c[k]=code(x,e,n);
  118.       m=m-x*pow(10,j-i+1);
  119.       j=j-1;
  120.           k++;
  121.          }
  122.    else
  123.    {
  124.         c[k]=code(x,e,n);
  125.     m=m-x*pow(10,j-i);
  126.     j=j-2;
  127.         k++;
  128.    }
  129.    if(i>j)//----------------------------------------------最后一个分组的长度小于n的长度时直接加密

  130.           c[k]=code(m,e,n);
  131.    }
  132.    cout<<"密文输出:";
  133.    for(long l=0;l<k;l++)
  134.            cout<<c[l];
  135.    cout<<endl;
  136.    }
  137.          break;
  138.          }
  139. case 2 ://------------------------------------------------解密
  140.         {
  141.                 cout<<"请输入密文:"<<endl;
  142.                 cin>>m;
  143.             long d;
  144.        d=privatekey(e,t);
  145.            if(m<=n)
  146.    cout<< "密文为:"<<code(m,d,n)<<endl;
  147.   else
  148.    {
  149.          long i=0,g,h;
  150.      g=n;
  151.          h=m;
  152.      while(g!=0)
  153.          {
  154.       g/=10;
  155.       i++;
  156.          }
  157.          long j=0;
  158.     while(h!=0)
  159.         {
  160.       h/=10;
  161.       j++;
  162.         }
  163.      
  164.         long x=0,long c[1000];
  165.         int k=0;
  166.    while(j!=0)
  167.    {
  168.      x=m/pow(10,j-i);
  169.    
  170.      if(x>n)
  171.          {
  172.       x=x/10;
  173.       c[k]=code(x,d,n);
  174.       m=m-x*pow(10,j-i+1);
  175.       j=j-1;
  176.           k++;
  177.          }
  178.    else
  179.    {
  180.           c[k]=code(x,d,n);
  181.     m=m-x*pow(10,j-i);
  182.     j=j-2;
  183.         k++;
  184.    }
  185.    if(i>j)

  186.           c[k]=code(m,d,n);
  187.    }
  188.    for(long l=0;l<k;l++)

  189.    cout<<c[l];
  190.    cout<<endl;
  191.   }
  192.    break;
  193.         }
  194.        
  195. }

  196. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-10-8 07:03 , Processed in 0.088046 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表