标题：RSA算法
概述
RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥，是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。  
在公开密钥密码体制中，加密密钥（即公开密钥）PK是公开信息，而解密密钥（即秘密密钥）SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然秘密密钥SK是由公开密钥PK决定的，但却不能根据PK计算出SK。正是基于这种理论，1978年出现了著名的RSA算法，它通常是先生成一对RSA 密钥，其中之一是保密密钥，由用户保存；另一个为公开密钥，可对外公开，甚至可在网络服务器中注册。为提高保密强度，RSA密钥至少为500位长，一般推荐使用1024位。这就使加密的计算量很大。为减少计算量，在传送信息时，常采用传统加密方法与公开密钥加密方法相结合的方式，即信息采用改进的DES或IDEA对话密钥加密，然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后，用不同的密钥解密并可核对信息摘要。
RSA算法是第一个能同时用于加密和数字签名的算法，也易于理解和操作。RSA是被研究得最广泛的公钥算法，从提出到现在的三十多年里，经历了各种攻击的考验，逐渐为人们接受，普遍认为是目前最优秀的公钥方案之一。
解释
RSA的安全性依赖于大数的因子分解，但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何，而且密码学界多数人士倾向于因子分解不是NPC问题。
RSA的缺点主要有：A）产生密钥很麻烦，受到素数产生技术的限制，因而难以做到一次一密。B）分组长度太大，为保证安全性，n 至少也要 600bits以上，使运算代价很高，尤其是速度较慢，较对称密码算法慢几个数量级；且随着大数分解技术的发展，这个长度还在增加，不利于数据格式的标准化。目前，SET(Secure Electronic Transaction）协议中要求CA采用2048bits长的密钥，其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高，增加很快。下表列出了对同一安全级别所对应的密钥长度。
保密级别
对称密钥长度（bit）
RSA密钥长度（bit）
ECC密钥长度（bit）
保密年限
80
80
1024
160
2010
112
112
2048
224
2030
128
128
3072
256
2040
192
192
7680
384
2080
256
256
15360
512
2120
这种算法1978年就出现了，它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作，也很流行。算法的名字以发明者的名字命名：Ron Rivest,AdiShamir 和Leonard Adleman。早在1973年，英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密，直到1998年才公诸于世。
RSA算法是一种非对称密码算法，所谓非对称，就是指该算法需要一对密钥，使用其中一个加密，则需要用另一个才能解密。
RSA的算法涉及三个参数，n、e1、e2。
其中，n是两个大质数p、q的积，n的二进制表示时所占用的位数，就是所谓的密钥长度。
e1和e2是一对相关的值，e1可以任意取，但要求e1与(p-1）*(q-1）互质；再选择e2，要求（e2*e1）mod((p-1）*(q-1））=1。
（n，e1）,(n，e2）就是密钥对。其中 (n，e1）为公钥，(n，e2）为私钥。[1]
RSA加解密的算法完全相同，设A为明文，B为密文，则：A=B^e2 mod n；B=A^e1 mod n；（公钥加密体制中，一般用公钥加密，私钥解密） 
e1和e2可以互换使用，即：
A=B^e2 mod n；B=A^e1 mod n;
安全性
RSA的安全性依赖于大数分解，但是否等同于大数分解一直未能得到理论上的证明，因为没有证明破解 RSA就一定需要作大数分解。假设存在一种无须分解大数的算法，那它肯定可以修改成为大数分解算法。目前， RSA 的一些变种算法已被证明等价于大数分解。不管怎样，分解n是最显然的攻击方法。现在，人们已能分解多个十进制位的大素数。因此，模数n 必须选大一些，因具体适用情况而定。
速度
由于进行的都是大数计算，使得RSA最快的情况也比DES慢上好几倍，无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。
密文攻击
RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装（Blind），让拥有私钥的实体签署。然后，经过计算就可得到它所想要的信息。实际上，攻击利用的都是同一个弱点，即存在这样一个事实：乘幂保留了输入的乘法结构：
（XM)^d mod n = X^d *M^d mod n
前面已经提到，这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题，主要措施有两条：一条是采用好的公钥协议，保证工作过程中实体不对其他实体任意产生的信息解密，不对自己一无所知的信息签名；另一条是决不对陌生人送来的随机文档签名，签名时首先使用One-Way HashFunction 对文档作HASH处理，或同时使用不同的签名算法。
模数攻击
若系统中共有一个模数，只是不同的人拥有不同的e和d，系统将是危险的。最普遍的情况是同一信息用不同的公钥加密，这些公钥共模而且互质，那么该信息无需私钥就可得到恢复。设P为信息明文，两个加密密钥为e1和e2，公共模数是n，则：
C1 = P^e1mod n
C2 = P^e2 mod n
密码分析者知道n、e1、e2、C1和C2，就能得到P。
因为e1和e2互质，故用Euclidean算法能找到r和s，满足：
r * e1 + s * e2 = 1
假设r为负数，需再用Euclidean算法计算C1^(-1），则
（C1^(-1））^(-r) * C2^s = P mod n
另外，还有其它几种利用公共模数攻击的方法。总之，如果知道给定模数的一对e和d，一是有利于攻击者分解模数，一是有利于攻击者计算出其它成对的e’和d’，而无需分解模数。解决办法只有一个，那就是不要共享模数n。
RSA的小指数攻击。有一种提高 RSA速度的建议是使公钥e取较小的值，这样会使加密变得易于实现，速度有
所提高。但这样作是不安全的，对付办法就是e和d都取较大的值。
RSA的边信道攻击
针对RSA的边信道攻击目前大多处于实验室阶段，边信道攻击并不是直接对RSA的算法本身进行攻击，而是针对计算RSA的设备的攻击。目前的边信道攻击一般是针对硬件实现RSA算法的芯片进行的。[2]
目前国内外防范公钥密码边信道攻击主要以牺牲效率为代价。公钥密码的实现效率一直是信息安全系统的应用瓶颈，进一步损害算法效率，必将造成信息系统性能恶化。因此，寻找高效又抗功耗分析的公钥算法实现途径，并结合其他层面抗攻击手段，使密码器件运行效率、功耗、面积等综合因素实现最优化，无疑是极富挑战性的课题，不仅对抗边信道攻击理论研究有重要价值，而且对广泛应用的智能卡（尤其是银行卡、手机SIM或USIM卡）、各种硬件密码电子设备、有时也包括软件实现的密码算法的安全应用无疑具有极大的现实意义。
边信道攻击以功耗分析和公钥密码为研究重点，在对各种类型、系列、型号、规模的基本电路运行过程中的功耗轨迹进行大量研究、掌握其变化规律的基础上，继续研究电路工艺、结构、算法、协议对功耗轨迹的影响，经过一系列处理，从中提取出密钥信息。目标是针对功耗分析攻击机理，提出抗功耗分析的综合优化新方法，并尽量兼顾算法效率。
边信道攻击研究涉及密码学、信息论、算法理论和噪声理论，还涉及硬件电路设计、通信、信号处理、统计分析、模式识别等诸多技术。
目前，边信道攻击在若干关键问题研究上已取得了实质性进展。
目前国内已经有大学的研究者提出了公钥密码等功耗编码的综合优化方法，佐证了安全性和效率的可兼顾性。截至目前，研究团队已针对著名公钥密码算法RSA的多种实现算法和方式成功实施了计时攻击、简单功耗和简单差分功耗分析攻击，实验验证了多种防御方法，包括 “等功耗编码”方法的有效性，并完成了大规模功耗分析自动测试平台的自主开发。
RSA算法的缺点
1）产生密钥很麻烦，受到素数产生技术的限制，因而难以做到一次一密。
2）安全性，RSA的安全性依赖于大数的因子分解，但并没有从理论上证明破译RSA的难度与大数分解难度等价，而且密码学界多数人士倾向于因子分解不是NPC问题。目前，人们已能分解140多个十进制位的大素数，这就要求使用更长的密钥，速度更慢；另外，目前人们正在积极寻找攻击RSA的方法，如选择密文攻击，一般攻击者是将某一信息作一下伪装（Blind），让拥有私钥的实体签署。然后，经过计算就可得到它所想要的信息。实际上，攻击利用的都是同一个弱点，即存在这样一个事实：乘幂保留了输入的乘法结构：
（XM)d = Xd *Md mod n 
前面已经提到，这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题，主要措施有两条：一条是采用好的公钥协议，保证工作过程中实体不对其他实体任意产生的信息解密，不对自己一无所知的信息签名；另一条是决不对陌生人送来的随机文档签名，签名时首先使用One-Way Hash Function对文档作HASH处理，或同时使用不同的签名算法。除了利用公共模数，人们还尝试一些利用解密指数或φ（n）等等攻击. 
3）速度太慢，由于RSA 的分组长度太大，为保证安全性，n 至少也要 600 bitx以上，使运算代价很高，尤其是速度较慢，较对称密码算法慢几个数量级；且随着大数分解技术的发展，这个长度还在增加，不利于数据格式的标准化。目前，SET(Secure Electronic Transaction）协议中要求CA采用2048比特长的密钥，其他实体使用1024比特的密钥。为了速度问题，目前人们广泛使用单，公钥密码结合使用的方法，优缺点互补：单钥密码加密速度快，人们用它来加密较长的文件，然后用RSA来给文件密钥加密，极好的解决了单钥密码的密钥分发问题。
已知的攻击进度
针对RSA最流行的攻击一般是基于大数因数分解。1999年，RSA-155（512 bits）被成功分解，花了五个月时间（约8000 MIPS 年）和224 CPU hours 在一台有3.2G中央内存的Cray C916计算机上完成。
2002年，RSA-158也被成功因数分解。
2009年12月12日，编号为 RSA-768 （768 bits,232 digits）数也被成功分解。
北京时间2月15日上午消息，据《纽约时报》周二报道，欧美数学家和密码学家偶然发现，目前被全世界广泛应用的公钥加密算法RSA存在漏洞。
他们发现，在700万个实验样本中有2.7万个公钥并不是按理论随机产生的。也就是说，或许有人可以找出产生公钥的秘密质数。
该研究项目是由美国独立密码学家James P.Hughes和荷兰数学家Arjen K. Lenstra牵头的。他们的报告称：“我们发现绝大多数公钥都是按理论产生的，但是每一千个公钥中会有两个存在安全隐患。”
报告称，为防止有人利用该漏洞，有问题的公钥已从公众访问的数据库中移除。为确保系统的安全性，网站需要在终端做出改变。
数论知识
RSA用到的公式和定理
一、数和互为素数
任何大于1的整数a能被因式分解为如下唯一形式：
a=p1p2…pl(p1,p2，…，pl为素数）
二、模运算
①{[a(mod n)]×[b(mod n)]}modn≡（a×b)(mod n)
②如果（a×b）=（a×c）（mod n),a与n互素，则
b=c(mod n)
三、费马定理
若p是素数，a与p互素，则
a^(p-1）=1 mod p
四、欧拉定理
欧拉函数φ（n）表示不大于n且与n互素的正整数的个数。
当n是素数，φ（n)=n-1。n=pq,p,q均为素数时，则φ（n)= φ（p）φ（q)=(p-1）（q-1）。
对于互素的a和n，有a^φ（n)=1(mod n)