From 0c35377f324f5f3e9538f631b1028177660c6764 Mon Sep 17 00:00:00 2001 From: poriwfmve <1321176382@qq.com> Date: Fri, 13 Dec 2024 12:06:00 +0800 Subject: [PATCH] ADD file via upload --- crypto.py | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 crypto.py diff --git a/crypto.py b/crypto.py new file mode 100644 index 0000000..2e597b4 --- /dev/null +++ b/crypto.py @@ -0,0 +1,145 @@ +1.CryptoTest模块,该模块包括四个类,分别是是aestest、hashtest、rsatest和signverify。 + # CryptoTest.py +# 封装4个类 +from Crypto.Cipher import AES +from binascii import b2a_hex, a2b_hex +import hashlib, base64 +from Crypto.Cipher import PKCS1_OAEP +from Crypto.PublicKey import RSA +from Crypto.Signature import PKCS1_v1_5 +from Crypto.Hash import SHA256 + + +# AES算法类,实现AES的加密和解密 +class aestest(): + def __init__(self, key): + self.key = key + self.mode = AES.MODE_CBC + + def encrypt(self, text): + cryptor = AES.new(self.key, self.mode, self.key) + text = text.encode("utf-8") + length = 16 + count = len(text) + add = length - (count % length) + text = text + (b'\0' * add) + self.ciphertext = cryptor.encrypt(text) + entext = b2a_hex(self.ciphertext).decode("utf-8") + # ciphertext.bin是生成的密文文件 + with open('ciphertext.bin', 'w') as f1: + f1.write(entext) + return entext + + def decrypt(self, text): + cryptor = AES.new(self.key, self.mode, self.key) + plain_text = cryptor.decrypt(a2b_hex(text)) + plaintext = plain_text.rstrip(b'\0').decode("utf-8") + with open('plaintext.bin', 'w') as f2: + f2.write(plaintext) + return plaintext + + +# hash类,实现摘要值的计算 +class hashtest(): + hash = hashlib.sha256() + hash.update('admin'.encode('utf-8')) + + +# RSA类,实现密钥产生、加密和解密 +class rsatest(): + privkey = [] + pubkey = [] + + def generatekeys(self, file1, file2): + key = RSA.generate(2048) + encrypted_key = key.exportKey(pkcs=8) + self.privkey = encrypted_key + self.pubkey = key.publickey().exportKey() + with open(file1, 'wb') as f: + f.write(encrypted_key) + with open(file2, 'wb') as f: + f.write(key.publickey().exportKey()) + + def encrypt(self, file, encryptedfile, pubk): + with open(file, 'rb') as f: + recipient_key = RSA.import_key(open(pubk).read()) + cipher_rsa = PKCS1_OAEP.new(recipient_key) + c = cipher_rsa.encrypt(f.read()) + with open(encryptedfile, 'wb') as out_file: + out_file.write(c) + + def decrypt(self, file, decryptedfile, prik): + with open(file, 'rb') as f: + private_key = RSA.import_key(open(prik).read()) + cipher_rsa = PKCS1_OAEP.new(private_key) + m = cipher_rsa.decrypt(f.read()) + with open(decryptedfile, 'wb') as out_file: + out_file.write(m) + + +# 签名验证类,实现RSA算法的签名和验证 +class signverify: + def sign(self, data, privkeyfile, sigfile): + privkey = open(privkeyfile,\ "rb").read().decode("utf-8") + key = RSA.importKey(privkey) + data1 = open(data, "rb").read() + h = SHA256.new(data1) + signer = PKCS1_v1_5.new(key) + signature = signer.sign(h) + sig = base64.b64encode(signature) + with open(sigfile, "wb") as f: + f.write(sig) + + def verify(self, data, pubkeyfile, sigfile): + publickey = open(pubkeyfile,\ "rb").read().decode("utf-8") + key = RSA.importKey(publickey) + data1 = open(data, "rb").read() + h = SHA256.new(data1) + verifier = PKCS1_v1_5.new(key) + signature = open(sigfile, "rb").read().decode('utf-8') + if verifier.verify(h, base64.b64decode(signature)): + return True + return False + + +2.发送方和接收方产生自己的公钥 + # RSAkey.py +# 发送方和接收分别执行产生自己的公私钥 + +import CryptoTest + +if __name__ == '__main__': + myrsa = CryptoTest.rsatest() + file1 = input() # 私钥 + file2 = input() # 公钥 + myrsa.generatekeys(file1, file2) + +3.发送方的操作封包过程 + # sender.py +# 发送发封包过程 +import CryptoTest + +# 发送方A的三步,发送方A已经获得接收方B的公钥Bpubkey.bin + +# 第1步,用AES对称密钥加密明文文件 +with open('aeskey.txt', 'rb') as f: # aeskey.txt是对称密钥文件 + aessymkey = f.read() +Aaestest = CryptoTest.aestest(aessymkey) # 实例化对象 +print('请输入要加密的明文文件') +fname = input() # 输入要加密的明文文件 +with open(fname, 'r') as f: + m = f.read() + Aaestest.encrypt(m) # AES的CBC模式加密 +print("明文文件加密后的密文文件是ciphertext.bin") + +# 第2步,用对方公钥Bpubkey.bin加密 对称密钥文件aeskey.txt +Arsa = CryptoTest.rsatest() +Arsa.encrypt('aeskey.txt', 'keyencrypted.bin', 'Bpubkey.bin') +print("对称密钥文件aeskey.txt加密后的文件是keyencrypted.bin") + +# 第3步,生成明文的摘要值,用自己的私钥Aprikey.bin对摘要值签名 +asign = CryptoTest.signverify() +asign.sign('data.txt', 'Aprikey.bin', 'digitalsign.bin') +print("A签名后的文件是digitalsign.bin") +print("将三个文件ciphertext.bin,keyencrypted.bin,\ + digitalsign.bin发送给接收方")