zoukankan      html  css  js  c++  java
  • 简单RSA,非大数,C++

    #include <iostream>
    using namespace std;
    bool isPrime[1000];//True代表为素数
    int x=1, y=0;//扩展欧几里得的解
    void findPrime();
    void exgcd(int a, int b);
    int my_Pow(int x, int y, int mod);
    int Prime[1000] = { 0 }, cnt = 0;//cnt为数组中素数个数
    //RSA忘记的可以回忆下,推荐文章:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
    int main()
    {
        memset(isPrime, true, sizeof(isPrime));
        findPrime();//生成素数数组
        int p = Prime[5],q=Prime[7];//随机取两个素数
        int n = p * q;
        int fei_n = (p - 1) * (q - 1);
        cout << "p=" << p << endl << "q=" << q << endl << "n=" << n << endl << "fei_n=" << fei_n<<endl;
        int e=0;
        for (int t = 0; t < cnt; t++)
        {//求与fei_n互质且相对较小的一个数e,怕溢出
            if (fei_n % Prime[t] != 0)
            {
                e = Prime[t];
                cout << "e=" << e << endl;
                break;
            }
        }
        if(e!=0)
        exgcd(fei_n, e);//求逆元e^-1
        cout << "x="<<x<<endl<<"y="<<y<<endl;
        int d = y;//这里可能为负
        if (d < 0) d += fei_n;
        cout << "d=" << d << endl<<"验证(fei_n*x+e*y)%fei_n="<< (fei_n * x + e * y) % fei_n<<endl;
        int mingwen = 99;
        int miwen = my_Pow(mingwen, e, n);
        cout << "密文" << miwen<<endl;
        int jiemiwen = my_Pow(miwen, d, n);
        cout << "解密后的明文" << jiemiwen << endl;
        system("pause");
        return 0;
    }
    
    void findPrime()
    {//素数筛
        for (int i = 2; i < 1000; i++)
        {
            if (isPrime[i])
            {
                Prime[cnt++] = i;
                for (int j = i + i; j < 1000; j += i)
                {
                    isPrime[j] = false;
                }
            }
        }
    }
    
    void exgcd(int a, int b)//ax+by=gcd(a,b),默认a>b
    {//看不懂的推荐个文章,https://www.cnblogs.com/hadilo/p/5914302.html
        if (b)
        {
            exgcd(b, a % b);
            int k = x;
            x = y;
            y = k - a / b * y;
        }
        else {
            x = 1;
            y = 0;
        }
    }
    
    int my_Pow(int x, int y,int mod)
    {
        if (y == 0)
            return 1;
        int s = 1;
        while (y>0)
        {
            if (y & 0x01)//最低位,判断奇偶
            {
                s = s * x % mod;
                --y;
            }
            else
            {
                x = x * x%mod;
                y=y>>1;//除2
            }
        }
        return s;
    }
    
  • 相关阅读:
    webpack
    一 java包管理
    docker 保存本地容器 推送镜像
    virtualBox 安装linux系统 网络设置小记
    centos6.5编译安装nginx[整理二]
    go基本使用
    docker基础命令使用
    centos 安装docker
    docker 删除容器及镜像
    PHP Thread Safe和Non ThreadSafe
  • 原文地址:https://www.cnblogs.com/lxzbky/p/13916669.html
Copyright © 2011-2022 走看看