|
|
|
@ -1,15 +1,37 @@
|
|
|
|
|
# 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来
|
|
|
|
|
from encodings.base64_codec import base64_encode
|
|
|
|
|
from entity.Letter import Letter
|
|
|
|
|
from tool import PriKeyHelper
|
|
|
|
|
from tool.PriKeyHelper import getUserKey
|
|
|
|
|
from tool.asymmetric import RSA
|
|
|
|
|
from tool.symmetric.AES import AESUtils
|
|
|
|
|
from tool.symmetric.SM4 import encrypt_ecb, decrypt_cbc_with_iv
|
|
|
|
|
from Crypto.Random import get_random_bytes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 两个变量,记录信封
|
|
|
|
|
letterWay = ""
|
|
|
|
|
letterMode = ""
|
|
|
|
|
letterSymKey = ""
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
# 用户输入各种数据填充letter字段
|
|
|
|
|
data = "Hello, AES!"
|
|
|
|
|
|
|
|
|
|
data, akey = SymEncryption(data)
|
|
|
|
|
|
|
|
|
|
Letter.sign = getSign()
|
|
|
|
|
Letter.encryptType = getEncryptType()
|
|
|
|
|
Letter.encryptKey = getEncryptKey()
|
|
|
|
|
Letter.recvPubKey = getRecvPubKey()
|
|
|
|
|
Letter.senderPubKey = getSenderPubKey()
|
|
|
|
|
|
|
|
|
|
print(Letter.sign)
|
|
|
|
|
print(Letter.encryptType)
|
|
|
|
|
print(Letter.encryptKey)
|
|
|
|
|
print(Letter.recvPubKey)
|
|
|
|
|
print(Letter.senderPubKey)
|
|
|
|
|
|
|
|
|
|
# 获取用户的公私钥对进行签名
|
|
|
|
|
# 使用对方的公钥进行加密
|
|
|
|
|
# 发送信件
|
|
|
|
@ -61,36 +83,72 @@ def selectSymEncryptionChoice():
|
|
|
|
|
|
|
|
|
|
# 使用对称加密,返回加密后的数据和随机生成的密钥
|
|
|
|
|
def SymEncryption(encryData, key: bytes = None):
|
|
|
|
|
|
|
|
|
|
global letterSymKey
|
|
|
|
|
# 获得加密的方法和加密的模式
|
|
|
|
|
way, mode = selectSymEncryptionChoice()
|
|
|
|
|
|
|
|
|
|
if way == "aes":
|
|
|
|
|
aesUtils = AESUtils(key)
|
|
|
|
|
encryptedData, trueKey = aesUtils.encrypt(encryData, mode=mode) # 这里encryData要改为文件内容
|
|
|
|
|
letterSymKey = trueKey
|
|
|
|
|
|
|
|
|
|
return encryptedData,trueKey
|
|
|
|
|
|
|
|
|
|
if way == "sm4":
|
|
|
|
|
key = get_random_bytes(16)
|
|
|
|
|
if mode == "ecb":
|
|
|
|
|
encrypted_data = encrypt_ecb(data, key)
|
|
|
|
|
encrypted_data = encrypt_ecb(encryData, key)
|
|
|
|
|
# mode 为 cbc
|
|
|
|
|
else:
|
|
|
|
|
encrypted_data = decrypt_cbc_with_iv(data, key)
|
|
|
|
|
encrypted_data = decrypt_cbc_with_iv(encryData, key)
|
|
|
|
|
|
|
|
|
|
letterSymKey = key
|
|
|
|
|
|
|
|
|
|
return encrypted_data, key
|
|
|
|
|
|
|
|
|
|
# 获得签名
|
|
|
|
|
def getSign():
|
|
|
|
|
|
|
|
|
|
def getKey():
|
|
|
|
|
pass
|
|
|
|
|
#计算文件bytes
|
|
|
|
|
document_bytes = ""
|
|
|
|
|
priKey, pubKey = PriKeyHelper.getUserKey()
|
|
|
|
|
signDocuHash = RSA.sign_message(document_bytes, priKey)
|
|
|
|
|
|
|
|
|
|
return signDocuHash
|
|
|
|
|
|
|
|
|
|
def getEncryptType():
|
|
|
|
|
encryType = f"{letterWay}_{letterMode}".upper()
|
|
|
|
|
|
|
|
|
|
return encryType
|
|
|
|
|
|
|
|
|
|
# 对称密钥,返回的是使用接收方公钥加密后的密钥
|
|
|
|
|
def getEncryptKey():
|
|
|
|
|
rsaEncrySymKey = RSA.encrypt_message(letterSymKey, getRecvPubKey())
|
|
|
|
|
|
|
|
|
|
return rsaEncrySymKey
|
|
|
|
|
|
|
|
|
|
# 获得接收方的公钥
|
|
|
|
|
def getRecvPubKey():
|
|
|
|
|
# recPubKey = input("plz input Receiver's Public Key: ")
|
|
|
|
|
recPubKey = getUserKey()[1]
|
|
|
|
|
return recPubKey
|
|
|
|
|
|
|
|
|
|
# 获得发送方的公钥
|
|
|
|
|
def getSenderPubKey():
|
|
|
|
|
privateKey, publicKey = getUserKey()
|
|
|
|
|
return publicKey
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
# 示例数据和密钥
|
|
|
|
|
data = "Hello, AES!"
|
|
|
|
|
|
|
|
|
|
data, akey = SymEncryption(data)
|
|
|
|
|
# data = "Hello, AES!"
|
|
|
|
|
#
|
|
|
|
|
# data, akey = SymEncryption(data)
|
|
|
|
|
|
|
|
|
|
print(data,akey)
|
|
|
|
|
# print(data,akey)
|
|
|
|
|
#
|
|
|
|
|
# encryptType = f"{letterWay}_{letterMode}".upper()
|
|
|
|
|
# print(encryptType)
|
|
|
|
|
|
|
|
|
|
encryptType = f"{letterWay}_{letterMode}".upper()
|
|
|
|
|
print(encryptType)
|
|
|
|
|
main()
|