通过一个例子,彻底解开非对称加密的奥秘

286 阅读6分钟

RSA加密算法解析

摘要

我们知道,常见的加密算法可以分为对称加密和非对称加密,对于对称加密,很好理解,就是使用同一个密钥把一段内容通过一段算法加密or解密,这很好理解,我可以使用最简单的字符偏移实现一个简单的对称加密。

但是非对称加密,使用公钥对一段内容加密之后只有私钥才能解密,就类似你用一把锁把房间锁住了,只有拿到钥匙才能打开;所以,我一直很好奇,这啥原理?锁和钥匙是怎么样生成的呢,锁定和解锁的过程是怎样的呢。

今天我将通过一个例子,彻底解开非对称加密的奥秘:

1.使用1113得到一对密钥:公钥(143,7),私钥(143,103)

2.使用公钥加密数字5,得到加密内容是47

3.使用私钥解密47最终得到5

过程中会涉及到一些基础的数学知识,不是很难,有数学基础的可以略过,直接看 让我们来实践检验真理

什么是RSA加密算法?

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的 。非对称加密RSA就是基于RSA算法实现的。所谓非对称加密,是指用于加密和解密的密钥是不相同的。而对称加密则是加密和解密的密钥是相同的,这就导致了密钥传递过程中会存在安全问题;而在非对称加密中用来解密的密钥称为私钥,它是不对外公布的,而用于加密的公钥是对外公布的。

看到这里你肯定很好奇它到底是怎么样做到加密和解密的呢,它又是怎样保证安全性的呢?

接下来将一步步揭开RSA加密算法的神秘面纱。

一点数学知识

质数:也称素数,除了1和本身,不能被其他数整除的数。如,2,3,5,7,11等等

互质关系:如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系,如3和5,5和7等等。

  1. 任意两个质数构成互质关系,比如3和5。
  2. 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和7。
  3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如10和37。
  4. p是大于1的整数,则p和p-1构成互质关系,比如10和9。
  5. p是大于1的奇数,则p和p-2构成互质关系,比如33和31。
  6. 1和任意一个自然数是都是互质关系,比如1和10。

欧拉函数:描述任意给定正整数n,在小于等于n的正整数之中,有多少个与n构成互质关系,用 ϕ(n)\phi(n)表示。

  1. n=1时,ϕ(n)\phi(n) = 1
  2. n是质数,ϕ(n)\phi(n) = n-1
  3. n = pkp^k (p为质数,k为大于等于1的整数),ϕ(n)\phi(n) = pkpk1p^k-p^{k-1}
  4. n = p1×p2p_1\times p_2 (p1,p2p_1,p_2 是质数),ϕ(n)=ϕ(p1p2)=ϕ(p1)ϕ(p2)=(p11)×(p21)\phi(n) = \phi(p_1p_2) = \phi(p_1)\phi(p_2) = (p_1 -1 ) \times (p_2 -1)
  5. n=p1k1p2k2p3k3...pxkx n = p_1^{k_1}p_2^{k_2}p_3^{k_3}...p_x^{k_x}(p是质数,k是整数),ϕ(n)=n(11p1)(11p2)(11p3)...(11px)\phi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3})_{...}(1-\frac{1}{p_x})

欧拉定理:如果两个正整数a和n互质,则n的欧拉函数 ϕ(n)\phi(n) 可以让下面的等式成立:

αϕ(n)1(modn)\alpha^{\phi(n)} \equiv 1 (mod \quad n)

  1. 特例:如果n是质数,则 αn11(modn)\alpha^{n-1} \equiv 1 (mod \quad n);这也称为费马定理
  2. (αϕ(n))h1(modn)(\alpha^{\phi(n)})^h \equiv 1 \quad (mod \quad n) ,h是正整数。
  3. αϕ(n)×xx(modn)x是整数\alpha^{\phi(n)}\times x \equiv x \quad (mod \quad n) \quad x 是整数

模反元素:如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1

ab=1(modn)ab = 1(mod \quad n)

这时,b就叫做a的模反元素

让我们来实践检验真理

1.密钥生成

  1. 随机取两个质数p,q,这里假如取11和13,真实情况下取得数会比较大,这里方便为了方便计算取得较小。实际应用中这两个数越大越难破解

    n=pq=143,ϕ(n)=10×12=120n=pq=143,\phi(n)=10\times12=120

  2. 取一个整数e,e满足1<e<ϕ(n)eϕ(n)互质1<e<\phi(n),e和\phi(n)互质。求e对ϕ(n)\phi(n)的模反元素d

    ed = 1 (mod ϕ(n)\phi(n)) => ed = hϕ(n)+1h\phi(n)+1 => ed + ϕ(n)y=1\phi(n)y = 1

    取e=7带入数据:7d + 120 y = 1

    解的一组解:d = 103,y=-6

  3. 于是得到了公钥(n,e),私钥(n,d),实际应用中采用的是ASN.1格式。

  4. 下面带入一组数据验证一下(数字较大可使用大数计算器):

    假设要加密的数据m=5;

    用公钥加密:me=c(modn)m^e = c \quad(mod \quad n) 带入数据:57=cmod(143)5^7 = c \quad mod(143) => c = 47

    用私钥解密:cd=m(modn)c^d = m \quad (mod \quad n) 带入数据 47103=m(mod143)47^{103} = m \quad (mod \quad 143) => m = 5

