RSA加密演算法

一種被廣泛利用的加密演算法

RSA加密演算法是一种非对称加密演算法,在公开密钥加密电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。[1]

RSA的作者之一:阿迪·萨莫尔(Adi Shamir)

1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个与之等效的算法,但该算法被列入机密,直到1997年才得到公开。[2]

對极大整数做因数分解的难度決定了 RSA 算法的可靠性。換言之,對一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被破解的。

1983年9月12日麻省理工学院在美国为RSA算法申请了专利[3]这个专利于2000年9月21日失效。[4]由于该算法在申请专利前就已经被發表了[5],在世界上大多数其它地区这个专利权不被承认。

操作编辑

公钥与私钥的产生编辑

假設愛麗絲想要通過一個不可靠的媒體接收鮑伯的一條私人訊息。她可以用以下的方式來產生一個公鑰和一個私鑰

  1. 隨意選擇兩個大的質數   不等於 ,計算 
  2. 根據歐拉函數,求得 
  3. 選擇一個小于 的整數 ,使  互质。並求得 关于 模反元素,命名为 (求  )。(模反元素存在,当且仅当  互质)
  4.   的記錄銷毀。

 是公鑰, 是私鑰。愛麗絲將她的公鑰 傳給鮑伯,而將她的私鑰 藏起來。

加密消息编辑

假设鮑伯想给愛麗絲送一个消息 ,他知道愛麗絲产生的  。他使用起先与愛麗絲约好的格式将 转换为一个小于 的非负整数 ,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为 。用下面这个公式他可以将 加密为 

 

计算 并不复杂。鮑伯算出 后就可以将它传递给愛麗絲。

解密消息编辑

愛麗絲得到鮑伯的消息 后就可以利用她的密钥 来解码。她可以用以下这个公式来将 转换为 

 

得到 后,她可以将原来的信息 重新复原。

解码的原理是

 

已知 ,即  。那么有

 

  互質,則由欧拉定理得:

 

  不互質,則不失一般性考慮 ,以及 ,得:

 
 

  得證。

签名消息编辑

RSA也可以用来为一个消息署名。假如愛麗絲想给鮑伯传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。鮑伯获得这个消息后可以用愛麗絲的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那麼鮑伯就可以知道发信人持有愛麗絲的私钥,以及这个消息在传播路径上没有被篡改过。

正确性证明编辑

首选取两个互质数  , 乘法计算 得到 

然后计算出欧拉  函数 是小于或等于 的正整数中与 互质的数的数目。 根据欧拉公式,由于  都是质数,故

 

这时候我们随机选择一个整数 ,条件是 ,且   互质。 接着我们计算  的模逆元得到 

 

这个公式简单的说就是  除以 得到的余数为1,这个公式可以转换成

 

 

于是,RSA公钥为 ,私钥为 

加密原文 得到密文

 

解密公式为

 

证明解密逻辑:

  的狀況下证明 ,就是证明 

 

 

 

 

 

当m与N互质时,根据费马小定理公式

 

 

 

 

 

 

当m与N不互质时,不妨设公因子为p,即 ,此时m与q互质,根据费马小定理公式

 

 

 

 

 ,证明完成。

安全性编辑

假设偷听者Eve获得了Alice的公钥  以及Bob的加密消息 ,但她无法直接获得Alice的密钥 。要获得 ,最简单的方法是将 分解为  ,这样她可以得到同余方程 并解出 ,然后代入解密公式

 

导出n(破密)。但至今为止还没有人找到一个多項式時間的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在(见因数分解)。

至今为止也没有人能够证明对 进行因数分解是唯一的从 导出 的方法,直到今天也还没有找到比它更简单的方法。(至少没有公开的方法。)

因此今天一般认为只要 足够大,那么駭客就没有办法了。

假如 的长度小于或等于256,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的 。一个由Shamir 和Tromer在2003年从理论上构建的硬件TWIRL[6],使人们开始质疑1024位长的N的安全性,目前推荐 的长度至少为2048位。[7]

1994年彼得·秀爾(Peter Shor)证明一台量子计算机可以在多項式時間内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀爾的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法)

