📜  使用多精度算术库的 RSA 算法

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

使用多精度算术库的 RSA 算法

公钥密码术也称为非对称密码术,是一种密码学类型,涉及使用两个密钥,即公钥和私钥。接收方的公钥用于加密发送方的明文,而接收方的私钥用于解密加密的消息,因此只能由预期的接收方解密。
RSA (Rivest Shamir Adleman) 是一种公钥密码算法,其中密钥生成基于两个大素数 p 和 q 的乘积,即 N 即 N = p × q。该算法安全性的关键在于攻击者首先需要通过在指数时间内发生的 N 因式分解找出 p 和 q。研究表明,如果 N 是 100 位数字,这可能需要 70 多年。由于这种复杂性,攻击者无法找到解密密钥 d,因为 d 取决于 p、q 和加密密钥 e。因此,即使攻击者知道 N 和 e,也无法计算 d。

RSA 的当前场景:
截至 2017 年 4 月,RSA-2048 可能在未来很多年都无法分解。此外,最近的勒索软件病毒还使用 RSA-2048 对受感染系统上的文件进行加密。如果没有解密密钥,这些文件无法解密,因为无法分解如此大的密钥。因此,RSA-1024 和 RSA-2048 现在被广泛用于安全通信。

\\ \textbf{\hspace{4cm} Key generation:} \\ Select \hspace{0.2cm} p, q \hspace{5cm} p,q \hspace{0.2cm}both \hspace{0.2cm} prime\\ calculate \hspace{0.2cm} n = p*q \\ calculate \hspace{0.2cm}\phi(n) = (p-1)*(q-1) \\ select \hspace{0.2cm}integer \hspace{0.2cm}e \hspace{4cm} gcd(\phi(n),e)=1; 1<e<\phi(n)\\ calculate \hspace{0.2cm} d\\ Public Key \hspace{5cm} KU = {e,n}\\ PrivateKey \hspace{4.7cm} KR = {d,n}

Rsa 示例

上图显示了 RSA 算法的 3 个不同阶段。考虑到素数生成器生成 1024 位素数 p 和 q,结果 N 将是 2048 位数字。由于在加密和解密期间执行的所有模运算都是相对于 2048 位数的 N,因此软件实现可能很耗时。此外,C 的 unsigned long long int 数据类型将计算限制为 64 位数字。为了支持作为 RSA 算法要求的大尺寸密钥的生成以及涉及大尺寸模数的加密和解密的快速计算,可以使用称为 GMP(GNU Multiple Precision Arithmetic Library)的库。使用该库将允许整个 RSA 算法在简单的 64 位操作系统上运行,从而避免使用超级计算机或高配置硬件设备。

什么是GMP?
GMP 是一个开源库,它允许对有符号整数、有理数和十进制数执行算术计算,除了运行它的机器的配置之外,对其精度没有任何实际限制。该库用于涉及非常大或高精度数字的算术计算,其中大部分用于加密算法。使用这个库的好处是它提供了对任意精度数的支持,其大小在程序执行之前是未知的。为使用该库提供的基本接口是针对 C 语言的。但是其他语言也存在包装器,包括 Ada、C++、C#、Julia、OCaml、Perl、 PHP、 Python、R、Ruby 和 Wolfram 语言。
例如,下面提到了一个执行两个多精度数相乘的 C 程序。
请注意,gmp.h 文件需要作为头文件包含在内。在 Unix 系统上编译这样的程序可以使用命令完成

gcc program_name.c -lgmp

C
#include 
#include 
 
int main(void) {
   mpz_t x, y, result;
 
   mpz_init_set_str(x, "7612058254738945", 10);
   mpz_init_set_str(y, "9263591128439081", 10);
   mpz_init(result);
 
   mpz_mul(result, x, y);
   gmp_printf("    %Zd\n"
              "*\n"
              "    %Zd\n"
              "--------------------\n"
              "%Zd\n", x, y, result);
 
   /* free used memory */
   mpz_clear(x);
   mpz_clear(y);
   mpz_clear(result);
   
   return 0;
}


编码 RSA 算法:
描述 RSA 算法与小素数的工作的 AC 程序可在此处获得。为了了解使用大素数的真实 RSA 算法的工作原理,此处提供了使用 GMP 库的 C 代码。该程序通过生成 512 位的随机素数 p 和 q 来实现 RSA-1024,然后分别进行加密和解密。在这里,变量 MODULUS_SIZE 被赋值为 1024。这个值可以更改为 2048 以生成 2048 位的 RSA 密钥。

应用:
RSA 算法已广泛用于许多电子商务应用的安全网络通信和安全交易。其他应用包括低比特率通道上的语音通信、甚至高速 IPSec 的安全密钥交换、与在线商家通信时的信用卡详细信息等。