开发者社区> 问答> 正文

C++程序 可以执行RSA 加密解密算法 可以给我吗

不能留邮箱

展开
收起
知与谁同 2018-07-21 15:10:21 2839 0
3 条回答
写回答
取消 提交回答
  • 胜天半子
    我有,不过我用到第三方库,OpenSSL,可以吗。
    2019-07-17 22:56:47
    赞同 展开评论 打赏
  • #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<ctime>
    #define gcc 10007
    #define MAX ((INT)1<<63)-1
    using namespace std;

    typedef unsigned long long INT;
    INT p[10]={2,3,5,7,11,13,17,19,23,29};
    inline INT gcd(INT a,INT b)
    {
    INT m=1;
    if(!b) return a;
    while(m)
    {
    m=a%b;
    a=b;
    b=m;
    }
    return a;
    }

    //计算a*b%n

    inline INT multi_mod(INT a,INT b,INT mod)
    {
    INT sum=0;
    while(b)
    {
    if(b&1) sum=(sum+a)%mod;
    a=(a+a)%mod;
    b>>=1;
    }
    return sum;
    }

    //计算a^b%n;

    inline INT quickmod(INT a,INT b,INT mod)
    {
    INT sum=1;
    while(b)
    {
    if(b&1) sum=multi_mod(sum,a,mod);
    a=multi_mod(a,a,mod);
    b>>=1;
    }
    return sum;
    }

    bool miller_rabin(INT n)
    {
    INT i,j,k=0;
    INT u,m,buf;
    //将n分解为m*2^k
    if(n==2)
    return true;
    if(n<2||!(n&1))
    return false;
    m=n-1;
    while(!(m&1))
    k++,m>>=1;
    for(i=0;i<9;i++)
    {
    if(p[i]>=n)
    return true;
    u=quickmod(p[i],m,n);
    if(u==1)
    continue;
    for(j=0;j<k;j++)
    {
    buf=multi_mod(u,u,n);
    if(buf==1&&u!=1&&u!=n-1)
    return false;
    u=buf;
    }
    //如果p[i]^(n-1)%n!=1那么n为合数
    if(u-1)
    return false;
    }
    return true;
    }
    INT extended_euclidean(INT n, INT m, INT &x, INT &y) {
    if (m == 0) {
    x = 1; y = 0; return n;
    }
    INT g = extended_euclidean(m, n % m, x, y);
    INT t = x - n / m * y;
    x = y;
    y = t;
    return g;
    }
    INT invmod(INT a,INT n)//求a对n的乘法逆元
    {
    INT x,y;
    if(extended_euclidean(a,n,x,y)!=1) return -1;
    return (x%n+n)%n;
    }
    void fff(char *str,INT *x){
    INT t=0;
    INT i,j=0;
    for(i=0;i<strlen(str);i++){
    t=t*10+str[i]-'0';
    if(i%2==1){
    x[j]=t;
    j++;
    t=0;
    }
    }
    if(i%2) x[j]=t;
    }
    void rsa(INT *m,INT e,INT n){
    for(INT i=0;i<100;i++)
    m[i]=quickmod(m[i],e,n);
    }
    INT ranprim(){
    INT p=0;
    while(1){
    p=(rand()%1000)+1000;
    if(miller_rabin(p))
    return p;
    }

    }
    int main(){

    srand((unsigned)time(NULL));
    INT p,q,e,n,d,x;
    do{
    p=ranprim();
    q=ranprim();
    e=ranprim();
    n=p*q;
    d=invmod(e,(p-1)*(q-1));
    x=(e*d)%((p-1)*(q-1));
    }while(x!=1);
    cout<<"p:"<<p<<" q:"<<q<<" e:"<<e<<" d:"<<d<<" n:"<<n<<endl;
    char str[100];
    int t;
    INT m[100];
    memset(m,0,sizeof(m));
    while(scanf("%s",str)!=EOF){
    t=(strlen(str)+1)/2;
    fff(str,m);
    rsa(m,e,n);
    for(int i=0;i<t;i++)
    printf("%d ",m[i]);
    printf("\n");
    rsa(m,d,n);
    for(int i=0;i<t;i++)
    printf("%d ",m[i]);
    printf("\n");
    }
    }
    我昨天刚给老师查的,没问题。输入数字,对数字加密。加密过程是两位一组。
    2019-07-17 22:56:47
    赞同 展开评论 打赏
  •  RSA加密、解密算法的C++实现(可以在VC6.0上运行): #include<iostream> #include<cmath>
    using namespace std;
    #define MAXLENGTH 500 //明文最大长度,即所允许最大整数个数
    int size = 0;//保存要进行加密的正整数的个数 int p, q; //两个大素数
    int n, phi; //n = p * q,phi = (p-1) * (q-1) 是n的欧拉函数值 int e; //{e, n}为公开密钥 int d; //{d, n}为秘密密钥
    int clear[MAXLENGTH], Ciphertext[MAXLENGTH];//分别用于存放加//密前的明//文和加密后的密文
    int DecryptionText[MAXLENGTH];//存放解密后的明文
    //以下为加密算法void Encryption() {//加密算法cout << " 请输入两个较大的素数:" ; cin >> p >> q ;cout << " p = " << p << ", q = " << q << endl; n = p * q;//求解 n,phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值 cout << " n = " << n << ", p非对称加密、解密算法RSA的C++实现_word文档在线阅读与下载_免费文档http://www.mianfeiwendang.com/doc/d83ae21a26eb0ef2373b3572/3hi = " << phi << endl; cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 互素的数 e:";cin >> e; float d0;
    for( int i = 1; ; i++){///求解乘法逆元 
    e * d ≡ 1 (mod phi) d0 = (float)(phi*i+1) / e; 
    if( d0 - (int)d0 == 0 )}d = (int)d0; cout << endl;cout << " e = " << e << ", d = " << d << endl;cout << " 公开密钥 Pk = {e,n} = {" << e << "," << n << "}" << endl; cout << " 秘密密钥 Sk = {d,n} = {" << d << "," << n << "}" << endl; cout << endl;cout << " 请输入要加密的小于 " << n << " 正整数(以-1结束):" << endl; cout << " 加密前的明文为:"; for( i = 0; i < MAXLENGTH; i++) for(int j = 0; j<maxlength; j++)="" { cin >> clear[j]; if( clear[j] == -1 ) break; count = e;while(count > 0){//对明文进行加密 Ciphertext =(clear)^ e mod n //加密算法Ciphertext[j] = (Ciphertext[j] * clear[j]) % n;count-- ; } }cout << " 密文为:" ; size = j;//实际密文长度 for(int k=0; k<j; k="" ++) cout << Ciphertext[k] << " "; cout << endl ; }

    2019-07-17 22:56:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载