用python实现比较复杂的下面的题目的代码并给出运行结果,利用基于Feistel结构构造一个分组密码算法和RSA算法,以数字信封的形式对明文文件进行加密。要求如下: 1、发送方利用系统自带的伪随机数生成函数生成会话密钥 2、用接收方的公钥对会话密钥加密 3、用会话密钥以OFB的模式对明文文件p_text.txt(文件大于1KB)进行加密,结果存于密文文件c_text.txt 4、接收方利用私钥解密会话密钥,然后用会话密钥对密文文件解密,结果存于明文文件p1_text.txt,最后对比p_text.txt和p1_text.txt
时间: 2024-03-01 22:51:51 浏览: 92
使用python对信息进行加密和解密
以下是一种实现方式,需要用到`pycryptodome`库和`os`库:
```python
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
import os
# 生成会话密钥
session_key = get_random_bytes(16)
# 读取接收方公钥
with open("public.pem", "rb") as f:
public_key = RSA.import_key(f.read())
# 加密会话密钥
cipher_rsa = PKCS1_OAEP.new(public_key)
enc_session_key = cipher_rsa.encrypt(session_key)
# 使用OFB模式加密明文文件
iv = get_random_bytes(16)
cipher_aes = AES.new(session_key, AES.MODE_OFB, iv)
with open("p_text.txt", "rb") as f_in:
with open("c_text.txt", "wb") as f_out:
while True:
chunk = f_in.read(1024)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += b' ' * (16 - len(chunk) % 16)
f_out.write(cipher_aes.encrypt(chunk))
# 解密会话密钥
with open("private.pem", "rb") as f:
private_key = RSA.import_key(f.read())
cipher_rsa = PKCS1_OAEP.new(private_key)
dec_session_key = cipher_rsa.decrypt(enc_session_key)
# 使用OFB模式解密密文文件
iv = get_random_bytes(16)
cipher_aes = AES.new(dec_session_key, AES.MODE_OFB, iv)
with open("c_text.txt", "rb") as f_in:
with open("p1_text.txt", "wb") as f_out:
while True:
chunk = f_in.read(1024)
if len(chunk) == 0:
break
f_out.write(cipher_aes.decrypt(chunk))
# 对比明文文件和解密后的文件
with open("p_text.txt", "rb") as f1:
with open("p1_text.txt", "rb") as f2:
if f1.read() == f2.read():
print("Success")
else:
print("Fail")
```
其中,需要将接收方的公钥保存到`public.pem`文件中,将发送方的私钥保存到`private.pem`文件中。可以使用`openssl`工具生成公钥和私钥:
```bash
# 生成私钥
openssl genrsa -out private.pem 2048
# 根据私钥生成公钥
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
```
注意,这里使用了`PKCS1_OAEP`填充方式进行RSA加密和解密,需要确保发送方和接收方使用的填充方式相同。此外,如果明文文件的长度不是16的倍数,需要在加密前进行填充。
阅读全文