RSA加密演算法

title: 操作.
title: 公钥与私钥的产生.
content: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:  formula_20是公钥,formula_21是私钥。Alice将她的公钥formula_20传给Bob,而将她的私钥formula_21藏起来。
title: RSA 算法的加密原理是什么?.
content: 首选取两个互质数 p和q, 乘法计算p * q 得到 N。  然后计算出欧拉φ(N): φ函数φ(N)是小于或等于N的正整数中与N互质的数的数目。 根据欧拉公式,由于p和q都是质数,故 φ(N) = (p-1)*(q-1)  这时候我们随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。 接着我们计算e对φ(n)的模逆元得到d: e*d ≡ 1 (mod φ(n)) 这个公式简单的说就是 e*d除以φ(N)得到的余数为1,这个公式可以转换成 ed%((p-1)(q-1))=1 => ed=k(p-1)(q-1)+1  于是,RSA公钥为(e,n),私钥为(d,n)。  加密原文x得到密文m=x^e%n  解密公式为x=m^d%n  证明解密逻辑:  证明x=m^d%n,就是证明m^d%n-x=0 m^d%n-x //如何=0,往下分解:  =(x^e%n)^d%n-x //代入加密原文  =x^ed%n-x //根据模运算公式:a ^ b % p = ((a % p)^b) % p  =x^(k(p-1)(q-1)+1)%n-x //代入ed的值  =x*(x^(k(p-1)(q-1))-1)%n //x挪到括号外,条件x<n  根据费马小定理公式:a^(p-1) - 1可以被p整除。 所以x^(k(q-1))^(p-1) - 1 可以被p整除,x^(k(p-1))^(q-1) - 1 可以被q整除。 所以x^(k(p-1)(q-1)) - 1 可以被pq整除,也就是可以被N整除。 就是x*(x^(k(p-1)(q-1))-1)%n=0,证明完成。
title: 加密消息.
content: 假设Bob想给Alice送一个消息formula_24,他知道Alice产生的formula_25和formula_8。他使用起先与Alice约好的格式将formula_24转换为一个小于formula_25的非负整数formula_29,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为formula_29。用下面这个公式他可以将formula_29加密为formula_32:  计算formula_32并不复杂。Bob算出formula_32后就可以将它传递给Alice。
title: 解密消息.
content: Alice得到Bob的消息formula_32后就可以利用她的密钥formula_13来解码。她可以用以下这个公式来将formula_32转换为formula_29:  得到formula_29后,她可以将原来的信息formula_24重新复原。  解码的原理是  已知formula_15,即 formula_45。 由欧拉定理得:
title: 签名消息.
content: RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。
title: 安全.
content: 假设偷听者Eve获得了Alice的公钥formula_25和formula_8以及Bob的加密消息formula_32,但她无法直接获得Alice的密钥formula_13。要获得formula_13,最简单的方法是将formula_25分解为formula_1和formula_2,这样她可以得到同余方程formula_55并解出formula_13,然后代入解密公式 导出"n"(破密)。但至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在(见因数分解)。  至今为止也没有人能够证明对formula_25进行因数分解是唯一的从formula_32导出formula_29的方法,直到今天也还没有找到比它更简单的方法。(至少没有公开的方法。)  因此今天一般认为只要formula_25足够大,那么骇客就没有办法了。  假如formula_25的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的formula_25。一个由Shamir 和Tromer在2003年从理论上构建的硬件TWIRL,使人们开始质疑1024位长的N的安全性,目前推荐formula_25的长度至少为2048位。  1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法)  假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。
title: 实现细节.
title: 密钥生成.
content: 首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。  除此之外这样找到的formula_1和formula_2还要满足一定的要求,首先它们不能太靠近,此外formula_67或formula_68的因子不能太小,否则的话formula_25也可以被很快地分解。  此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出formula_1和formula_2一半的位的话,那么他们就已经可以轻而易举地推算出另一半。  此外密钥formula_13必须足够大,1990年有人证明假如formula_1大于formula_2而小于formula_75(这是一个很常见的情况)而formula_76,那么从formula_25和formula_8可以很有效地推算出formula_13。此外formula_80永远不应该被使用。
title: 速度.
content: 比起AES、3DES和其它对称算法来说,RSA要慢得多。实际的运用(如TLS)一般结合了对称加密(如AES)和非对称加密(如RSA)两者。
title: 密钥分配.
content: 和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。理论上Alice和Bob都不会发现Eve在偷听他们的消息。今天人们一般用可靠的第三方机构签发凭证来防止这样的攻击。
title: 典型密钥长度.
content: NIST建议的RSA密钥长度为至少2048位元。
title: 已公开的或已知的攻击方法.
title: 大数因数分解.
content: 针对RSA最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits)被成功分解,花了五个月时间(约8000 MIPS年)和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。  RSA-158表示如下:  2009年12月12日,编号为RSA-768(768 bits, 232 digits)数也被成功分解。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。  RSA-768表示如下:
title: 时间攻击.
content: 1995年有人提出了一种非常意想不到的攻击方式:假如Eve(窃密者)对Alice的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出"d"。这种攻击方式之所以会成立,主要是因为在进行加密时所进行的模指数运算是一个位元一个位元进行的,而位元为1所花的运算比位元为0的运算要多很多,因此若能得到多组讯息与其加密时间,就会有机会可以反推出私钥的内容。

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