commit
36f754e266
@ -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…
Reference in new issue