RSA 简介
1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种非对称加密算法(公钥密码算法)用他们三个人的名字命名,叫做 RSA 算法。
非对称加密
非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(公钥)和私有密钥(私钥)。
- 公钥:可以被任何人知道,用于加密消息或者验证签名。
- 私钥:只有接收者本人知道,用于解密消息或者签名。
- 不对称性:用于加密消息的密钥不能用来解密消息。
RSA 原理
根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA 算法描述
RSA 密钥
RSA 加密算法的密钥涉及到三个数,分别是 n,e,d。其中 (e,n) 构成公钥,(d,n) 构成私钥。
1.生成大质数 p 和 q
p 和 q 是两个很大的素数,通常 p 和 q 的大小为 1024 比特,太小的话容易被破译,太大的话会影响计算速度。
首先通过伪随机数生成器生成两个大数,由于伪随机数生成器不能直接生成素数,所以需要通过不断的重试得到 p 和 q。
2.计算公共模数 n
生成 n 的公式如下:
3.计算欧拉函数 φ(n) = (p-1)(q-1)
4.计算公钥 e
随机选取整数 e 就是用来加密的公钥,e 需要满足以下条件:
- 1 < e < φ(n),通过伪随机数生成器生成。
- gcd(e, φ(n)) = 1,(gcd 为欧几里得算法)即两个数的最大公约数为 1。(注意:e 的选取是很容易的,例如,所有大于p和q的素数都可用)
5.计算私钥 d
生成 d 的公式如下:
解密的钥私 d 满足 d*e mod φ(n) = 1,即 d*e = kφ(n) + 1 (其中 k 是大于等于 1 的整数)。所以,只要知道 e 和 φ(n),则很容易计算出 d。
RSA 加密
成功生成密钥后,对外公开公钥(e, n),然后即可通过如下公式进行 RSA 加密(其中 c 表示加密后的密文,m 表示待加密的明文):
RSA 解密
成功生成密钥后,只有接收者本人拥有私钥(d, n),然后即可通过如下公式进行 RSA 解密(其中 m 表示解密后的明文,c 表示待解密的密文,):
RSA 安全性
- n = p * q
- φ(n) = (p-1)(q-1)
- d*e mod φ(n) = 1
如果破解者尝试破解 RSA 加密后的密文则需要破解密钥 d,由公式 3 可知如果知道 φ(n) 那么就可以轻易的求出 d。而 φ(n) 是通过公式 2 计算出来的,所以问题转化为求 p 和 q,公式 1 中 n 又是已知的,所以问题最终转化为对大整数 n 进行质因素分解。(p 和 q 泄露等同于密码泄露)
目前来说,还没有有效的对大整数进行质因素分解的高效算法,所以目前来说RSA算法还是很安全的,但是一旦有这样的算法出现,那么RSA将会很容易被攻破。
RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解 140 多个十进制位的大素数。因此,模数 n 必须选大些,视具体适用情况而定。
官方推荐:1024bits 的 RSA 算法不应该被用于新的用途。2048bits 的 RSA 算法可以用到 2030 年,4096bits 的算法可以用到2031年。
RSA 运算速度
RSA 算法的保密强度随其密钥的长度增加而增强。但是,密钥越长,其加解密所耗用的时间也越长。因此,要根据所保护信息的敏感程度与攻击者破解所要花费的代价值不值得以及系统所要求的反应时间来综合考虑。
由于进行的都是大数计算,使得 RSA 最快的情况也比 DES 慢上好几倍,无论是软件还是硬件实现,速度一直是 RSA 的缺陷,一般来说只用于少量数据加密,RSA 的速度比对应同样安全级别的对称加密算法要慢 1000 倍左右。所以常使用 RSA 算法传输对称加密的密钥,然后双方使用同等安全的对称加密算法进行数据的传输,这就是混合密码系统。