RSA算法基础

发布时间 2023-11-19 20:13:59作者: 20232403

RSA算法的必要性

密码学是一门保密通信技术,它将明文信息按双方约定的法则转换成只有特定人群才能看懂的密文以保证信息的安全传输。这样即使接收者之外的人得到传递的密文,也不知道信息的真正内容,从而达到安全传递信息的目的。

古典密码学和近代密码学一般是通过转译和反转译的方法,先将所发信息通过特殊的方法(这种方法收发双方事先约定好且保密)将所传递信息编码转译成一段看似没有规律的密文,将这段密文传给接收者后使用相同的方法反转译,获得真正信息。在传递过程中,即使密文被他人截获,由于不清楚破译方法,截获者也无法知晓真实信息,以此达到保护信息的目的。

但是,这种加密算法显然是有缺陷的。由于破译算法同时被发送者和接收者所共同知晓,那么第三方只需入侵当中任何一端,拿到编码(解码)方式,那么这种加密方式就不再安全。很明显,如果采用这种传统的加密算法,那么我们个人秘密和国家安全有一部分就被别人所掌握了。那么如何解决这个问题,让安全掌握在自己手里呢?

1976年,Whitefield Diffie和Martin Hellman发表了论文《密码学的新方向》,这标志着公钥密码学的诞生,他们因此也获得了2015年的图灵奖。公钥密码就能解决刚刚提到的问题,为什么呢?公钥密码体制的特点是采用两个相关的密钥将加密与解密操作分开,其中一个密钥是公开的,称为公钥,用于加密;另一个密钥是保密的,为用户专有,称为私钥,用于解密。

而最经典的公钥加密算法莫过于1987年由Rivest、Shamir和Adleman用数论方法构造的RSA算法,它是迄今为止理论上最成熟,最完善的公钥密码体制并已得到广泛应用。

RSA算法的安全性可以归纳为大整数分解的困难性,即给定两个大素数,将他们相乘很容易,但给出它们的乘积再找出它们的因子很困难。目前为止,世界上还尚未有任何可靠的攻击RSA算法的手段,只要密钥长度足够长而且使用方法得当,那用RSA加密的信息是很难破解的。

RSA算法基本内容

使用RSA算法加密大概分为一下几步:

  1. 找两个大素数pq
  2. N = p * q
  3. L = (p - 1) * (q - 1)
  4. 寻找比L小的且与L互质的一个数e
  5. 利用辗转相除法得出e*d-L*x=1,得到公钥Ne和私钥d
  6. 密文Ae % N = R(A为明文)。
  7. 明文Rd % N = A (R为密文)。

RSA算法的安全性显而易见,由于RSA算法中取余数的操作只能单项进行,无法进行逆运算,在不知道私钥的情况下,即使是发送者也无法将密文破译成明文,而私钥只有接收者知道,从而使安全由接收者一方掌握。

RSA算法推导与证明

上文的1至5步都是在为生成公钥与私钥做准备,因此证明RSA算法的可行性的关键在于证明第6、7步。
换句话说,利用1至5步生成的公钥和私钥,真的能够完成第6、7步的转换吗?下面我们来证明一下。由于证明过程需要很多有关的数论,我尽力用更基础的数学语言来描述清楚。

在进行Ae % N = R操作时,实质是将Ae/N

则:
Ae = N * x + R

Aed =(N * x + R)d=x1Nd+x2Nd-1R1+x3Nd-2R2+……+xdRd(二项式定理)

Aed/N =(x1Nd+x2Nd-1R1+x3Nd-2R2+……+xdRd)/N(等式两边同时除以N)

通过观察,可以看到等式右边前d-1项都是N的倍数,因此 Aed/N 余数与 Rd/N 余数相等(由二项式定理得xd=1)
即:Aed % N = Rd % N

如果要证明 Rd % N = A,那么只需证明Aed % N = A即可

在第5步中,我们利用辗转相除法得到等式e*d-L*x=1

进一步转换:

Aed = A1+L*x = A*AL*x

如果要证明 Aed % N = A,那么只需证明AL*x = 1即可。

欧拉-费马定理

“AL*x = 1”究竟成立吗,实际上是成立的,并且这个等式就是欧拉-费马定理(Euler-Fermat theorem)的最后结论的公式

欧拉-费马定理内容

