python基于RSA的非对称加密体制
时间: 2023-07-06 15:28:18 浏览: 87
基于python的非对称加密算法rsa
RSA是一种非对称加密算法,它由三个部分组成:密钥生成、加密和解密。其中密钥生成阶段包括选择两个大素数p和q,计算它们的积N=pq,并选择一个整数e,满足e与(p-1)(q-1)互质。接着,计算d,使得(e×d) mod ((p-1)(q-1)) = 1。最后,公钥为(N,e),私钥为(N,d)。
在加密阶段,消息被转换为一个整数m(通常小于N),然后计算c = m^e mod N,密文即为c。
在解密阶段,接收方使用私钥(N,d)来计算m = c^d mod N,得到原始消息。
Python提供了内置模块`cryptography`来实现RSA加密和解密。我们可以使用`cryptography.hazmat.primitives.asymmetric.rsa`模块来生成密钥对,使用`cryptography.hazmat.primitives.asymmetric.padding`模块来进行填充,并使用`cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey`和`cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey`类来表示公钥和私钥。下面是一个简单的例子:
```python
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
# Generate a key pair
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
# Serialize the keys
private_key_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
public_key_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# Encrypt a message
message = b"Hello, world!"
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# Decrypt the message
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
print(plaintext)
```
这里使用了OAEP填充方案进行加密和解密。需要注意的是,RSA加密的消息长度不能超过密钥长度减去一定的填充长度,否则会抛出`ValueError`异常。因此,在实际应用中,需要将消息分块加密。
阅读全文