在数字世界里,我们经常需要保护自己的隐私和重要信息,不让别人轻易看到。这时候,加密算法就像是一把神奇的锁,把我们的数据藏起来,只有拥有正确钥匙的人才能打开。RSA,就是这样一个强大的 “超级保险箱”,它不仅能保护我们的数据,还能确保信息的来源真实可靠。
一、RSA 是什么?
RSA,全称是 Rivest-Shamir-Adleman,它是一种非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于 1977 年提出。RSA 的名字就是这三位大神姓氏的首字母拼在一起组成的。它是一种公钥加密算法,意思是说加密和解密使用不同的密钥,就像一把锁有两个钥匙,一把用来锁,另一把用来开。
二、为什么需要 RSA?
想象一下,你正在给远方的朋友寄一个包裹,你希望确保包裹在运输过程中不会被别人打开,而且朋友能确认这个包裹确实是你寄的。这时候,RSA 就派上用场了。它不仅能加密数据,还能进行数字签名,确保信息的来源真实可靠。
三、RSA 的工作原理
1. 准备材料
-
公钥:用来加密数据,可以公开给任何人。
-
私钥:用来解密数据,必须妥善保管,不能泄露。
2. 加密过程
-
生成密钥对:通过复杂的数学运算,生成一对密钥(公钥和私钥)。这个过程涉及到大质数的选取和欧拉函数的计算,就像用特殊的材料和工艺打造一把独一无二的锁。
-
加密数据:用公钥对数据进行加密,加密后的数据只有对应的私钥才能解密。
-
解密数据:用私钥对加密后的数据进行解密,还原出原始数据。
3. 数字签名
-
签名:用私钥对数据进行签名,生成一个签名值。
-
验证签名:用公钥验证签名值,确保数据的来源真实可靠。
四、RSA 的特点
1. 安全性高
RSA 的安全性基于大整数分解的难度,目前没有已知的高效算法可以快速分解大整数,因此 RSA 非常安全。
2. 用途广泛
RSA 被广泛应用于公开密钥加密和电子商业中,是目前比较优秀的公钥方案之一。
3. 抗攻击能力强
RSA 能够抵抗到目前为止已知的所有密码攻击,确保数据的安全性。
五、实战示例:用 Python 实现 RSA
下面,我将用 Python 的 cryptography
库来演示如何进行 RSA 加密和解密。
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
# 生成密钥对
def generate_rsa_keys():
# 生成私钥
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 生成公钥
public_key = private_key.public_key()
return private_key, public_key
# 加密函数
def rsa_encrypt(public_key, plaintext):
ciphertext = public_key.encrypt(
plaintext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return ciphertext
# 解密函数
def rsa_decrypt(private_key, ciphertext):
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return plaintext
# 数字签名函数
def rsa_sign(private_key, message):
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return signature
# 验证签名函数
def rsa_verify(public_key, signature, message):
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return True
except:
return False
# 测试代码
if __name__ == "__main__":
# 生成密钥对
private_key, public_key = generate_rsa_keys()
# 公钥和私钥转字符串
print("私钥:", private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
).decode('utf-8'))
print("公钥:", public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
).decode('utf-8'))
# 定义明文
plaintext = b"Hello, RSA! This is a secret message."
# 加密
ciphertext = rsa_encrypt(public_key, plaintext)
print("加密后的数据:", ciphertext)
# 解密
decrypted_text = rsa_decrypt(private_key, ciphertext)
print("解密后的数据:", decrypted_text.decode())
# 数字签名
message = b"This is a signed message."
signature = rsa_sign(private_key, message)
print("签名:", signature)
# 验证签名
is_valid = rsa_verify(public_key, signature, message)
print("签名验证结果:", is_valid)
代码说明:
-
生成密钥对:使用
rsa.generate_private_key()
生成私钥,然后通过private_key.public_key()
生成公钥。 -
加密:使用公钥对数据进行加密,加密时使用 OAEP 填充方式。
-
解密:使用私钥对加密后的数据进行解密,解密时使用 OAEP 填充方式。
-
数字签名:使用私钥对数据进行签名,生成签名值。
-
验证签名:使用公钥验证签名值,确保数据的来源真实可靠。
输出结果:
私钥: -----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDLRLmSzB+QlTtM
pmSRCAFBsIuGl1vEMKEoYPIPY/PfPBtZRVYtkJolswrQPBo/gXxBRIlsP5s37Rc8
XYe6ECks5ghtUyjqwbwt8iMj2HVEc+QMaBJ3yxDR0kHPj+O2vy6G8rFBCXTr/A1G
PEoJ0sdDjJxBS4hMA+j6mu8tswR7edkZ60AKUI9VzjPrJn9ZYokvfya+hBvroDOa
0eX+lhJ1xzyfTP+7RGkf1glTctIG0IG5XrKgKHMmv69rfqSKM6zs+nD5+I+/c6If
vFVPKcw9TcJ6Kgiz2cstxkiJg88WgpkbuvV3aNidWIsyJPBeNNeFp2S/EhXIk/dZ
bicoeEBFAgMBAAECggEAUtl4KfU5CF1LBjrr0pFIsdWbiQg4RwbrKOIax1seE2cU
XpZ8QaYmricDyUw2BpxoYNHmkVB7m5fvWJNmttfPcJVx6d1zV/wPD0saN4oKghQa
Z1Qj8t+5w0vHtyoWzm2uMSLKTI/mMClT38TDCK34ufed2J9ItnMBiuOLiTzmHs0Z
UrpQc0FqplP1UR0vDKpkG7zLRBhlTjL4y9OUAInRKFEztJ7dLw3KeFNEE7RBkjl/
Ud1MzNyzUYpeDqXo9xK5SfT5T/R49LHsVb9n0Ep6y7bhdCenAq445QDYSP51UdqS
LoTE70UN6Cwn1q+ZET9YW7NPPt7sNV8nYvVPo29vAQKBgQDlHle4GXtiRbjIPBEW
GD7ZuFYGffVonP7ITGlhRpCmRtZEsvuoFsiFHlOrYOwdsfDc9vCgl49YuAxfbaMY
P0ZcOxVqjN3tYSb+CQHdegwxH03mk8LYJCf4HcTIO811up9XQ+Qp60joyhEnCrvz
VFcKma75mlRzXszQa54tsCj47QKBgQDjHfdTD9202OUVdWdyNQMER7GH5qpdX7mo
CkigIIr3AvypDQfzwwvwNuSdhDICs9aBTk7NURz5LLXFDnT3vFzduONiOq03yU15
dq7Wchz2hlSuygZTWNNfG2m4o11GayViatMoleteVTbUmeIg/Q8By21jYQVKgjQN
1nW1nDMxuQKBgQCMCHKGg5SEqKZaQ1QSE/l96gsx5pQyPxn9Y65YlN9dsRfOXzIu
NtaRfcqXiSJmt9XFx2ukS12CVOLDBGhVLn8bacUaHUSai/Ff/DNWoPyInWBoV9ET
d22yWMdnth1KIii3FjiCYlpqZO381bOv8dFNGkb2KRwKc1ts2wmPVQaFtQKBgQCl
/xTxpLsKnyxwjqrZEl3uFuhux+zk6j4rz7hdMOvgtlIszNVvGLP1Emntpt1WlFLH
l5CJCCwBAuin6nUbTJUjiSrIdNJ936e8iz4mhqkclfn29rnA2T9EWCjhRqW5/j4I
vMMw+sJY5Dd7FC3upob9bM26wQK4/olFQ+YsosnYIQKBgH3pPKnH7b18LfR90D0a
MDhaK01JIG+BuaoGrBLRSpZPNMAq66JTQ68UmdGYV/QwyO11d8DDm8F0gQ5kKfxZ
s+f3nWKphUnmv4rYPad2IicUwW1RfDMvvojH81HuK+BgkPxXGm1ndnxQOE7aOUa8
Dki8CvaT9asi0RkJdhsAQ9vl
-----END PRIVATE KEY-----
公钥: -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0S5kswfkJU7TKZkkQgB
QbCLhpdbxDChKGDyD2Pz3zwbWUVWLZCaJbMK0DwaP4F8QUSJbD+bN+0XPF2HuhAp
LOYIbVMo6sG8LfIjI9h1RHPkDGgSd8sQ0dJBz4/jtr8uhvKxQQl06/wNRjxKCdLH
Q4ycQUuITAPo+prvLbMEe3nZGetAClCPVc4z6yZ/WWKJL38mvoQb66AzmtHl/pYS
dcc8n0z/u0RpH9YJU3LSBtCBuV6yoChzJr+va36kijOs7Ppw+fiPv3OiH7xVTynM
PU3CeioIs9nLLcZIiYPPFoKZG7r1d2jYnViLMiTwXjTXhadkvxIVyJP3WW4nKHhA
RQIDAQAB
-----END PUBLIC KEY-----
加密后的数据: b'G\xb1\x01\xd9\xb7E<\x03\xb6\x04\xbd\xbe\xe5uG?%\xd9W%`\xe4!@\xd1\x82 \xde;\xd7\x1aP\x9f\x9f[\xf1\xec\xba\x0f\xacb\xe5\xb2\xb7c\xf0n>\xa0\x06\xa8\xcd\x10\xd2\x16b\x0e\xcd\xf3\xa1\xcd\xf8\xc4\xe8\xd3T_\x8c%<\xa4\xbc\x86\xed<\x01\x9e\xee\xd7\x08\xadQ(pc\xe9\x0f\xec\xfb\xcfME\xde6.6\xba;hm)\xe55[\x1e|\xc8~\x0b\x1dC\x0c\xd6\xe0\xe7\x1c\xbf\xfeZ!\xfb\xddW\xd7\xb45\x9a\x1b>\x05HP\xabl\x94\t\\ \xc6\\4+\xe8\xb9\t\xc2\xce\xa7\xc9\xa83\xa0r\x95\x8c\x18\xf0XI77\\\x9e\x1cOv6\xceC\xf7\xa5\xeaPL9\xf0e\xa9F7^\xe4\xdf\xf8\x07\xf0"e\xf7\x89\x8a\x17:\xff\n\x83\x86\xe6w\xaa\xf4\x98\x8c\x17h\x88^\xf8\xabO\xc9\x9e>\xa6\xf2\x94\xbc\xbd2e\xca\x17\xdc\xc3\x87\x9c\xa9\x86\xa6\x04\x94\xfe\x1e\xf8yo#\xc9l\xab%n\x0c\xc8\x9b\x90ieu\xdcN\xaf?\xa2\xe0\xce'
解密后的数据: Hello, RSA! This is a secret message.
签名: b'\xb1\xa6\xed,\xa1\xbf}\xdbd"l\xf0,\x90\xde\x00\xb5@\xb2EK\xa6\na\xfd\xbb\xb0?\xb0u\x9f@\xd0s\xb8\xbb\xe0W\xdf\n\x9aL\x83\xbd\xa7\x08\x91\x8a!\xf3\x965s\xadv7\x95\xa9o\x82\xc3\xc13a\xe5G\x135\xdb"Kj\xd3@\xb3\x7f\xf0\xd8\x83F[\xb9\xf1p&\'\x7f\xca3@d\xe8\x8a\x19@\x89"\xc8}\xec\xf6\x8e\xfd\x11\xf1&\xf5\xd4\x94\x03]<2\x93\x88\x1cR\xd6\x96\x07C\xea\rm\r\x19\x12\x89\n\xfc\xcd\xe2\x1a2\xfb\xad\xb2\xda\x16*\xc5\x8a\xf9\xdc:\xd7[\xcfXP\xf8\x96>\x8d\xa2Q\x01\xc2\xe1\xcdF\xe2\x96\xad\xa3\xd6\xcf\xf0\xa9\x7f\x97\xa2/\x9ex\'\xeb\xf9\xd1\x11b0\xed\x19\xb5\xee\xdaG\xb7\xfa\xa94|*\'\xdaN\x98\t\x9a4\x97\x13\xdfF\xd4\x92\xc3\xbf\xe7O\x8e\xad$g\x82\x85\x17\xae\x1d\xbe\xea\xea\x02Bv\x1aj\x8a\x19\xc9\xed\xcbB\xb1\xf6\xe5Ty\xa96\xfc\xf6\x7f\x02A-\xa3\xb5\xa1O\x83I(\xb4\xec'
签名验证结果: True
六、注意事项
-
密钥长度:RSA 的安全性与密钥长度密切相关,建议使用 2048 位或更长的密钥。
-
公钥和私钥的保管:公钥可以公开,但私钥必须妥善保管,不能泄露。
-
性能问题:RSA 加密和解密速度较慢,适合用于加密少量数据或加密会话密钥。
RSA 就像一个 “超级保险箱”,通过公钥和私钥的配合,为我们的数字生活提供安全保障。