从网上看到不少关于RSA的文章,但感觉多处语焉不详,甚至有概念上模糊的地方,因此把自己的理解写出来。
首先的问题是:RSA是啥
简而言之,这是一种用于加密和解密的算法。也就是说,与传统的对称加密算法相同,都用来把一段信息转换为另一种样子,明文变密文,或者密文变明文,防止信息内容被其他人看到。但不同之处在于,RSA并非使用单一密钥,而是使用“密钥对”,是俩密钥,分别叫做公钥和私钥。所以转换的过程变成了:如果用公钥加密,那么得用私钥解密,反之,如果用私钥加密,那么必须用公钥解密。两个不同的密钥同时在一次加密和解密中使用,可能这就是“非对称”名称的来源吧。
其次,RSA的密钥对与传统的对称加密系统的密钥有什么区别
RSA使用的密钥对中的俩密钥是不同的,一个叫公钥,一个叫私钥。公钥可以公开,而私钥必须保密。私钥保密的意思是,除了自己,私钥不能给任何人。而在对称加密系统中,信息发送方(加密方)和信息接收方(解密方)必须共享密钥,否则,无法解密了。两个密钥虽然不同,但是二者具有关联关系。但从其中之一推导出另外一个,从目前看,在工程上是没有实际意义的。这些特性也就导致RSA算法被在一些特殊用途中使用,而不仅仅是保证信息的秘密性。
第三,RSA的其它用途
对消息进行签名。签名的目的并非保证消息的秘密性,而是保证消息的完整性和不可抵赖性。比如,A传给B一份报价单。报价单的内容并非是保密的,但A需要保证在传输过程中报价单的任何数据都没有被改动过,同时,B以后要有方法证明报价单是A发送的。那么,他们会这样做。首先,A用一个工具计算报价单文件的数据摘要,得到X,然后用自己的私钥对X加密得到EX,并把报价单文件、EX、自己的公钥一起发送给B。B接收完成后,首先用同样的方法计算报价单文件的数据摘要,得到Y,然后将EX用A的公钥解密,得到DEX。这时,比较Y与DEX是否相同就能断言报价单文件是否被修改过。另外,由于只有用A的私钥加密的信息才能用A的公钥解密,而私钥是秘密的,所以,以后A也不能否认报价单是他发给B的。当然这只是个例子,因为这种操作过程无法抵御中间人攻击(大概的过程就是C做为攻击者截获A、B之间的所有通讯量,当他得到A发给B的东西时,先修改报价单,然后计算新的数据摘要newX,并用自己的私钥加密newX得到newEX,再将修改过的报价单、newEX和自己的公钥一起发送给B。此时B获得的是修改过的报价单,但他获得的所有信息是能够通过互相验证的,所以他发现不了问题),但这即使另外的话题了。
其它几项相关问题
首先,使用较短密钥(比如512bit或更短)的RSA算法已经被破解,是不安全的。
第二,目前来看使用1024bit或更长的密钥的RSA算法在工程上是安全的。多数人认为,如果密钥够长,比如超过2048bit,那么在相当长一段时间内,RSA算法是安全的。
第三,RSA算法的速度相对较慢,因此并不适合处理长消息,这也导致目前RSA应用的一些特点。比如,常用对称加密算法加密消息,然后用RSA加密在对称加密算法中使用的密钥。
第四,现在尚没有人找到安全的攻击RSA的方法。
最后,在RSA算法中,仍然有许多问题在数学上尚未有定论。
维基百科上的RSA介绍很好: http://zh.wikipedia.org/zh-cn/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
不对的地方,请指正。