📜  密码学中的 RSA 算法

📅  最后修改于: 2022-05-13 01:57:02.986000             🧑  作者: Mango

密码学中的 RSA 算法

RSA算法是非对称密码算法。非对称实际上意味着它适用于两个不同的密钥,即公钥私钥。顾名思义,公钥是给每个人的,而私钥是保密的。

非对称密码学的一个例子:

  1. 客户端(例如浏览器)将其公钥发送到服务器并请求一些数据。
  2. 服务器使用客户端的公钥加密数据并发送加密数据。
  3. 客户端接收此数据并对其进行解密。

由于这是非对称的,即使第三方拥有浏览器的公钥,除了浏览器之外没有其他人可以解密数据。

这个想法! RSA 的想法是基于难以分解大整数的事实。公钥由两个数字组成,其中一个数字是两个大素数的乘积。而私钥也是由同样的两个素数派生而来的。因此,如果有人可以分解大数字,那么私钥就会受到损害。因此,加密强度完全取决于密钥大小,如果我们将密钥大小加倍或三倍,加密强度会呈指数级增长。 RSA 密钥的长度通常为 1024 或 2048 位,但专家认为 1024 位密钥可能在不久的将来被破解。但到目前为止,这似乎是一项不可行的任务。

让我们学习 RSA 算法背后的机制:

    >> 生成公钥:
  • 选择两个素数。假设P = 53 和 Q = 59 。现在公钥的第一部分: n = P*Q = 3127
  • 我们还需要一个小指数说e :但 e 必须是
    • 一个整数。
    • 不是n的因数。
    • 1 < e < Φ(n) [Φ(n) 将在下面讨论],现在让我们认为它等于 3。
  • 我们的公钥由 n 和 e 组成

    >> 生成私钥:

  • 我们需要计算 Φ(n) : 使得Φ(n) = (P-1)(Q-1)所以, Φ(n) = 3016
  • 现在计算私钥dd = (k*Φ(n) + 1) / e对于某个整数 k 对于 k = 2,d 的值为 2011。

    现在我们准备好我们的 – 公钥(n = 3127 和 e = 3)和私钥(d = 2011)

    现在我们将加密“HI”

  • 将字母转换为数字:H = 8 和 I = 9
  • 因此加密数据 c = 89 e mod n 。因此我们的加密数据是 1394 现在我们将解密1394
  • 解密数据 = c d mod n 。因此我们的加密数据是 89 8 = H 和 I = 9 即“HI”。

    下面是小值的 RSA 算法的 C 实现:

    // C program for RSA asymmetric cryptographic
    // algorithm. For demonstration values are
    // relatively small compared to practical
    // application
    #include
    #include
      
    // Returns gcd of a and b
    int gcd(int a, int h)
    {
        int temp;
        while (1)
        {
            temp = a%h;
            if (temp == 0)
              return h;
            a = h;
            h = temp;
        }
    }
      
    // Code to demonstrate RSA algorithm
    int main()
    {
        // Two random prime numbers
        double p = 3;
        double q = 7;
      
        // First part of public key:
        double n = p*q;
      
        // Finding other part of public key.
        // e stands for encrypt
        double e = 2;
        double phi = (p-1)*(q-1);
        while (e < phi)
        {
            // e must be co-prime to phi and
            // smaller than phi.
            if (gcd(e, phi)==1)
                break;
            else
                e++;
        }
      
        // Private key (d stands for decrypt)
        // choosing d such that it satisfies
        // d*e = 1 + k * totient
        int k = 2;  // A constant value
        double d = (1 + (k*phi))/e;
      
        // Message to be encrypted
        double msg = 20;
      
        printf("Message data = %lf", msg);
      
        // Encryption c = (msg ^ e) % n
        double c = pow(msg, e);
        c = fmod(c, n);
        printf("\nEncrypted data = %lf", c);
      
        // Decryption m = (c ^ d) % n
        double m = pow(c, d);
        m = fmod(m, n);
        printf("\nOriginal Message Sent = %lf", m);
      
        return 0;
    }
    // This code is contributed by Akash Sharan.
    

    输出 :

    Message data = 12.000000
    Encrypted data = 3.000000
    Original Message Sent = 12.000000