数学证明

证明 cd=m(modn)c^d = m \quad (mod \quad n),通俗的说就是证明左边除以n的余数是m:

根据加密公式 me=c(modn)m^e = c \quad(mod \quad n)

c=mekn,k为系数 c=m^e -kn,k为系数;带入原式:

(mekn)d=m(modn)(m^e-kn)^d = m \quad (mod \quad n)

对左边展开:Cd0(me)d(kn)0+Cd1(me)d1(kn)1+Cd2(me)d2(kn)2...Cdd(me)dd(kn)d=m(modn)C_d^0(m^e)^{d}(kn)^{0}+C_d^1(m^e)^{d-1}(kn)^{1}+C_d^2(m^e)^{d-2}(kn)^{2}...C_d^d(m^e)^{d-d}(kn)^{d} = m \quad (mod \quad n)

左边除了第一项都带n,所以左边除n的余数必然等于左边第一项除n的余数所以上式子等价于求证:med=m(modn)m^{ed} = m \quad (mod \quad n)

ed=hϕ(n)+1\because ed =h\phi(n)+1

上式子又等价于求证mϕ(n)+1=m(modn)\therefore 上式子又等价于求证 m^{\phi(n)+1} = m \quad(mod \quad n)

  1. 如果m、n互质。

    mϕ(n)=1(modn)m^{\phi(n) }= 1 \quad(mod \quad n)

    两边同乘m,得 mϕ(n)+1=m(modn) m^{\phi(n)+1} = m \quad(mod \quad n),证毕。

  2. 如果m、n不互质。

    n=pq,pq互质,nm不互质\because n=pq,pq互质,n、m不互质

    m=kpkq\therefore m=kp || kq,k为整数

    假设m=kp,此时m和q必然互质

    mq1=1(modq)=>根据欧拉定理第2点特性可得:(mq1)h(p1)=1(modq)=>(mq1)h(p1)×m=m(modq)\therefore m^{q-1} = 1\quad(mod\quad q) =>根据欧拉定理第2点特性可得: (m^{q-1})^{h(p-1)} = 1\quad(mod\quad q)=> (m^{q-1})^{h(p-1)} \times m = m\quad(mod\quad q)

    ed=hϕ(n)+1,ϕ(n)=(p1)(q1)\because ed =h\phi(n)+1,\phi(n)=(p-1)(q-1)

    med=m(modq)\therefore m^{ed} = m \quad (mod \quad q)

    m=kp\because m=kp

    kped=kp(modq)=>kped=zq+kp\therefore kp^{ed} = kp \quad (mod \quad q) => kp^{ed} = zq + kp

    两边同除p:

    kpedp=zqp+k\frac{kp^{ed}}{p} =\frac{zq}{p}+k

    kpedp\therefore \frac{kp^{ed}}{p} 是整数,k是整数,所以zqp\frac{zq}{p}也必定是整数,而pq互质,所以z必定是p的整数倍

    z=zp带入上面式子得:kped=zpq+kp\therefore z = {z}'p 带入上面式子得: kp^{ed} = {z}'pq+kp

    kp=m,pq=n\because kp = m ,pq =n

    med=zn+m=>med=m(modn)\therefore m^{ed} = {z}'n + m =>m^{ed} = m \quad(mod \quad n),证毕。

    安全性分析

    由上面密钥生成的例子可知,密钥破解的关键就是d,因为n,e都是公开的,ed=hϕ(n)+1\because ed =h\phi(n)+1 ,要求d就必须知道ϕ(n)\phi(n),而ϕ(n)=(p1)(p1)\phi(n) = (p-1)(p-1),所以必须对n进行因式分解,n比较小还好,但是实际应用中n的长度一般都是1024二进制位或者2048二进制位,目前人类公布的能破解的最大位数是768二进制位,每增加一位对破解难度都是指数级增加。更何况就算知道了pq,d也只是ed + ϕ(n)\phi(n) y = 1 无数组整数解中的一组。所以可知破解难度有多大。就目前人类的科技水平而言,实际应用中1024位是非常安全,2048位是绝对安全。