RSA加/解密算法——gmp大数库C++实现

gmp库c++接口的资料,网络上相对较少,说几乎没有更准确些,很多人想学习也没有资料,今天小生给出一个RSA 的gmpxx实现,写的不好,忘批评指正。

gmpxx.h对的接口很少,很多函数没有封装,所以代码会有些长,有时间自己封装再上传来,废话不多说,上代码。


#include <iostream>
#include <gmpxx.h>
#include <cstdlib>

using namespace std;

mpz_class randbits(int bits) //base = 2
{
    gmp_randclass a(gmp_randinit_default);
    a.seed(rand());
    mpz_class l(bits);
    return a.get_z_bits(l);
}

inline mpz_class randprime(int bits)
{
    mpz_class a = randbits(bits);
    mpz_class ret;
    mpz_nextprime(ret.get_mpz_t(),a.get_mpz_t());
    return ret;
}

void setKey(mpz_class &n, mpz_class &e, mpz_class &d,const int nbits,int ebits=16)
{
    if(nbits/2<=ebits) {
        ebits = nbits/2;
    }
    mpz_class p = randprime(nbits/2);
    mpz_class q = randprime(nbits/2);
    n = q*p;
    mpz_class fn = (p-1)*(q-1);
    mpz_class gcd;
    do{
        e = randprime(ebits);
        mpz_gcd(gcd.get_mpz_t(),e.get_mpz_t(),fn.get_mpz_t());
    }while(gcd!=1);
    mpz_gcdext(p.get_mpz_t(),d.get_mpz_t(),q.get_mpz_t(),e.get_mpz_t(),fn.get_mpz_t());
}

inline mpz_class encrypt(const mpz_class &m,const mpz_class &e,const mpz_class &n)
{
    mpz_class ret;
    mpz_powm(ret.get_mpz_t(),m.get_mpz_t(),e.get_mpz_t(),n.get_mpz_t());
    return ret;
}

inline mpz_class decrypt(const mpz_class &c,const mpz_class &d,const mpz_class &n)
{
    return encrypt(c,d,n);
}

int main()
{
    int nbits;
    cout<<"输入大数比特数:";
    cin>>nbits;
    mpz_class n,e,d;
    setKey(n,e,d,nbits);
    cout<<"公钥:("<<e.get_str()<<", "<<n.get_str()<<")"<<endl;
    cout<<"私钥:("<<d.get_str()<<", "<<n.get_str()<<")"<<endl;

    cout<<"输入加密数据:";
    string s;
    cin>>s;

    mpz_class m(s);
    mpz_class c;
    c = encrypt(m,e,n);
    cout<<"加密后:"<<c.get_str()<<endl;
    c = decrypt(c,d,n);
    cout<<"解密后:"<<c.get_str()<<endl;
    if (c==m) cout<<"加/解密成功!"<<endl<<endl;
     else cout<<"加/解密失败!"<<endl<<endl;

    string q;
    cout<<"是否继续(Y/N):";
    cin>>q;
    if(q=="y"||q=="Y")
        main();
    return 0;
}

运行示例:

输入大数比特数:333
公钥:(41609, 5235823573856100980829702379838171035594853361913386143766165746731918525312184303057207029921017173)
私钥:(-30602809323987689166713

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值