设a,m∋N,且a和m互质,则aɸ(m) ≡ 1 (mod m) (即aɸ(m) % m = 1)。

其中ɸ(m)是欧拉函数,指的是小于m且与m互质的自然数的个数。而我们的步骤2和步骤3,实际上就是一个求ɸ(m)的过程,这两步同样是一个定理,但篇幅限制再次不过多赘述来证明它。

证明欧拉-费马定理预备工作

想要证明欧拉-费马定理,让我们先来了解三个小引理。

设a,m∋N,且a和m互质,并将所有小于m且与m互质的自然数组成一个集合X{x1 , x2 , …… , xɸ(m)}。

将集合X每一个元素同时乘上a得到一个新的集合P{ax1 , ax2 , …… , axɸ(m)}。

我们可以得到

引理一:P中的元素模m的结果两两不同。

我们可以利用反证法来证明:

假设P中存在两个元素 pi % m = pj % m ( i ≠ j , i > j)

那么( pi - pj )% m = 0

(ax1 - ax2) % m = 0

a(x1 - x2) % m = 0

因为a与m互质,所以一定是 x1 - x2 = 0,才能使上式成立,

但是 x1 与 x2是不相等的两个数,所以假设不成立。

引理一证毕。

引理二:P中的元素模m的结果均与m互质。

我们依然可以利用反证法来证明:

假设存在 pi 与m不互质,

则pi = axi = km + r

由于 axi 与m不互质

那么 axi - km 与m最大公约数一定大于1。(我们将其设为c)

c既是m的约数,也是r的约数,那么一定是 axi 的约数,且c > 1,

那么m和 axi 不互质,

但是前提条件中,a和m互质,xi 也和m互质,

那么 axi 应该和m互质才对,

也就是说,以“存在 pi 与m不互质”为假设得到的结论与前提条件矛盾,

所以假设不成立,所以引理二成立

引理二证毕。

引理三:若r1与r2均与m互质,且(r1 * r2)% m = r2,则r1 % m = 1。

证明这个引理,我们需要分情况讨论。

1.当 r1 * r2 = 0 ,(r1 * r2) % m = 0,不符合前提,舍去。

2.当 r1 * r2 < 0 , (r1 * r2) % m = r1 * r2

且(r1 * r2)% m = r2

所以r1 = 1,所以r1 % m = 1。

3.当 r1 * r2 > 0 ,

(r1 * r2) % m = r2

r1 * r2 = km + r2

(r1 - 1) * r2 = km,

(r1 - 1) * r2 % m = 0,

因为r2 与 m 互质,

所以(r1 - 1) % m = 0,

所以 r1 % m = 1。

引理三证毕。

模的四则运算

与实数一样,模算也可以进行四则运算

其中加减乘较为简单,这里给出运算规则且不再证明

设 a % m = r1 , b % m = r2,则:

模加:(a + b) % m = r1 + r2

模减:(a - b) % m = r1 - r2

模乘:(a * b) % m = r1 * r2

证明欧拉-费马定理

在上面做了充分的准备后,证明欧拉-费马定理也就不是什么难事了。

首先,由于引理一和引理二,我们可以发现,

集合X和集合P中的元素是一一映射的关系,

因为它们都能表示“所有小于m且与m互质的自然数的集合”

所以我们得到等式关系:

p1 * p2 * …… * pɸ(m) % m = x1 * x2 * …… * xɸ(m) % m

ax1 * ax2 * …… * axɸ(m) % m = x1 * x2 * …… * xɸ(m) % m

aɸ(m) * x1 * x2 * …… * xɸ(m) % m = x1 * x2 * …… * xɸ(m) % m

aɸ(m) * x1 * x2 * …… * xɸ(m) % m = x1 % m * x2 % m * …… * xɸ(m) % m(四则运算中的模乘)

aɸ(m) * x1 * x2 * …… * xɸ(m) % m = x1 * x2 * …… * xɸ(m)

根据引理三得:

aɸ(m) % m = 1

欧拉-费马定理证毕。

另外,特别的,当 m 为质数 p 是

a(p-1) % p = 1

这就是大名鼎鼎的费马小定理(Fermat's little theorem)。

小结

通过证明欧拉-费马定理,我们证明了RSA算法的可行性和安全性。这篇博客将证明过程用不简洁的语言描述,意在帮助还没有学习过数论的同志理解RSA算法原理,还请知识体系更为完善的同志给予一些包涵。