1、RSA简介
RSA加密算法是目前最广为使用的一种非对称加密算法(又称公开密钥加密算法)。
相对于对称加密算法,非对称加密算法是一种加密密钥和解密密钥不同的加密算法,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”
的密码体制。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK.
2、RSA加密算法的原理
RSA加密算法的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
2.1 RSA中涉及到的数论知识
质数:
- 又称素数,一个大于1的正整数,除了1和它自身外,不能被其他整数整除。
互质关系:
- 如果两个正整数,除了1以外没有其他公因子,就称这两个数是互质关系。
- 推论:
- 任意两个质数构成互质关系。
- 大数是质数的两个数一定是互质关系。
同余:
- 给定一个正整数m,若存在两个整数a和b满足a-b能被m整除,即(a-b) mod m = 0, 那么就称整数a与b对模m同余,记作 :a≡b(mod m) , 同时又成立:a mod m = b
欧拉函数:
-
定义:对于给定正整数n,计算在小于等于n的正整数中,有多少个数与n构成互质关系。如:φ(8) = 4 .
-
推论:
-
若n可以拆成两个互质的正整数之积,如 n = p × q ,则有:φ(n) = φ(pq) = φ§φ(q)
-
对质数m , 有:φ(m) = m-1 .
-
若n可以拆解成两个质数p和q的积,则:φ(n) = (p-1)(q-1) .
-
欧拉定理:如果两个正整数a和n互质,则n的欧拉函数φ(n)有:
a φ ( n ) ≡ 1 ( m o d n ) a^φ(n)≡1(mod n) aφ(n)≡1(modn)
意味着 a的φ(n)次方被n除的余数为1.
-
模反元素
- 如果两个正整数a和n互质,则一定有整数b,使得:ab-1能被n整除,或者说ab被n整除的余数是1,记作:ab≡1(mod n)
2.2 RSA的加密与解密过程
当甲想要通过RSA加密算法把某信息发送给乙时,会经过以下过程:
-
乙生成一对公私钥。
- 随机选择两个不相等的质数p和q(如61和35)
- 计算p和q的乘积n=p×q=61×35=3233
- 根据欧拉函数,φ(n) = (p-1)(q-1) = 3120
- 随机选择一个整数e,满足:1 < e < φ(n), 且e与φ(n)互质。如e = 17
- 因为e与φ(n)互质,根据φ(n)来计算e的一个模反元素d:
- 由相关公式可得:ed≡1(mod φ(n))
- 所以有:(ed-1) / φ(n) = k , k为任意正整数。
- 上述式子等价于 ed - 1 = kφ(n)
- 带入相关数据可得:17d - 1 = 3120k
- 该二元一次方程的一组解为:(d, k) = (2753, 15)
- 将n和e封装成公钥,n和d封装成私钥。即PK = (n, e) = (3233, 17),SK = (3223, 2753). 其中n的长度就是密钥长度,如3233写成二迚制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位
-
乙把公钥给到甲(公钥泄漏也没有关系)。
-
甲使用公钥对明文m进行加密得到密文c。
-
设待加密的明文m = 65
-
利用收到的公钥(n, e) = (3233, 17)对明文进行加密:
根 据 公 式 : m e ≡ c ( m o d n ) 根据公式:m^e ≡ c \ (mod \ n) 根据公式:me≡c (mod n)得 : c = m e m o d n = 6 5 17 m o d 3233 = 2790 得: c = m^e \ mod \ n = 65^{17} \ mod \ 3233 = 2790 得:c=me mod n=6517 mod 3233=2790
-
-
甲把密文c发送给乙方。
-
乙使用私钥对密文c进行解密得到明文m。
根 据 公 式 : c d ≡ m ( m o d n ) 根据公式:c^d ≡ m\ (mod \ n) 根据公式:cd≡m (mod n)
得 : m = c d m o d n = 279 0 2753 m o d 3233 = 65 得: m = c^d \ mod \ n = 2790^{2753} \ mod \ 3233 = 65 得:m=cd mod n=27902753 mod 3233=65
3、RSA签名体制
RSA的签名体制同样包含3个算法:KeyGen(密钥生成算法), Sign(签名算法),Verify(验证算法)。
- KeyGen(λ) -> (PK, SK)。 密钥生成算法以安全常数λ作为输入,输出一个公钥PK和一个私钥SK。
- Sign(SK, M) -> σ 。签名算法以私钥SK和待签名的消息M作为输入,输出签名σ。在RSA签名体制的签名算法中,σ = M^d mod n 。
- Verify(PK, σ , M) -> b 。验证算法以公钥PK,签名σ 和消息M作为输入,输出一个比特值b。b=0表示验证不通过,b=1表示验证通过。验证算法的大致流程:
- 计算M’ = σ^e mod n
- 对比M与M’,相等则输出b=1,反之输出b=0
综上可知,在RSA签名体制中,私钥SK用于对数据进行签名,公钥PK用于对签名进行验证。
4、总结
对于RSA加密算法:
- 可以用来做加解密(慎用):
- 密钥的产生很麻烦。
- 密钥位数n建议至少1024比特。
- 适合小原文加密,一次运算的原文长度 < n。
- 非常非常慢。
- 不具有向前安全性。
- 私钥必须保密:知道私钥可以计算出公钥,但知道公钥无法计算出私钥。
- 经常用来做认证:签名/验签
- 具有抗抵赖性。