RSA加密演算法

RSA加密演算法是一种非对称加密演算法，在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特（Ron Rivest）、阿迪·萨莫尔（Adi Shamir）和伦纳德·阿德曼（Leonard Adleman）在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。 1973年，在英国政府通讯总部工作的数学家克利福德·柯克斯（Clifford Cocks）在一个内部文件中提出了一个与之等效的算法，但该算法被列入机密，直到1997年才得到公开。 對极大整数做因数分解的難度決定了 RSA 算法的可靠性。換言之，對一极大整数做因数分解愈困难，RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话，那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到2020年为止，世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长，用RSA加密的信息实际上是不能被破解的。 1983年9月12日麻省理工学院在美国为RSA算法申请了专利。这个专利于2000年9月21日失效。由于该算法在申请专利前就已经被發表了，在世界上大多数其它地区这个专利权不被承认。 假設Alice想要通過不可靠的媒體接收Bob的私人訊息。她可以用以下的方式來產生一個公鑰和一個私鑰： 隨意選擇兩個大的質數 p {\displaystyle p} 和 q {\displaystyle q} ， p {\displaystyle p} 不等於 q {\displaystyle q} ，計算 N = p q {\displaystyle N=pq} 。 根據歐拉函數，求得 r = φ ( N ) = φ ( p ) × φ ( q ) = ( p − 1 ) ( q − 1 ) {\displaystyle r=\varphi (N)=\varphi (p)\times \varphi (q)=(p-1)(q-1)} 選擇一個小于 r {\displaystyle r} 的整數 e {\displaystyle e} ，使 e {\displaystyle e} 与 r {\displaystyle r} 互质。並求得 e {\displaystyle e} 关于 r {\displaystyle r} 的模反元素，命名为 d {\displaystyle d} （求 d {\displaystyle d} 令 e d ≡ 1 ( mod r ) {\displaystyle ed\equiv 1{\pmod {r}}} ）。（模反元素存在，当且仅当 e {\displaystyle e} 与 r {\displaystyle r} 互质） 將 p {\displaystyle p} 和 q {\displaystyle q} 的記錄銷毀。 ( N , e ) {\displaystyle (N,e)} 是公鑰， ( N , d ) {\displaystyle (N,d)} 是私鑰。Alice將她的公鑰 ( N , e ) {\displaystyle (N,e)} 傳給Bob，而將她的私鑰 ( N , d ) {\displaystyle (N,d)} 藏起來。 假设Bob想给Alice送消息 m {\displaystyle m} ，他知道Alice产生的 N {\displaystyle N} 和 e {\displaystyle e} 。他使用起先与Alice约好的格式将 m {\displaystyle m} 转换为一个小于 N {\displaystyle N} 的非负整数 n {\displaystyle n} ，比如他可以将每一个字转换为这个字的Unicode码，然后将这些数字连在一起组成一个数字。假如他的信息非常长的话，他可以将这个信息分为几段，然后将每一段转换为 n {\displaystyle n} 。用下面这个公式他可以将 n {\displaystyle n} 加密为 c {\displaystyle c} ： c = n e mod N {\displaystyle c=n^{e}{\bmod {N}}} 这里的 c {\displaystyle c} 可以用模幂算法快速求出来。Bob算出 c {\displaystyle c} 后就可以将它传递给Alice。 Alice得到Bob的消息 c {\displaystyle c} 后就可以利用她的密钥 d {\displaystyle d} 来解码。她可以用以下这个公式来将 c {\displaystyle c} 转换为 n {\displaystyle n} ： n = c d mod N {\displaystyle n=c^{d}{\bmod {N}}} 与 Bob 计算 c {\displaystyle c} 类似，这里的 n {\displaystyle n} 也可以用模幂算法快速求出。得到 n {\displaystyle n} 后，她可以将原来的信息 m {\displaystyle m} 重新复原。 解码的原理是 c d ≡ n e ⋅ d   ( m o d   N ) {\displaystyle c^{d}\equiv n^{e\cdot d}\ (\mathrm {mod} \ N)} 已知 e d ≡ 1 ( mod r ) {\displaystyle ed\equiv 1{\pmod {r}}} ，即 e d = 1 + h φ ( N ) {\displaystyle ed=1+h\varphi (N)} 。那么有 n e d = n 1 + h φ ( N ) = n ⋅ n h φ ( N ) = n ( n φ ( N ) ) h {\displaystyle n^{ed}=n^{1+h\varphi (N)}=n\cdot n^{h\varphi (N)}=n\left(n^{\varphi (N)}\right)^{h}} 若 n {\displaystyle n} 與 N {\displaystyle N} 互質，則由欧拉定理得： n e d ≡ n ( n φ ( N ) ) h ≡ n ( 1 ) h ≡ n ( mod N ) {\displaystyle n^{ed}\equiv n\left(n^{\varphi (N)}\right)^{h}\equiv n(1)^{h}\equiv n{\pmod {N}}} 若 n {\displaystyle n} 與 N {\displaystyle N} 不互質，則不失一般性考慮 n = p h {\displaystyle n=ph} ，以及 e d − 1 = k ( q − 1 ) {\displaystyle ed-1=k(q-1)} ，得： n e d = ( p h ) e d ≡ 0 ≡ p h ≡ n ( mod p ) {\displaystyle n^{ed}=(ph)^{ed}\equiv 0\equiv ph\equiv n{\pmod {p}}} n e d = n e d − 1 n = n k ( q − 1 ) n = ( n q − 1 ) k n ≡ 1 k n ≡ n ( mod q ) {\displaystyle n^{ed}=n^{ed-1}n=n^{k(q-1)}n=(n^{q-1})^{k}n\equiv 1^{k}n\equiv n{\pmod {q}}} 故 n e d ≡ n ( mod N ) {\displaystyle n^{ed}\equiv n{\pmod {N}}} 得證。 RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话，那么她可以为她的消息计算一个散列值（Message digest），然后用她的私钥“加密”（如同前面“加密消息”的步骤）这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”（如同前面“解密消息”的步骤）这个散列值，然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话，那麼Bob就可以知道发信人持有Alice的私钥，以及这个消息在传播路径上没有被篡改过。 首选取两个互质数 p {\displaystyle p} 和 q {\displaystyle q} , 乘法计算 p ∗ q {\displaystyle p*q} 得到 N {\displaystyle N} 。 然后计算出欧拉 Φ ( N ) {\displaystyle \Phi (N)} ： Φ {\displaystyle \Phi } 函数 Φ ( N ) {\displaystyle \Phi (N)} 是小于或等于 N {\displaystyle N} 的正整数中与 N {\displaystyle N} 互质的数的数目。 根据欧拉公式，由于 p {\displaystyle p} 和 q {\displaystyle q} 都是质数，故 Φ ( N ) = ( p − 1 ) ( q − 1 ) {\displaystyle \Phi (N)=(p-1)(q-1)} 这时候我们随机选择一个整数 e {\displaystyle e} ，条件是 1 < e < Φ ( N ) {\displaystyle 1<e<\Phi (N)} ，且 e {\displaystyle e} 与 Φ ( N ) {\displaystyle \Phi (N)} 互质。 接着我们计算 e {\displaystyle e} 对 Φ ( N ) {\displaystyle \Phi (N)} 的模逆元得到 d {\displaystyle d} ： e ∗ d ≡ 1 ( m o d Φ ( N ) ) {\displaystyle e*d\equiv 1(mod\Phi (N))} 这个公式简单的说就是 e ∗ d {\displaystyle e*d} 除以 Φ ( N ) {\displaystyle \Phi (N)} 得到的余数为1，这个公式可以转换成 e d   %   ( ( p − 1 ) ( q − 1 ) ) = 1 {\displaystyle ed\ \%\ ((p-1)(q-1))=1} 即 e d = k ( p − 1 ) ( q − 1 ) + 1 {\displaystyle ed=k(p-1)(q-1)+1} 于是，RSA公钥为 ( N , e ) {\displaystyle (N,e)} ,私钥为 ( N , d ) {\displaystyle (N,d)} 。 加密原文 m {\displaystyle m} 得到密文 x = m e % N {\displaystyle x=m^{e}\%N} 解密公式为 m = x d % N {\displaystyle m=x^{d}\%N} 证明解密逻辑： 在 m < N {\displaystyle m<N} 的狀況下证明 m = x d % N {\displaystyle m=x^{d}\%N} ，就是证明 x d % N − m = 0 {\displaystyle x^{d}\%N-m=0} x d % N − m {\displaystyle x^{d}\%N-m} = ( m e % N ) d % N − m {\displaystyle =(m^{e}\%N)^{d}\%N-m} = m e d % N − m ∵ a b % p = ( ( a % p ) b ) % p {\displaystyle =m^{ed}\%N-m\quad \because a^{b}\%p=((a\%p)^{b})\%p} = m k ( p − 1 ) ( q − 1 ) + 1 % N − m {\displaystyle =m^{k(p-1)(q-1)+1}\%N-m} = m ∗ ( m k ( p − 1 ) ( q − 1 ) − 1 ) % N {\displaystyle =m*(m^{k(p-1)(q-1)}-1)\%N} 当m与N互质时，根据费马小定理公式 a p − 1 ≡ 1 ( m o d   p ) {\displaystyle a^{p-1}\equiv 1(mod\ p)} ⇒ ( m k ( q − 1 ) ) p − 1 ≡ 1 ( m o d   p ) {\displaystyle \Rightarrow (m^{k(q-1)})^{p-1}\equiv 1(mod\ p)} ⇒ ( m k ( p − 1 ) ) q − 1 ≡ 1 ( m o d   q ) {\displaystyle \Rightarrow (m^{k(p-1)})^{q-1}\equiv 1(mod\ q)} ⇒ m k ( p − 1 ) ( q − 1 ) ≡ 1 ( m o d   p q ) {\displaystyle \Rightarrow m^{k(p-1)(q-1)}\equiv 1(mod\ pq)} ⇒ m k ( p − 1 ) ( q − 1 ) ≡ 1 ( m o d   N ) {\displaystyle \Rightarrow m^{k(p-1)(q-1)}\equiv 1(mod\ N)} ⇒ m ∗ ( m k ( p − 1 ) ( q − 1 ) − 1 ) % N = 0 {\displaystyle \Rightarrow m*(m^{k(p-1)(q-1)}-1)\%N=0} 当m与N不互质时，不妨设公因子为p，即 m = p h 1 ( h 1 < q ) {\displaystyle m=ph_{1}(h_{1}<q)} 假設q整除m。因此 q ∣ p h 1 {\displaystyle q\mid ph_{1}} ，因為q與p互質，根據歐幾里德引理， q ∣ h 1 {\displaystyle q\mid h_{1}} 。所以 q ≤ h 1 {\displaystyle q\leq h_{1}} ，而這與 h 1 < q {\displaystyle h_{1}<q} 矛盾，所以q不整除m。 此时m与q互质，根据费马小定理公式 a p − 1 ≡ 1 ( m o d   p ) {\displaystyle a^{p-1}\equiv 1(mod\ p)} ⇒ m q − 1 ≡ 1 ( m o d   q ) {\displaystyle \Rightarrow m^{q-1}\equiv 1(mod\ q)} ⇒ m k ( p − 1 ) ( q − 1 ) ≡ 1 ( m o d   q ) {\displaystyle \Rightarrow m^{k(p-1)(q-1)}\equiv 1(mod\ q)} ⇒ m k ( p − 1 ) ( q − 1 ) − 1 = q h 2 {\displaystyle \Rightarrow m^{k(p-1)(q-1)}-1=qh_{2}} ⇒ m ∗ ( m k ( p − 1 ) ( q − 1 ) − 1 ) % N = p h 1 ∗ q h 2 % N = N h 1 h 2 % N = 0 {\displaystyle \Rightarrow m*(m^{k(p-1)(q-1)}-1)\%N=ph_{1}*qh_{2}\%N=Nh_{1}h_{2}\%N=0} ,证明完成。 假设偷听者Eve获得了Alice的公钥 N {\displaystyle N} 和 e {\displaystyle e} 以及Bob的加密消息 c {\displaystyle c} ，但她无法直接获得Alice的密钥 d {\displaystyle d} 。要获得 d {\displaystyle d} ，最简单的方法是将 N {\displaystyle N} 分解为 p {\displaystyle p} 和 q {\displaystyle q} ，这样她可以得到同余方程 d e ≡ 1 ( m o d ( p − 1 ) ( q − 1 ) ) {\displaystyle de\equiv 1(\mathrm {mod} (p-1)(q-1))} 并解出 d {\displaystyle d} ，然后代入解密公式 c d ≡ n   ( m o d   N ) {\displaystyle c^{d}\equiv n\ (\mathrm {mod} \ N)} 导出n（破密）。但至今为止还没有人找到一个多項式時間的算法来分解一个大的整数的因子，同时也还没有人能够证明这种算法不存在（见因数分解）。 至今为止也没有人能够证明对 N {\displaystyle N} 进行因数分解是唯一的从 c {\displaystyle c} 导出 n {\displaystyle n} 的方法，直到今天也还没有找到比它更简单的方法。（至少没有公开的方法。） 因此今天一般认为只要 N {\displaystyle N} 足够大，那么駭客就没有办法了。 假如 N {\displaystyle N} 的长度小于或等于256位，那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年，数百台电脑合作分解了一个512位长的 N {\displaystyle N} 。一个由Shamir 和Tromer在2003年从理论上构建的硬件TWIRL，使人们开始质疑1024位长的N的安全性，目前推荐 N {\displaystyle N} 的长度至少为2048位。 1994年，彼得·秀爾证明一台量子计算机可以在多項式時間内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话，那么秀爾的算法可以淘汰RSA和相关的衍生算法。（即依赖于分解大整数困难性的加密算法） 假如有人能够找到一种有效的分解大整数的算法的话，或者假如量子计算机可行的话，那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。 首先要使用概率算法来验证随机产生的大的整数是否質数，这样的算法比较快而且可以消除掉大多数非質数。假如有一个数通过了这个测试的话，那么要使用一个精确的测试来保证它的确是一个質数。 除此之外这样找到的 p {\displaystyle p} 和 q {\displaystyle q} 还要满足一定的要求，首先它们不能太靠近，此外 p − 1 {\displaystyle p-1} 或 q − 1 {\displaystyle q-1} 的因子不能太小，否则的话 N {\displaystyle N} 也可以被很快地分解。 此外寻找質数的算法不能给攻击者任何信息，这些質数是怎样找到的，尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列，但假如有人能够预测出（或部分地预测出）这个系列的话，那么它就已经不可靠了。比如有一些非常好的随机数算法，但它们都已经被发表，因此它们不能被使用，因为假如一个攻击者可以猜出 p {\displaystyle p} 和 q {\displaystyle q} 一半的位的话，那么他们就已经可以轻而易举地推算出另一半。 此外密钥 d {\displaystyle d} 必须足够大，1990年有人证明假如 p {\displaystyle p} 大于 q {\displaystyle q} 而小于 2 q {\displaystyle 2q} （这是一个很常見的情况）而 d < 1 3 × N 1 4 {\displaystyle d<{\frac {1}{3}}\times N^{\frac {1}{4}}} ，那么从 N {\displaystyle N} 和 e {\displaystyle e} 可以很有效地推算出 d {\displaystyle d} 。此外 e = 2 {\displaystyle e=2} 永远不应该被使用。 比起AES、3DES和其它对称算法来說，RSA要慢得多。实际的運用（如TLS）一般結合了對稱加密（如AES）和非對稱加密（如RSA）兩者。 和其它加密过程一样，对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Bob一个公钥，并使Bob相信这是Alice的公钥，并且她可以截下Alice和Bob之间的信息传递，那么她可以将她自己的公钥传给Bob，Bob以为这是Alice的公钥。Eve可以将所有Bob传递给Alice的消息截下来，将这个消息用她自己的密钥解密，读这个消息，然后将这个消息再用Alice的公钥加密后传给Alice。理论上Alice和Bob都不会发现Eve在偷听他们的消息。今天人们一般用可靠的第三方機構簽發憑證来防止这样的攻击。 NIST建議的RSA密鑰長度為至少2048位元。實作上，強制設置金鑰長度為2048位元的稱RSA或RSA2(意即RSA version 2)，而未強制設定的稱RSA1以資區別，兩者差異主要在金鑰長度。 最常见的针对RSA的攻击是基于大数因数分解。1999年，RSA-155（512 bits）被成功分解，花费五个月时间（约8000 MIPS年）、224 CPU小时，在一台有3.2G中央内存[需要解释]的Cray C916计算机上完成。 RSA-155表示如下： 39505874583265144526419767800614481996020776460304936454139376051579355626529450683609 727842468219535093544305870490251995655335710209799226484977949442955603 = 3388495837466721394368393204672181522815830368604993048084925840555281177× 11658823406671259903148376558383270818131012258146392600439520994131344334162924536139 2009年12月12日，编号为RSA-768（768 bits, 232 digits）数也被成功分解。这一事件威胁了现通行的1024-bit密钥的安全性，普遍认为用户应尽快升级到2048-bit或以上。 RSA-768表示如下： 123018668453011775513049495838496272077285356959533479219732245215172640050726 365751874520219978646938995647494277406384592519255732630345373154826850791702 6122142913461670429214311602221240479274737794080665351419597459856902143413 = 3347807169895689878604416984821269081770479498371376856891 2431388982883793878002287614711652531743087737814467999489× 3674604366679959042824463379962795263227915816434308764267 6032283815739666511279233373417143396810270092798736308917 1995年，丹·博內（英语：Dan Boneh）和大衛·布魯姆利（英语：David Brumley）提出了一种出人意料的攻击方式：假如Eve（竊密者）对Alice的硬件有充分的了解，而且知道它对一些特定的消息加密时所需要的时间的话，那么她可以很快地推导出d。這種攻擊方式之所以會成立，主要是因為在進行加密時所進行的模指數運算是一個位元一個位元進行的，而位元為1所花的運算比位元為0的運算要多很多，因此若能得到多組訊息與其加密時間，就會有機會可以反推出私鑰的內容。 公开密钥加密 橢圓曲線密碼學 量子電腦 秀爾演算法 米勒-拉賓質數判定法 迪菲-赫爾曼密鑰交換 模幂 快速幂 扩展欧几里得算法 Calderbank, Michael. The RSA Cryptosystem: History, Algorithm, Primes (PDF). 2007-08-20. （原始内容 (PDF)存档于2016-12-13）.  Cocks, C.C. A Note on Non-Secret Encryption (PDF). www.gchq.gov.uk. 1973-11-20 [2017-05-30]. （原始内容存档 (PDF)于2017-02-16）.  Cryptographic communications system and method, 1977-12-14 [2018-04-09], （原始内容存档于2019-02-17）  RSA Security Releases RSA Encryption Algorithm into Public Domain. [2010-03-03]. （原始内容存档于2007-06-21）.  Robinson, Sara. Still Guarding Secrets after Years of Attacks, RSA Earns Accolades for its Founders (PDF). SIAM News. June 2003, 36 (5) [2018-04-09]. （原始内容 (PDF)存档于2017-01-16）.  Tromer, Eran. TWIRL (The Weizmann Institute Relation Locator). cs.tau.ac.il. [2018-04-16]. （原始内容存档于2018-04-20）.  Has the RSA algorithm been compromised as a result of Bernstein's Paper? （页面存档备份，存于互联网档案馆） What key size should I be using? Keylength - NIST Report on Cryptographic Key Length and Cryptoperiod (2019). www.keylength.com. [2020-04-22]. （原始内容存档于2020-04-04）.  存档副本. [2018-04-09]. （原始内容存档于2017-07-01）. [需要較佳来源] Factorization of a 768-bit RSA modulus (PDF). 2010年1月7日 [2010年1月10日]. （原始内容 (PDF)存档于2010年3月31日）.  Remote timing attacks are practical. （页面存档备份，存于互联网档案馆）. SSYM'03 Proceedings of the 12th conference on USENIX Security Symposium. RSA, The Security Division of EMC（页面存档备份，存于互联网档案馆） RSA算法详解（页面存档备份，存于互联网档案馆）