假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。

实现细节编辑

密钥生成编辑

首先要使用概率算法来验证随机产生的大的整数是否質数,这样的算法比较快而且可以消除掉大多数非質数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个質数。

除此之外这样找到的  还要满足一定的要求,首先它们不能太靠近,此外  的因子不能太小,否则的话 也可以被很快地分解。

此外寻找質数的算法不能给攻击者任何信息,这些質数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出  一半的位的话,那么他们就已经可以轻而易举地推算出另一半。

此外密钥 必须足够大,1990年有人证明假如 大于 而小于 (这是一个很常見的情况)而 ,那么从  可以很有效地推算出 。此外 永远不应该被使用。

速度编辑

比起AES3DES和其它对称算法来說,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位元[8]

已公开的或已知的攻击方法编辑

大数因数分解编辑

针对RSA最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits)被成功分解,花了五个月时间(约8000 MIPS年)和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。[9]


RSA-155表示如下:

39505874583265144526419767800614481996020776460304936454139376051579355626529450683609
727842468219535093544305870490251995655335710209799226484977949442955603

= 3388495837466721394368393204672181522815830368604993048084925840555281177×
  11658823406671259903148376558383270818131012258146392600439520994131344334162924536139

2009年12月12日,编号为RSA-768(768 bits, 232 digits)数也被成功分解[10]。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。

RSA-768表示如下:

123018668453011775513049495838496272077285356959533479219732245215172640050726
365751874520219978646938995647494277406384592519255732630345373154826850791702
6122142913461670429214311602221240479274737794080665351419597459856902143413

= 3347807169895689878604416984821269081770479498371376856891
  2431388982883793878002287614711652531743087737814467999489×
  3674604366679959042824463379962795263227915816434308764267
  6032283815739666511279233373417143396810270092798736308917

时间攻击编辑

1995年Dan Boneh英语Dan BonehDavid Brumley英语David Brumley提出了一种非常意想不到的攻击方式:假如Eve(竊密者)对Alice的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出d。這種攻擊方式之所以會成立,主要是因為在進行加密時所進行的模指數運算是一個位元一個位元進行的,而位元為1所花的運算比位元為0的運算要多很多,因此若能得到多組訊息與其加密時間,就會有機會可以反推出私鑰的內容。[11]

相關條目编辑

参考文献编辑

  1. ^ Calderbank, Michael. The RSA Cryptosystem: History, Algorithm, Primes (PDF). 2007-08-20. (原始内容 (PDF)存档于2016-12-13). 
  2. ^ Cocks, C.C. A Note on Non-Secret Encryption (PDF). www.gchq.gov.uk. 1973-11-20 [2017-05-30]. (原始内容存档 (PDF)于2017-02-16). 
  3. ^ Cryptographic communications system and method, 1977-12-14 [2018-04-09], (原始内容存档于2019-02-17) 
  4. ^ RSA Security Releases RSA Encryption Algorithm into Public Domain. [2010-03-03]. (原始内容存档于2007-06-21). 
  5. ^ 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). 
  6. ^ Tromer, Eran. TWIRL (The Weizmann Institute Relation Locator). cs.tau.ac.il. [2018-04-16]. (原始内容存档于2018-04-20). 
  7. ^ Has the RSA algorithm been compromised as a result of Bernstein's Paper?页面存档备份,存于互联网档案馆) What key size should I be using?
  8. ^ Keylength - NIST Report on Cryptographic Key Length and Cryptoperiod (2019). www.keylength.com. [2020-04-22]. (原始内容存档于2020-04-04). 
  9. ^ 存档副本. [2018-04-09]. (原始内容存档于2017-07-01). 
  10. ^ Factorization of a 768-bit RSA modulus (PDF). 2010年1月7日 [2010年1月10日]. (原始内容 (PDF)存档于2010年3月31日). 
  11. ^ Remote timing attacks are practical. 页面存档备份,存于互联网档案馆). SSYM'03 Proceedings of the 12th conference on USENIX Security Symposium.

外部链接编辑