Merge branch 'recv_timmoc' into sender_okToCheck

# Conflicts:
#	entity/Letter.py
sender_okToCheck
Timmoc 4 months ago
commit b9925d8b88

@ -1,7 +1,7 @@
class Letter: class Letter:
sign = "计算得到" sign = "计算得到"
encryptType = "SM4_GCM" encryptType = "SM4_GCM"
encryptKey = "计算获得" encryptKey = "计算获得" # recvPubKey 加密后的 对称加密秘钥 数据
recvPubKey = "" recvPubKey = ""
senderPubKey = "" senderPubKey = ""

@ -1,9 +1,10 @@
import base64 import base64
import binascii import binascii
from Crypto.Cipher import PKCS1_OAEP from Crypto.Cipher import PKCS1_OAEP
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15 from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
def generate_keys(priKeySavePath, pubKeySavePath): def generate_keys(priKeySavePath, pubKeySavePath):
@ -20,46 +21,53 @@ def generate_keys(priKeySavePath, pubKeySavePath):
with open(pubKeySavePath, "wb") as f: with open(pubKeySavePath, "wb") as f:
f.write(public_key) f.write(public_key)
"""
def encrypt_message(message, public_key_base64): 输入
需要公私钥加解密的消息字节类型
公私钥base64
输出
加解密后的数据字节类型
"""
def encrypt_message(message: bytes, public_key_base64):
# 加载公钥 # 加载公钥
public_key_bin = base64.b64decode(public_key_base64) public_key_bin = base64.b64decode(public_key_base64)
public_key = RSA.import_key(public_key_bin) public_key = RSA.import_key(public_key_bin)
# 使用公钥加密消息 # 使用公钥加密消息
cipher_rsa = PKCS1_OAEP.new(public_key) 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_bin = base64.b64decode(private_key_base64)
private_key = RSA.import_key(private_key_bin) private_key = RSA.import_key(private_key_bin)
# 使用私钥解密消息 # 使用私钥解密消息
cipher_rsa = PKCS1_OAEP.new(private_key) 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_bin = base64.b64decode(private_key_base64)
private_key = RSA.import_key(private_key_bin) 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) signature = pkcs1_15.new(private_key).sign(hash_obj)
return binascii.hexlify(signature).decode('utf-8') 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_bin = base64.b64decode(public_key_base64)
public_key = RSA.import_key(public_key_bin) public_key = RSA.import_key(public_key_bin)
# 计算消息的哈希值 # 计算消息的哈希值
hash_obj = SHA256.new(message.encode('utf-8')) hash_obj = SHA256.new(message)
# 使用公钥验证签名 # 使用公钥验证签名
try: try:
pkcs1_15.new(public_key).verify(hash_obj, binascii.unhexlify(signature)) pkcs1_15.new(public_key).verify(hash_obj, binascii.unhexlify(signature))

@ -1,22 +1,32 @@
import base64
import os import os
from gmssl import sm4 from gmssl import sm4
"""
def encrypt_ecb(data, key): 输入
消息或者加密后消息字符串类型
key字节类型
输出
消息或者加密后消息base64的字符串类型
"""
def encrypt_ecb(data: str, key: bytes) -> str:
cipher = sm4.CryptSM4() cipher = sm4.CryptSM4()
cipher.set_key(key.encode('utf-8'), sm4.SM4_ENCRYPT) cipher.set_key(key, sm4.SM4_ENCRYPT)
encrypted_data = cipher.crypt_ecb(data.encode('utf-8')) encrypted_data = cipher.crypt_ecb(data.encode('utf-8'))
return encrypted_data.hex() return base64.b64encode(encrypted_data).decode('utf-8')
def decrypt_ecb(encrypted_hex, key): def decrypt_ecb(encrypted_hex: str, key: bytes) -> str:
cipher = sm4.CryptSM4() cipher = sm4.CryptSM4()
cipher.set_key(key.encode('utf-8'), sm4.SM4_DECRYPT) cipher.set_key(key, sm4.SM4_DECRYPT)
decrypted_data = cipher.crypt_ecb(bytes.fromhex(encrypted_hex)) decrypted_data = cipher.crypt_ecb(bytes.fromhex(encrypted_hex))
return decrypted_data.decode('utf-8') 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 = sm4.CryptSM4()
cipher.set_key(key.encode('utf-8'), sm4.SM4_ENCRYPT) cipher.set_key(key, sm4.SM4_ENCRYPT)
# 生成随机的16字节IV # 生成随机的16字节IV
iv = os.urandom(16) iv = os.urandom(16)
@ -25,11 +35,13 @@ def encrypt_cbc_with_iv(data, key):
encrypted_data = cipher.crypt_cbc(iv, data.encode('utf-8')) encrypted_data = cipher.crypt_cbc(iv, data.encode('utf-8'))
# 将IV和加密后的数据拼接在一起 # 将IV和加密后的数据拼接在一起
return iv + encrypted_data return base64.b64encode(iv + encrypted_data).decode('utf-8')
def decrypt_cbc_with_iv(encrypted_bytes, key):
def decrypt_cbc_with_iv(encrypted_bytes_base64: str, key) -> str:
encrypted_bytes = base64.b64decode(encrypted_bytes_base64)
cipher = sm4.CryptSM4() cipher = sm4.CryptSM4()
cipher.set_key(key.encode('utf-8'), sm4.SM4_DECRYPT) cipher.set_key(key, sm4.SM4_DECRYPT)
# 提取IV # 提取IV
iv = encrypted_bytes[:16] iv = encrypted_bytes[:16]
@ -39,12 +51,13 @@ def decrypt_cbc_with_iv(encrypted_bytes, key):
# 解密数据 # 解密数据
decrypted_data = cipher.crypt_cbc(iv, encrypted_data) decrypted_data = cipher.crypt_cbc(iv, encrypted_data)
return decrypted_data.decode('utf-8') return base64.b64decode(decrypted_data).decode('utf-8')
if __name__ == "__main__": if __name__ == "__main__":
# 示例数据和密钥 # 示例数据和密钥
data = "Hello, SM4!" data = "Hello, SM4!"
key = "1234567890abcdef" key = b"1234567890abcdef"
# 加密 # 加密
encrypted_data = encrypt_ecb(data, key) encrypted_data = encrypt_ecb(data, key)
@ -56,7 +69,7 @@ if __name__ == "__main__":
# 示例数据和密钥 # 示例数据和密钥
data = "Hello, SM4 CBC with random IV!" data = "Hello, SM4 CBC with random IV!"
key = "1234567890abcdef" key = b"1234567890abcdef"
# 加密 # 加密
encrypted_data = encrypt_cbc_with_iv(data, key) encrypted_data = encrypt_cbc_with_iv(data, key)

Loading…
Cancel
Save