From c7588a9831afdcf12d9945e01f06ca5dbfb11397 Mon Sep 17 00:00:00 2001 From: Timmoc Date: Sun, 24 Nov 2024 16:21:56 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSM4=E5=92=8CRSA=E7=9A=84b?= =?UTF-8?q?ug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tool/asymmetric/RSA.py | 24 +++++++++++++----------- tool/symmetric/SM4.py | 41 +++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/tool/asymmetric/RSA.py b/tool/asymmetric/RSA.py index 652e4f5..4356b16 100644 --- a/tool/asymmetric/RSA.py +++ b/tool/asymmetric/RSA.py @@ -1,9 +1,10 @@ import base64 import binascii + from Crypto.Cipher import PKCS1_OAEP +from Crypto.Hash import SHA256 from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 -from Crypto.Hash import SHA256 def generate_keys(priKeySavePath, pubKeySavePath): @@ -21,45 +22,46 @@ def generate_keys(priKeySavePath, pubKeySavePath): f.write(public_key) -def encrypt_message(message, public_key_base64): +def encrypt_message(message: bytes, public_key_base64): # 加载公钥 public_key_bin = base64.b64decode(public_key_base64) public_key = RSA.import_key(public_key_bin) # 使用公钥加密消息 cipher_rsa = PKCS1_OAEP.new(public_key) - encrypted_message = cipher_rsa.encrypt(message.encode('utf-8')) + encrypted_message = cipher_rsa.encrypt(message) - return binascii.hexlify(encrypted_message).decode('utf-8') + return encrypted_message -def decrypt_message(encrypted_message, private_key_base64): +def decrypt_message(encrypted_message: bytes, private_key_base64): # 加载私钥 private_key_bin = base64.b64decode(private_key_base64) private_key = RSA.import_key(private_key_bin) # 使用私钥解密消息 cipher_rsa = PKCS1_OAEP.new(private_key) - decrypted_message = cipher_rsa.decrypt(binascii.unhexlify(encrypted_message)) + decrypted_message = cipher_rsa.decrypt(encrypted_message) + + return decrypted_message - return decrypted_message.decode('utf-8') -def sign_message(message, private_key_base64): +def sign_message(message: bytes, private_key_base64): # 加载私钥 private_key_bin = base64.b64decode(private_key_base64) private_key = RSA.import_key(private_key_bin) # 计算消息的哈希值 - hash_obj = SHA256.new(message.encode('utf-8')) + hash_obj = SHA256.new(message) # 使用私钥对哈希值进行签名 signature = pkcs1_15.new(private_key).sign(hash_obj) return binascii.hexlify(signature).decode('utf-8') -def verify_signature(message, signature, public_key_base64): +def verify_signature(message: bytes, signature, public_key_base64): # 加载公钥 public_key_bin = base64.b64decode(public_key_base64) public_key = RSA.import_key(public_key_bin) # 计算消息的哈希值 - hash_obj = SHA256.new(message.encode('utf-8')) + hash_obj = SHA256.new(message) # 使用公钥验证签名 try: pkcs1_15.new(public_key).verify(hash_obj, binascii.unhexlify(signature)) diff --git a/tool/symmetric/SM4.py b/tool/symmetric/SM4.py index d3d53e1..f68e222 100644 --- a/tool/symmetric/SM4.py +++ b/tool/symmetric/SM4.py @@ -2,49 +2,54 @@ import os from gmssl import sm4 + def encrypt_ecb(data, key): cipher = sm4.CryptSM4() - cipher.set_key(key.encode('utf-8'), sm4.SM4_ENCRYPT) - encrypted_data = cipher.crypt_ecb(data.encode('utf-8')) - return encrypted_data.hex() + cipher.set_key(key, sm4.SM4_ENCRYPT) + encrypted_data = cipher.crypt_ecb(data) + return encrypted_data + -def decrypt_ecb(encrypted_hex, key): +def decrypt_ecb(encrypted_data, key): cipher = sm4.CryptSM4() - cipher.set_key(key.encode('utf-8'), sm4.SM4_DECRYPT) - decrypted_data = cipher.crypt_ecb(bytes.fromhex(encrypted_hex)) - return decrypted_data.decode('utf-8') + cipher.set_key(key, sm4.SM4_DECRYPT) + decrypted_data = cipher.crypt_ecb(encrypted_data) + return decrypted_data + def encrypt_cbc_with_iv(data, key): cipher = sm4.CryptSM4() - cipher.set_key(key.encode('utf-8'), sm4.SM4_ENCRYPT) + cipher.set_key(key, sm4.SM4_ENCRYPT) # 生成随机的16字节IV iv = os.urandom(16) # 加密数据 - encrypted_data = cipher.crypt_cbc(iv, data.encode('utf-8')) + encrypted_data = cipher.crypt_cbc(iv, data) # 将IV和加密后的数据拼接在一起 return iv + encrypted_data -def decrypt_cbc_with_iv(encrypted_bytes, key): + +def decrypt_cbc_with_iv(encrypted_data, key): cipher = sm4.CryptSM4() - cipher.set_key(key.encode('utf-8'), sm4.SM4_DECRYPT) + cipher.set_key(key, sm4.SM4_DECRYPT) # 提取IV - iv = encrypted_bytes[:16] + iv = encrypted_data[:16] # 提取加密后的数据 - encrypted_data = encrypted_bytes[16:] + encrypted_data = encrypted_data[16:] # 解密数据 decrypted_data = cipher.crypt_cbc(iv, encrypted_data) - return decrypted_data.decode('utf-8') + return decrypted_data + if __name__ == "__main__": # 示例数据和密钥 - data = "Hello, SM4!" - key = "1234567890abcdef" + data = b"Hello, SM4!" + key = b"1234567890abcdef" # 加密 encrypted_data = encrypt_ecb(data, key) @@ -55,8 +60,8 @@ if __name__ == "__main__": print(f"Decrypted: {decrypted_data}") # 示例数据和密钥 - data = "Hello, SM4 CBC with random IV!" - key = "1234567890abcdef" + data = b"Hello, SM4 CBC with random IV!" + key = b"1234567890abcdef" # 加密 encrypted_data = encrypt_cbc_with_iv(data, key) From 730fb4dd9628ec1a428d7043a24e4ea7deadb3b2 Mon Sep 17 00:00:00 2001 From: Timmoc Date: Sun, 24 Nov 2024 16:37:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?SM4=E7=9A=84message=E4=BD=BF=E7=94=A8str?= =?UTF-8?q?=EF=BC=8Ckey=E4=BD=BF=E7=94=A8bytes=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tool/symmetric/SM4.py | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/tool/symmetric/SM4.py b/tool/symmetric/SM4.py index f68e222..38ee3ec 100644 --- a/tool/symmetric/SM4.py +++ b/tool/symmetric/SM4.py @@ -1,23 +1,30 @@ +import base64 import os from gmssl import sm4 - - -def encrypt_ecb(data, key): +""" +输入: +消息或者加密后消息:字符串类型 +key:字节类型 +输出: +消息或者加密后消息:base64的字符串类型 +""" + +def encrypt_ecb(data: str, key: bytes) -> str: cipher = sm4.CryptSM4() cipher.set_key(key, sm4.SM4_ENCRYPT) - encrypted_data = cipher.crypt_ecb(data) - return encrypted_data + encrypted_data = cipher.crypt_ecb(data.encode('utf-8')) + return base64.b64encode(encrypted_data).decode('utf-8') -def decrypt_ecb(encrypted_data, key): +def decrypt_ecb(encrypted_hex: str, key: bytes) -> str: cipher = sm4.CryptSM4() cipher.set_key(key, sm4.SM4_DECRYPT) - decrypted_data = cipher.crypt_ecb(encrypted_data) - return decrypted_data + decrypted_data = cipher.crypt_ecb(bytes.fromhex(encrypted_hex)) + return decrypted_data.decode('utf-8') -def encrypt_cbc_with_iv(data, key): +def encrypt_cbc_with_iv(data: str, key: bytes) -> str: cipher = sm4.CryptSM4() cipher.set_key(key, sm4.SM4_ENCRYPT) @@ -25,30 +32,31 @@ def encrypt_cbc_with_iv(data, key): iv = os.urandom(16) # 加密数据 - encrypted_data = cipher.crypt_cbc(iv, data) + encrypted_data = cipher.crypt_cbc(iv, data.encode('utf-8')) # 将IV和加密后的数据拼接在一起 - return iv + encrypted_data + return base64.b64encode(iv + encrypted_data).decode('utf-8') -def decrypt_cbc_with_iv(encrypted_data, key): +def decrypt_cbc_with_iv(encrypted_bytes_base64: str, key) -> str: + encrypted_bytes = base64.b64decode(encrypted_bytes_base64) cipher = sm4.CryptSM4() cipher.set_key(key, sm4.SM4_DECRYPT) # 提取IV - iv = encrypted_data[:16] + iv = encrypted_bytes[:16] # 提取加密后的数据 - encrypted_data = encrypted_data[16:] + encrypted_data = encrypted_bytes[16:] # 解密数据 decrypted_data = cipher.crypt_cbc(iv, encrypted_data) - return decrypted_data + return base64.b64decode(decrypted_data).decode('utf-8') if __name__ == "__main__": # 示例数据和密钥 - data = b"Hello, SM4!" + data = "Hello, SM4!" key = b"1234567890abcdef" # 加密 @@ -60,7 +68,7 @@ if __name__ == "__main__": print(f"Decrypted: {decrypted_data}") # 示例数据和密钥 - data = b"Hello, SM4 CBC with random IV!" + data = "Hello, SM4 CBC with random IV!" key = b"1234567890abcdef" # 加密 From 0c0bce2095c1f8adce55e0087d29a632c231f073 Mon Sep 17 00:00:00 2001 From: Timmoc Date: Sun, 24 Nov 2024 16:40:32 +0800 Subject: [PATCH 3/3] =?UTF-8?q?SM4=E7=9A=84message=E4=BD=BF=E7=94=A8str?= =?UTF-8?q?=EF=BC=8Ckey=E4=BD=BF=E7=94=A8bytes=E7=B1=BB=E5=9E=8B=20RSA?= =?UTF-8?q?=E5=88=99=E5=85=A8=E7=A8=8B=E4=BD=BF=E7=94=A8bytes=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entity/Letter.py | 2 +- tool/asymmetric/RSA.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/entity/Letter.py b/entity/Letter.py index e5b4113..5a05a92 100644 --- a/entity/Letter.py +++ b/entity/Letter.py @@ -1,7 +1,7 @@ class Letter: sign = "计算得到" encryptType = "SM4-GCM" - encryptKey = "计算获得" + encryptKey = "计算获得" # recvPubKey 加密后的 对称加密秘钥 数据 recvPubKey = "" senderPubKey = "" diff --git a/tool/asymmetric/RSA.py b/tool/asymmetric/RSA.py index 4356b16..f6bdc49 100644 --- a/tool/asymmetric/RSA.py +++ b/tool/asymmetric/RSA.py @@ -21,7 +21,13 @@ def generate_keys(priKeySavePath, pubKeySavePath): with open(pubKeySavePath, "wb") as f: f.write(public_key) - +""" +输入: +需要公私钥加解密的消息:字节类型 +公私钥:base64 +输出: +加解密后的数据:字节类型 +""" def encrypt_message(message: bytes, public_key_base64): # 加载公钥 public_key_bin = base64.b64decode(public_key_base64)