rsa原理及其应用
rsa算法
0x01 原理
1.1 相关概念
RSA(Rivest-Shamir-Adleman)加密算法是一种基于数论的非实时加密算法,广泛用于安全通信。RSA算法的核心依赖于大整数分解的困难性
1.2 非对称加密
RSA是一种非加密加密算法,它使用公钥进行加密,私钥进行解密。非加密加密的优势在于,公钥可以公开(存储于公钥数据库PKDB),而私钥仅保留给接收者。这种设计使得消息安全传输,而消耗共享加密密钥。
1.3 素数(素数)
RSA依赖于两个大素数的乘积。素数是指只能被1和自身整除的整数。两个大素数的乘积积极难以进行因数分解,而这一问题构成了RSA的安全基础。
1.4 模运算(Modulo)
余数 RSA 中广泛使用模破坏。模破坏是一种余数破坏,定义为一个整数除以另一个整数后得到的数。在 RSA 中,模破坏对加密和解密过程的避免可以在有限的数值范围内进行,从而避免溢出和精度问题。
1.5欧几里得函数
给定两个非负整数 a 和 b(假设 a ≥ b),欧几里得算法基于以下原理:
- 如果 a = b,那么结果就是 a(或 b)。
- 如果 a = 0,那么结果是 b,反之亦然。
- 如果 a ≠ b,那么可以用较小的那个数去除较大的那个数,然后用余数代替较大的数,重复此步骤直到余数为 0。
欧几里得算法的步骤
- 计算 a mod b 得到余数 r。
- 如果 r = 0,那么 b 就是 a 和 b 的最大公约数。
- 如果 r ≠ 0,令 a = b,b = r,然后重复步骤 1。
示例
假设我们要找 48 和 18 的最大公约数:
- 48mod 18=1248mod18=12
- 18mod 12=618mod12=6
- 12mod 6=012mod6=0,此时余数为 0,所以最大公约数是 6。
扩展欧几里得算法
扩展欧几里得算法不仅可以找到 a 和 b 的最大公约数 d,还可以找到一对整数 x 和 y,使得 ax + by = d
1.6 欧拉函数φ(n)
欧拉函数(Euler's Totient Function),通常记作 φ(n),是数论中的一个重要函数。它对于一个正整数 n 定义为小于或等于 n 的正整数中与 n 互质的数的数目。两个数互质(coprime)指的是它们的最大公约数(GCD)为 1。
例如,φ(9) = 6,因为 1, 2, 4, 5, 7 和 8 与 9 互质;而 φ(8) = 4,因为只有 1, 3, 5 和 7 与 8 互质。
如果 n 是一个质数 p 的幂次 p^k,则有:
φ(pk)=pk−pk−1=pk(1−1p)*φ*(*p**k*)=*p**k*−*p**k*−1=*p**k*(1−*p*1)
对于任意正整数 n,如果 n 可以分解为不同质数的乘积:
n=p1k1⋅p2k2⋯pmkm*n*=*p*1*k*1⋅*p*2*k*2⋯*p**m**k**m*
那么根据欧拉函数的性质,我们可以计算出:
φ(n)=φ(p1k1)⋅φ(p2k2)⋯φ(pmkm)*φ*(*n*)=*φ*(*p*1*k*1)⋅*φ*(*p*2*k*2)⋯*φ*(*p**m**k**m*) φ(n)=n⋅(1−1p1)⋅(1−1p2)⋯(1−1pm)*φ*(*n*)=*n*⋅(1−*p*11)⋅(1−*p*21)⋯(1−*p**m*1)
0x02 算法描述
1.1 密钥计算步骤
1、生成两个大素数p和q
2、计算两个素数的乘积
n=p*q
3、计算欧拉函数
φ(n)=(p-1)*(q-1)
4、选择一个整数e
(1 < e < φ(n)),使得e
与φ(n)
互质(即最大公约数gcd(e, φ(n)) = 1)。通常情况下,e
取一个较小的质数如65537 (2^16 + 1
),因为它使得加密过程更高效。
5、欧几里得算法计算d(私钥)
d
(1 < d < φ(n)),使得
(d * e) mod φ(n) = 1
d = e^-1 mod φ(n)
换句话说,d
是e
在模φ(n)
下的乘法逆元
6、公钥:由(n, e)
组成
私钥:由(n, d)
组成
7、加密
m(其中m必须小于n)使用公钥(n, e),加密公式为c = m^e mod n,这里c是密文
8、解密
c使用私钥(n, d),解密公式为m = c^d mod n,这样就恢复了原始的消息m
1.2 小结
公钥 | (e,n) |
---|---|
私钥 | (d,n) |
密钥对 | (e,n,d) |
加密 | c = m^e mod n |
解密 | m = c ^d mod n |
n | p*q |
---|---|
φ(n) | (p-1)*(q-1) |
e | 1<e< φ(n) |
d | 1<d< φ(n) ,e*d mod φ(n) = 1 |
0x03 RSA算法的实现
RSA算法的实现涉及到大数的幂模运算,这在计算机编程中通常通过特定的算法来优化,如平方-乘法算法。以下是RSA算法的一个简化的Python实现示例:
import random
from math import gcd
def is_prime(num):
"""检查num是否为素数"""
if num < 2:
return False
for factor in range(2, int(num ** 0.5) + 1):
if num % factor == 0:
return False
return True
def generate_prime(start, end):
"""在[start, end]区间内生成一个素数"""
prime = random.randint(start, end)
while not is_prime(prime):
prime = random.randint(start, end)
return prime
def multiplicative_inverse(e, phi):
"""计算e相对于phi的模逆"""
d = 1
while d * e % phi != 1:
d += 1
return d
def generate_keypair(p, q):
"""生成公钥和私钥"""
n = p * q
phi = (p - 1) * (q - 1)
# 选择e
e = random.randrange(2, phi)
g = gcd(e, phi)
while g != 1:
e = random.randrange(2, phi)
g = gcd(e, phi)
# 计算d
d = multiplicative_inverse(e, phi)
# 返回公钥和私钥
return ((e, n), (d, n))
def encrypt_rsa(public_key, plaintext):
"""使用公钥public_key对明文plaintext进行加密"""
e, n = public_key
# 将每个汉字转换成Unicode码并加密
encrypted = [pow(ord(char), e, n) for char in plaintext]
return encrypted
def decrypt_rsa(private_key, ciphertext):
"""使用私钥private_key对密文ciphertext进行解密"""
d, n = private_key
# 对每个数字解密并转换回字符
decrypted = [chr(pow(char, d, n)) for char in ciphertext]
return ''.join(decrypted)
# 示例代码
if __name__ == '__main__':
# 生成两个较小的素数(为了简化示例)
p = generate_prime(65537, 65537 * 2)
q = generate_prime(65537, 65537 * 2)
# 生成公钥和私钥
public, private = generate_keypair(p, q)
# 中文明文
message = "你好世界!"
# 加密
encrypted_msg = encrypt_rsa(public, message)
print("加密后的消息:", encrypted_msg)
# 解密
decrypted_msg = decrypt_rsa(private, encrypted_msg)
print("解密后的消息:", decrypted_msg)
0x04 安全性和应用
RSA算法的安全性取决于密钥的长度,目前推荐的密钥长度至少为2048位。RSA算法广泛应用于数字签名、安全通信等领域。然而,随着计算能力的提升和量子计算的发展,RSA算法的安全性面临挑战,因此密钥长度和算法的实现需要不断更新以保持安全。
rsa安全三种模式:
4.1 加密模式
公钥加密,私钥解密
发方:A先查PKDB,查到公开的公钥KeB——>A用KeB加密明文M——>得到密文:C=E(M,KeB)——>A发送密文C给B
收方:B接受C——>B用主机的私钥KdB解密密文C——>得到密文M=D(M,KdB)
4.2 认证模式
私钥加密,公钥解密
发方:A用主机的私钥KdA加密密文M——>得到密文C=E(M,KdA)
收方:B接受C——>B查PKDB——>查到A的KeA——>用KdA解密C——>得到明文M=D(C,KeA)
4.3机密认证混合模式
同时保证数据的秘密性和真实性
发方:A用自己的私钥KdD加密消息M——>得到中间密文S=E(M,KdA)——>A查询PKDB——>得到B的公钥KeB——>用公钥KeB加密S得到——>最终密文C=(M,KeB)——>A发送给B
收方:B接受C——>B用自己的私钥KdB解密密文C——>得到中级密文S=D(C,KdB)——> B查找PKDB找到A的公钥KeA——>解密消息S——>得到明文M=(S,KeA)
4.4 应用
-
RSA算法的应用包括但不限于以下几个方面:
- 数据加密:
- RSA可以用于保护数据在传输过程中的安全,比如在互联网上的通信。
- 它被广泛应用于HTTPS协议中,确保网站与用户之间的通信安全。
- 数字签名:
- RSA还用于创建数字签名,这可以验证数据来源的真实性以及数据是否未被篡改。
- 数字签名可以用来确认文件或电子文档的发布者身份,并保证文件的完整性。
- 密钥交换:
- 在一些场景下,RSA用于在通信双方之间安全地交换对称加密所需的密钥。
- 身份验证:
- RSA可用于实现身份验证机制,如在登录过程中使用公钥/私钥对来验证用户的身份。
- 软件保护:
- 软件开发商可能会使用RSA来保护他们的软件不受非法复制。
- 电子邮件加密:
- 使用PGP(Pretty Good Privacy)等协议时,RSA用于加密邮件内容或创建邮件签名。
- 其他安全协议:
- RSA也是许多其他安全协议的一部分,如TLS/SSL、SSH、IPsec等。
RSA算法虽然强大,但由于其计算密集型的特点,在处理大量数据时可能效率较低。因此,在实际应用中,通常会结合使用RSA和其他更高效的对称加密算法。例如,使用RSA加密一个对称密钥,然后用这个对称密钥来加密实际的数据。这样既保证了数据的安全性,又提高了加密解密的速度。
- 数据加密: