commit 36f754e266f507203177a2b30ed55e79bf9623f8 Author: vernuser Date: Tue Dec 10 08:47:33 2024 +0800 Initial commit diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..a7cdac7 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..579b55b --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5403b9e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f51b2be --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/应用密码学课设.iml b/.idea/应用密码学课设.iml new file mode 100644 index 0000000..a80cbb1 --- /dev/null +++ b/.idea/应用密码学课设.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/encryption_utils.py b/encryption_utils.py new file mode 100644 index 0000000..3b70510 --- /dev/null +++ b/encryption_utils.py @@ -0,0 +1,34 @@ +from Crypto.PublicKey import RSA +from Crypto.Cipher import PKCS1_OAEP, AES +from Crypto.Random import get_random_bytes + + +class AsymmetricEncryption: + def __init__(self): + self.key_pair = RSA.generate(2048) + + def get_public_key(self): + return self.key_pair.publickey() + + def get_private_key(self): + return self.key_pair + + def encrypt_with_public_key(self, data, public_key): + cipher_rsa = PKCS1_OAEP.new(public_key) + return cipher_rsa.encrypt(data) + + def decrypt_with_private_key(self, encrypted_data): + cipher_rsa = PKCS1_OAEP.new(self.key_pair) + return cipher_rsa.decrypt(encrypted_data) + + +class SymmetricEncryption: + def encrypt(self, data, key): + cipher_aes = AES.new(key, AES.MODE_GCM) + nonce = cipher_aes.nonce + ciphertext, tag = cipher_aes.encrypt_and_digest(data) + return nonce, ciphertext, tag + + def decrypt(self, nonce, ciphertext, tag, key): + cipher_aes = AES.new(key, AES.MODE_GCM, nonce=nonce) + return cipher_aes.decrypt_and_verify(ciphertext, tag) diff --git a/example.txt b/example.txt new file mode 100644 index 0000000..a47e663 --- /dev/null +++ b/example.txt @@ -0,0 +1,2 @@ +123456 +adgjl \ No newline at end of file diff --git a/receiver.py b/receiver.py new file mode 100644 index 0000000..9ed9cf5 --- /dev/null +++ b/receiver.py @@ -0,0 +1,31 @@ +import base64 +from encryption_utils import SymmetricEncryption, AsymmetricEncryption, calculate_file_hash + +class Receiver: + def __init__(self, private_key): + self.private_key = private_key + + def receive_file(self, encoded_data_packet): + decoded_data_packet = base64.b64decode(encoded_data_packet) + + nonce = decoded_data_packet[:16] + ciphertext = decoded_data_packet[16:-256-64] + tag = decoded_data_packet[-256-64:-256] + encrypted_symmetric_key = decoded_data_packet[-256:] + original_hash = decoded_data_packet[-256-64:-256] # 保持为字节 + + asymmetric_encryption = AsymmetricEncryption() + decrypted_symmetric_key = asymmetric_encryption.decrypt_with_private_key(encrypted_symmetric_key) + + symmetric_encryption = SymmetricEncryption() + decrypted_file_data = symmetric_encryption.decrypt(nonce, ciphertext, tag, decrypted_symmetric_key) + + # Recalculate hash of decrypted file data + received_file_hash = calculate_file_hash(decrypted_file_data).encode() + + if received_file_hash == original_hash: + print("文件传输成功,文件完整性验证通过。") + else: + print("文件传输失败,文件可能已被篡改。") + + return decrypted_file_data diff --git a/run_example.py b/run_example.py new file mode 100644 index 0000000..520728a --- /dev/null +++ b/run_example.py @@ -0,0 +1,35 @@ +from encryption_utils import AsymmetricEncryption, SymmetricEncryption +from Crypto.Random import get_random_bytes + +def run_example(): + # 生成接收方的密钥对 + receiver_asymmetric = AsymmetricEncryption() + receiver_public_key = receiver_asymmetric.get_public_key() + receiver_private_key = receiver_asymmetric.get_private_key() + + # 生成对称密钥 + symmetric_key = get_random_bytes(16) # AES 128 位密钥 + + # 使用接收方的公钥加密对称密钥 + encrypted_symmetric_key = receiver_asymmetric.encrypt_with_public_key(symmetric_key, receiver_public_key) + + # 读取文件内容 + with open('example.txt', 'rb') as file: + file_data = file.read() + + # 使用对称密钥加密文件内容 + symmetric_encryption = SymmetricEncryption() + nonce, ciphertext, tag = symmetric_encryption.encrypt(file_data, symmetric_key) + + # 模拟发送和接收 + encoded_packet = (encrypted_symmetric_key, nonce, ciphertext, tag) + + # 使用接收方私钥解密对称密钥 + decrypted_symmetric_key = receiver_asymmetric.decrypt_with_private_key(encoded_packet[0]) + + # 使用解密后的对称密钥解密文件内容 + decrypted_data = symmetric_encryption.decrypt(encoded_packet[1], encoded_packet[2], encoded_packet[3], decrypted_symmetric_key) + print("Decrypted Data:", decrypted_data.decode('utf-8')) + +if __name__ == "__main__": + run_example() diff --git a/sender.py b/sender.py new file mode 100644 index 0000000..afcb64d --- /dev/null +++ b/sender.py @@ -0,0 +1,25 @@ +import base64 +from Crypto.Random import get_random_bytes # 确保导入随机字节生成函数 +from encryption_utils import SymmetricEncryption, AsymmetricEncryption, calculate_file_hash + +class Sender: + def __init__(self, filepath, receiver_public_key): + self.filepath = filepath + self.receiver_public_key = receiver_public_key + + def send_file(self): + with open(self.filepath, 'rb') as f: + file_data = f.read() + + symmetric_key = get_random_bytes(16) + symmetric_encryption = SymmetricEncryption() + nonce, ciphertext, tag = symmetric_encryption.encrypt(file_data, symmetric_key) + + file_hash = calculate_file_hash(file_data) + + asymmetric_encryption = AsymmetricEncryption() + encrypted_symmetric_key = asymmetric_encryption.encrypt_with_public_key(symmetric_key, self.receiver_public_key) + + encoded_data_packet = base64.b64encode(nonce + ciphertext + tag + encrypted_symmetric_key + file_hash.encode()) + + return encoded_data_packet