用户
搜索

[web安全] RSA算法编写

  • TA的每日心情
    开心
    昨天 07:36
  • 签到天数: 101 天

    连续签到: 101 天

    [LV.6]常住居民II

    i春秋-见习白帽

    Rank: 3Rank: 3

    44

    主题

    91

    帖子

    2578

    魔法币
    收听
    0
    粉丝
    4
    注册时间
    2020-10-2
    发表于 2021-5-19 19:55:11 02235
    本帖最后由 Johnson666 于 2021-5-19 20:01 编辑

    实验内容
    使用编程语言实现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++的:
    代码:
    [AppleScript] 纯文本查看 复制代码
    #include<iostream>
    
    using namespace std;
    
    int cgyjia(int a, int b,int c)
    
    {
    
                 int r=1;
    
                 while(b!=0){
    
                     r=r*a;
    
                     r=r%c;
    
                     b--;}
    
    return r;
    
    }
    
    cgyjie(int a, int b,int c)
    
    {
    
                 int r=1;
    
                 while(b!=0){
    
                     r=r*a;
    
                     r=r%c;
    
                     b--;}
    
    return r;
    
    }
    
    int main()
    
    {
    
    int p,q,n,n1,t,e;
    
    cout<<"请输入p和q:";
    
    cin>>p>>q;
    
    n=p*q;
    
    t=(p-1)*(q-1);
    
    cout<<"n的值为"<<n<<",t的值为"<<t<<endl;
    
    cout<<"请输入e的值"<<endl;
    
    cin>>e;
    
    while(e<1||e>t||t%e!=1)
    
      {
    
                cout<<"e 的值不符合要求,请重新输入:";
    
                cin>>e;
    
       }
    
    int d=1;
    
    while(((e*d)%t)!=1)  d++;
    
    cout<<"d的值为:"<<d<<endl;
    
    while(d<0)
    
             {
    
            cout<<"e 的值不符合要求,请重新输入:";
    
                  cin>>e;
    
                       d=1;
    
                  while(((e*d)%t)!=1)   d++;
    
             }
    
    cout<<"加密起码输1,解密请输入2"<<endl;
    
    cin>>n1;
    
    if(n1==1)
    
    {
    
    int m,ja;
    
    cout<<"请输入M"<<endl;
    
    cin>>m;
    
    ja=cgyjia(m,e,n);
    
    cout<<"加密后的密文为:"<<ja<<endl;
    
    }
    
    else
    
    {
    
    int c,je;
    
    cout<<"请输入C"<<endl;
    
    cin>>c;
    
    je=cgyjie(c,d,n);
    
    cout<<"解密后的明文为:"<<je<<endl;
    
    }
    
    return 0;
    
    }
    
     

    结果:

    QQ图片20210519195918.png




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