查看“RSA加密演算法”的源代码
←
RSA加密演算法
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{多個問題| {{disputed|time=2014-06-04T05:10:33+00:00}} {{expert|time=2014-06-04T05:10:33+00:00}} }} {{NoteTA |G1 = IT |G2 = Math }} [[File:Adi Shamir 2009 crop.jpg|thumb|175px|RSA的作者之一:[[阿迪·萨莫尔]](Adi Shamir)]] '''RSA加密演算法'''是一种[[非对称加密演算法]],在[[公开密钥加密]]和[[电子商业]]中被广泛使用。RSA是1977年由[[罗纳德·李维斯特]](Ron Rivest)、[[阿迪·萨莫尔]](Adi Shamir)和[[伦纳德·阿德曼]](Leonard Adleman)一起提出的。当时他们三人都在[[麻省理工学院]]工作。RSA就是他们三人姓氏开头字母拼在一起组成的。<ref>{{Cite web|url = http://www.math.uchicago.edu/~may/VIGRE/VIGRE2007/REUPapers/FINALAPP/Calderbank.pdf|title = The RSA Cryptosystem: History, Algorithm, Primes|date = 2007-08-20|accessdate = |website = |publisher = |last = Calderbank|first = Michael}}</ref> 1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个与之等效的算法,但该算法被列入机密,直到1997年才得到公开。<ref>{{Cite web|url=https://www.gchq.gov.uk/sites/default/files/document_files/Cliff%20Cocks%20paper%2019731120.pdf|title=A Note on Non-Secret Encryption|last=Cocks|first=C.C.|authorlink=Clifford Cocks|date=20 November 1973|website=www.gchq.gov.uk|access-date=2017-05-30}}</ref> 對极大整数做[[因数分解]]的难度決定了RSA算法的可靠性。換言之,對一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的-{zh-hans:信息;zh-tw:訊息}-的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式破解。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的-{zh-hans:信息;zh-tw:訊息}-实际上是不能被破解的。 1983年9月12日麻省理工学院在[[美国]]为RSA算法申请了[[专利]]。<ref>{{Citation|title=Cryptographic communications system and method|date=1977-12-14|url=https://patents.google.com/patent/US4405829A/en|accessdate=2018-04-09}}</ref>这个专利于2000年9月21日失效。<ref>{{cite web |url=http://www.rsa.com/press_release.aspx?id=261 |title=RSA Security Releases RSA Encryption Algorithm into Public Domain |accessdate=2010-03-03 |deadurl=yes |archiveurl=https://web.archive.org/web/20070621021111/http://www.rsa.com/press_release.aspx?id=261 |archivedate=June 21, 2007 |df= }}</ref>由于该算法在申请专利前就已经被發表了<ref name="SIAM">{{cite journal |url=http://www.msri.org/people/members/sara/articles/rsa.pdf |journal=SIAM News |volume=36 |issue=5 |date=June 2003 |title=Still Guarding Secrets after Years of Attacks, RSA Earns Accolades for its Founders |first=Sara |last=Robinson }}</ref>,在世界上大多数其它地区这个专利权不被承认。 == 操作 == === 公钥与私钥的产生 === 假設[[愛麗絲與鮑伯|Alice]]想要通過一個不可靠的媒體接收[[愛麗絲與鮑伯|Bob]]的一條私人訊息。她可以用以下的方式來產生一個'''公鑰'''和一個'''私鑰''': #隨意選擇兩個大的[[質數]]<math>p</math>和<math>q</math>,<math>p</math>不等於<math>q</math>,計算<math>N=pq</math>。 #根據[[歐拉函數]],求得<math>r=\varphi (N) = \varphi (p)\varphi (q)=(p-1)(q-1)</math> #選擇一個小于<math>r</math>的整數<math>e</math>,使<math>e</math>与<math>r</math>互质。並求得<math>e</math>关于<math>r</math>的[[模反元素]],命名为<math>d</math>(求<math>d</math>令<math>ed \equiv 1 \pmod{r}</math>)。(模反元素存在,当且仅当<math>e</math>与<math>r</math>互质) #將<math>p</math>和<math>q</math>的記錄銷毀。 <math>(N,e)</math>是公鑰,<math>(N,d)</math>是私鑰。Alice將她的公鑰<math>(N,e)</math>傳給Bob,而將她的私鑰<math>(N,d)</math>藏起來。 === 加密消息 === 假设Bob想给Alice送一个消息<math>m</math>,他知道Alice产生的<math>N</math>和<math>e</math>。他使用起先与Alice约好的格式将<math>m</math>转换为一个小于<math>N</math>的非负整数<math>n</math>,比如他可以将每一个字转换为这个字的[[Unicode]]码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为<math>n</math>。用下面这个公式他可以将<math>n</math>加密为<math>c</math>: : <math> c \equiv n^e \pmod{N} </math> 计算<math>c</math>并不复杂。Bob算出<math>c</math>后就可以将它传递给Alice。 === 解密消息 === Alice得到Bob的消息<math>c</math>后就可以利用她的密钥<math>d</math>来解码。她可以用以下这个公式来将<math>c</math>转换为<math>n</math>: :<math> n \equiv c^d\ (\mathrm{mod}\ N) </math> 得到<math>n</math>后,她可以将原来的信息<math>m</math>重新复原。 解码的原理是 :<math> c^d \equiv n^{e \cdot d}\ (\mathrm{mod}\ N)</math> 已知<math>ed \equiv 1 \pmod{r}</math>,即 <math>ed=1+h\varphi (N)</math>。 由欧拉定理得: : <math>n^{ed} = n^{1 + h\varphi(N)} = n \left(n^{\varphi(N)}\right)^{h} \equiv n (1)^{h} \pmod{N} \equiv n \pmod{N} </math> === 签名消息 === RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个[[散列|散列值]](Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那麼Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。 == 安全 == 假设偷听者乙获得了甲的公钥<math>N</math>和<math>e</math>以及丙的加密消息<math>c</math>,但她无法直接获得甲的密钥<math>d</math>。要获得<math>d</math>,最简单的方法是将<math>N</math>分解为<math>p</math>和<math>q</math>,这样她可以得到[[线性同余方程|同余方程]]<math>de=1 (\mathrm{mod}(p-1)(q-1))</math>并解出<math>d</math>,然后代入解密公式 : <math> c^d \equiv n\ (\mathrm{mod}\ N) </math> 导出''n''(破密)。但至今为止还没有人找到一个多項式時間的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在(见[[因数分解]])。 至今为止也没有人能够证明对<math>N</math>进行因数分解是唯一的从<math>c</math>导出<math>n</math>的方法,直到今天也还没有找到比它更简单的方法。(至少没有公开的方法。) 因此今天一般认为只要<math>N</math>足够大,那么駭客就没有办法了。 假如<math>N</math>的长度小于或等于256[[位]],那么用一台[[个人电脑]]在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的<math>N</math>。一个由Shamir 和Tromer在2003年从理论上构建的硬件TWIRL<ref>{{Cite web|url=http://cs.tau.ac.il/~tromer/twirl/|title=TWIRL (The Weizmann Institute Relation Locator)|accessdate=2018-04-16|last=Tromer|first=Eran|work=cs.tau.ac.il}}</ref>,使人们开始质疑1024位长的N的安全性,目前推荐<math>N</math>的长度至少为2048位。<ref>[http://www.emc.com/emc-plus/rsa-labs/historical/has-the-rsa-algorithm-been-compromised.htm Has the RSA algorithm been compromised as a result of Bernstein's Paper?] What key size should I be using?</ref> 1994年[[彼得·秀爾]](Peter Shor)证明一台[[量子计算机]]可以在多項式時間内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀爾的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法) 假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。 == 实现细节 == === 密钥生成 === 首先要使用概率算法来验证随机产生的大的整数是否質数,这样的算法比较快而且可以消除掉大多数非質数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个質数。 除此之外这样找到的<math>p</math>和<math>q</math>还要满足一定的要求,首先它们不能太靠近,此外<math>p-1</math>或<math>q-1</math>的因子不能太小,否则的话<math>N</math>也可以被很快地分解。 此外寻找質数的算法不能给攻击者任何信息,这些質数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机'''和'''不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出<math>p</math>和<math>q</math>一半的位的话,那么他们就已经可以轻而易举地推算出另一半。 此外密钥<math>d</math>必须足够大,1990年有人证明假如<math>p</math>大于<math>q</math>而小于<math>2q</math>(这是一个很经常的情况)而<math>d<\frac{1}{3} \times N^{\frac{1}{4}}</math>,那么从<math>N</math>和<math>e</math>可以很有效地推算出<math>d</math>。此外<math>e=2</math>永远不应该被使用。 === 速度 === 比起[[DES]]和其它对称算法来說,RSA要慢得多。实际上Bob一般使用一种对称算法来加密他的信息,然后用RSA来加密他的比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息送给Alice。 === 密钥分配 === 和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。理论上Alice和Bob都不会发现Eve在偷听他们的消息。今天人们一般用[[公開金鑰基礎建設|可靠的第三方機構簽發憑證]]来防止这样的攻击。 == 典型密钥长度 == 1997年后开发的系统,用户应使用1024位密钥,[[数字证书认证机构|憑證認證機構]]应用2048位或以上。 == 已公开的或已知的攻击方法 == === 大数因数分解 === 针对RSA最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits)被成功分解,花了五个月时间(约8000 [[每秒指令|MIPS]]年)和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。<ref>http://lukenotricks.blogspot.se/2009/08/solo-desktop-factorization-of-rsa-512.html</ref> RSA-158表示如下: 39505874583265144526419767800614481996020776460304936454139376051579355626529450683609 727842468219535093544305870490251995655335710209799226484977949442955603 = 3388495837466721394368393204672181522815830368604993048084925840555281177<big>×</big> 11658823406671259903148376558383270818131012258146392600439520994131344334162924536139 2009年12月12日,编号为RSA-768(768 bits, 232 digits)数也被成功分解<ref> {{cite web|url= http://eprint.iacr.org/2010/006.pdf | title=Factorization of a 768-bit RSA modulus|date=2010年1月7日 |accessdate=2010年1月10日}} </ref>。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。 RSA-768表示如下: 123018668453011775513049495838496272077285356959533479219732245215172640050726 365751874520219978646938995647494277406384592519255732630345373154826850791702 6122142913461670429214311602221240479274737794080665351419597459856902143413 = 3347807169895689878604416984821269081770479498371376856891 2431388982883793878002287614711652531743087737814467999489<big>×</big> 3674604366679959042824463379962795263227915816434308764267 6032283815739666511279233373417143396810270092798736308917 === 时间攻击 === 1995年有人提出了一种非常意想不到的攻击方式:假如[[愛麗絲與鮑伯|Eve]](竊密者)对[[愛麗絲與鮑伯|Alice]]的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出''d''。這種攻擊方式之所以會成立,主要是因為在進行加密時所進行的模指數運算是一個位元一個位元進行的,而位元為1所花的運算比位元為0的運算要多很多,因此若能得到多組訊息與其加密時間,就會有機會可以反推出私鑰的內容。<ref>[http://crypto.stanford.edu/~dabo/papers/ssl-timing.pdf Remote timing attacks are practical. ]. SSYM'03 Proceedings of the 12th conference on USENIX Security Symposium.</ref> == 相關條目 == * [[公开密钥加密]] * [[量子電腦]] * [[秀爾演算法]] * [[Miller-Rabin 质数测试]] * [[快速幂]] * [[扩展欧几里得算法]] == 参考文献 == {{Reflist}} == 外部链接 == * [http://www.rsasecurity.com RSA, The Security Division of EMC] * [http://www.guideep.com/read?guide=5676830073815040 RSA算法详解] {{密碼學|public-key}} [[Category:密码学]] [[Category:算法]] [[Category:数字签名方案]]
本页使用的模板:
Template:Citation
(
查看源代码
)
Template:Cite journal
(
查看源代码
)
Template:Cite web
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
Template:Reflist
(
查看源代码
)
Template:多個問題
(
查看源代码
)
Template:密碼學
(
查看源代码
)
返回
RSA加密演算法
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息