电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2355 人浏览分享

RSA算法编写

[复制链接]
2355 0
实验内容

使用编程语言实现RSA加解密算法。
代码要求如下:
1、定义一个专门用于加解密操作的函数;
2、应可以判断e取值的正确性,若错误要求重新输入;e的取值会影响d,d不能为负数
3、应可以选择进行加密操作还是解密操作。

密钥生成

选取两互异大素数:p和q
计算 N=p×q 和j(N)=(p-1) ·(q-1)
选一整数e:1< e<j(N), gcd(j(N), e)=1
在模j(N)下 计算e的乘法逆元d:
e · d = 1   mod j(N)
公钥pk= N, e 私钥sk=d

加解密

公钥pk=(N, e),私钥sk=d:
加密E(pk, M):给定一个整数 M<N,计算
     C = E(pk, M)= Me  mod N
解密D(sk, C):
    M = D(sk, C) = Cd  mod N

一个例子

Bob计算(pkB, skB)
取 p=7, q=17, N=p×q=119
j(N)= (p-1) × (q-1) = 6 X 16= 96
取 e=5, 计算d=77
公钥:pkB = (e, N)=(5, 119)
私钥:skB= 77
Alice 知道 pkB = (e, N)=(5, 119)
Bob 知道 (pkB, skB)

Alice 使用 pkB = (e, N)=(5, 119) 加密
明文 m=19;
计算密文 c= me mod N
                = 195 mod 119
                =  66
把密文 66发送给Bob
Bob收到 密文66 后:
利用自己的公私钥对:
                pkB = (e, N)=(5, 119), skB = 77
计算 明文m = 6677 mod 119
                   = 19
下面开始编写代码,是C++的:
代码:
  1. #include<iostream>
  2. using namespace std;
  3. int cgyjia(int a, int b,int c)
  4. {
  5.              int r=1;
  6.              while(b!=0){
  7.                  r=r*a;
  8.                  r=r%c;
  9.                  b--;}
  10. return r;
  11. }
  12. cgyjie(int a, int b,int c)
  13. {

  14.              int r=1;
  15.              while(b!=0){
  16.                  r=r*a;
  17.                  r=r%c;
  18.                  b--;}
  19. return r;
  20. }
  21. int main()
  22. {
  23. int p,q,n,n1,t,e;
  24. cout<<"请输入p和q:";
  25. cin>>p>>q;
  26. n=p*q;
  27. t=(p-1)*(q-1);
  28. cout<<"n的值为"<<n<<",t的值为"<<t<<endl;
  29. cout<<"请输入e的值"<<endl;
  30. cin>>e;
  31. while(e<1||e>t||t%e!=1)
  32.   {
  33.             cout<<"e 的值不符合要求,请重新输入:";
  34.             cin>>e;
  35.    }
  36. int d=1;
  37. while(((e*d)%t)!=1)  d++;
  38. cout<<"d的值为:"<<d<<endl;
  39. while(d<0)
  40.          {
  41.         cout<<"e 的值不符合要求,请重新输入:";
  42.               cin>>e;
  43.                    d=1;
  44.               while(((e*d)%t)!=1)   d++;
  45.          }
  46. cout<<"加密起码输1,解密请输入2"<<endl;
  47. cin>>n1;
  48. if(n1==1)
  49. {
  50. int m,ja;
  51. cout<<"请输入M"<<endl;
  52. cin>>m;
  53. ja=cgyjia(m,e,n);
  54. cout<<"加密后的密文为:"<<ja<<endl;
  55. }
  56. else
  57. {
  58. int c,je;
  59. cout<<"请输入C"<<endl;
  60. cin>>c;
  61. je=cgyjie(c,d,n);
  62. cout<<"解密后的明文为:"<<je<<endl;

  63. }
  64. return 0;
  65. }
复制代码

结果:

195944j98ilifu3z9zurg9.png

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

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.