1. RSA算法用途
主要用于数据加密、数字签名、密钥交换、身份验证和数字证书等安全应用。
- 理解RSA算法需要的数论基础包括质数、模运算、欧拉函数、模反函数。
- 安全性依赖于大数的质因数分解困难性,目前尚未找到有效的算法能够快速分解大数。
- 相对于对称加密来说,非对称加密算法的缺点是加密和解密的效率相对较低。
2. 加密方法
2.1.加密步骤
- 选择两个大素数p和q,并计算它们的乘积n:
n = p * q
。 - 计算欧拉函数φ(n):
φ(n) = (p - 1) * (q - 1)
。 - 选择一个整数e,使得
1 < e < φ(n)
,且e与φ(n)
互质: e称为公钥的指数。 - 计算e的模反函数d: 即找到一个整数d,使得
(e * d) mod φ(n) = 1
。d称为私钥的指数。 - 加密: 对于要加密的信息m,计算密文 c = m e m o d n c = m^e \ mod \ n c=me mod n。
- 公钥(e, n)进行加密,私钥(d, n)用于解密
2.2.加密举例
- 假设我们选择的素数为
p = 61,q = 53
,那么n = p * q = 61 * 53 = 3233。 - 欧拉函数
φ(n) = (p - 1) * (q - 1) = 60 * 52 = 3120
。 - 选择一个与φ(n)互质的整数e,这里我们选择
e = 17
。接下来需要计算e的模反函数d,使得(d * e) mod φ(n) = 1
。 - 通过扩展的欧几里得算法可以计算出d的值为
d = 2753
。 - 假设我们要加密的信息为
m = 123
,加密过程为:
c = m e m o d n = 12 3 17 m o d 3233 = 855 c = m^e \mod n = 123^{17} \mod 3233 = 855 c=memodn=12317mod3233=855。
3. 解密方法
3.1.解密步骤
使用私钥(d, n)对密文c进行解密: m = c d m o d n m = c^d \mod n m=cdmodn。
3.2.解密举例
m = 85 5 2753 m o d 3233 = 123 m = 855^{2753} \mod 3233 = 123 m=8552753mod3233=123
4. 基于非对称加密的应用
4.1.数字签名
RSA数字签名的过程如下:
1. 生成密钥对:与RSA加密相同,首先生成一对公钥和私钥。
2. 签名:假设要对消息M进行签名,签名者使用自己的私钥对消息进行签名。签名过程如下:
- 将消息M使用哈希函数(如SHA-256)进行哈希处理,得到消息摘要H(M)。
- 使用私钥对消息摘要H(M)进行加密,得到签名S,即 S = H(M)^d mod n,其中d是私钥的指数,n是私钥的模数。
3. 验证签名:验证者收到消息M和签名S后,使用签名者的公钥进行验证签名的真实性。验证过程如下:
- 使用公钥对签名S进行解密,得到解密后的消息摘要H'(M),即 H'(M) = S^e mod n,其中e是公钥的指数,n是公钥的模数。
- 将收到的消息M使用相同的哈希函数进行哈希处理,得到消息摘要H'(M)。
- 比较解密后的消息摘要H'(M)与哈希处理后的消息摘要H(M)是否相等,若相等则验证通过,否则验证失败。
4.2.密钥交换
1. 生成密钥对:Alice和Bob各自生成一对公钥和私钥。
2. 公钥交换:Alice和Bob将各自的公钥发送给对方。
3. 密钥协商:假设Alice想要向Bob发送加密消息。她从Bob收到的公钥加密一个会话密钥(对称密钥),然后将加密后的密钥发送给Bob。
4. 密钥解密:Bob收到Alice发送的加密会话密钥后,使用自己的私钥解密得到会话密钥。
5. 加密通信:Alice和Bob使用会话密钥进行加密和解密消息的通信。由于会话密钥是对称密钥,加密和解密的速度比使用公钥加密快得多。
4.3.身份验证
假设Alice想要验证Bob的身份。
1. Bob首先生成一对RSA密钥,包括公钥和私钥。Bob将自己的公钥发送给Alice。
2. Alice收到Bob的公钥后,使用该公钥对一条消息进行加密,并发送给Bob。
3. Bob收到加密后的消息后,使用自己的私钥对消息进行解密。
4. 如果解密后的消息与Alice发送的消息匹配,则Bob成功验证了自己的身份,因为只有Bob拥有自己的私钥才能解密该消息。
4.4.数字证书
1. 生成密钥对:首先,需要生成一对RSA密钥,包括一个私钥和一个公钥。私钥由证书颁发机构(CA)保存,并用于签署数字证书。公钥被包含在数字证书中,用于验证证书的真实性。
2. 创建证书请求:证书请求是包含有关实体(例如网站或个人)信息的文件,用于向CA请求数字证书。证书请求包括以下信息:
- 实体的公钥。
- 实体的信息,如名称、地址等。
- 证书的有效期限。
3. 证书颁发机构验证:CA接收到证书请求后,将验证实体的身份。这可能涉及到检查实体的身份证明文件或通过其他方式验证其身份。
4. 签署数字证书:如果实体的身份验证通过,CA将使用自己的私钥对数字证书进行签名。签名的过程通常包括以下步骤:
- 使用哈希函数对证书的内容进行哈希处理,得到消息摘要。
- 使用CA的私钥对消息摘要进行加密,生成数字签名。
- 将数字签名附加到证书中。
5. 颁发数字证书:CA颁发包含实体公钥和CA数字签名的数字证书。
6. 验证数字证书:实体收到数字证书后,可以使用CA的公钥对数字签名进行验证。验证的过程包括以下步骤:
- 使用CA的公钥对数字签名进行解密,得到消息摘要。
- 使用相同的哈希函数对证书的内容进行哈希处理,得到另一个消息摘要。
- 比较解密后的消息摘要和哈希处理后的消息摘要,如果相等,则证书有效。
5. 代码验证
仅供学习使用
import random
def gcd(a, b):
# 辗转相除法求最大公约数
while b != 0:
a, b = b, a % b
return a
def mod_inverse(a, m):
# 求模反函数
m0, x0, x1 = m, 0, 1
while a > 1:
q = a // m
m, a = a % m, m
x0, x1 = x1 - q * x0, x0
return x1 + m0 if x1 < 0 else x1
def encrypt(public_key, message):
# RSA加密算法
e, n = public_key
return pow(message, e, n)
def decrypt(private_key, cipher):
# RSA解密算法
d, n = private_key
return pow(cipher, d, n)
# 设置明文m,公钥e,私钥d
m = 123
e = 17
p = 61
q = 53
n = p * q
# 生成密钥对
phi = (p - 1) * (q - 1)
d = mod_inverse(e, phi)
public_key = (e, n)
private_key = (d, n)
# 加密消息
cipher = encrypt(public_key, m)
print("明文m:", m)
print("p:", p)
print("q:", q)
print("e:", e)
print("n:", n)
print("密文:", cipher)
# 解密消息
decrypted_message = decrypt(private_key, cipher)
print("解密后的消息:", decrypted_message)
---
结果输出:
明文m: 123
p: 61
q: 53
n=p*q: 3233
e: 17
密文: 855
解密后的消息: 123