Initial commit

annn
vernuser 9 months ago
commit 36f754e266

8
.idea/.gitignore vendored

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MaterialThemeProjectNewConfig">
<option name="metadata">
<MTProjectMetadataState>
<option name="userId" value="-a35cb17:193adf3a2bf:-7ff2" />
</MTProjectMetadataState>
</option>
</component>
</project>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/应用密码学课设.iml" filepath="$PROJECT_DIR$/.idea/应用密码学课设.iml" />
</modules>
</component>
</project>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings" defaultProject="true" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -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)

@ -0,0 +1,2 @@
123456
adgjl

@ -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

@ -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()

@ -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
Loading…
Cancel
Save