首页 > 其他分享 >课设第二周

课设第二周

时间:2022-11-17 08:23:24浏览次数:60  
标签:AES 加密 key 课设 sm4 第二周 file out

python通过Cryptodome使用AES加密数据

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

data = b'secret data'

key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(data)

file_out = open("encrypted.bin", "wb")
[ file_out.write(x) for x in (cipher.nonce, tag, ciphertext) ]
file_out.close()

file_in = open("encrypted.bin", "rb")
nonce, tag, ciphertext = [ file_in.read(x) for x in (16, 16, -1) ]

# let's assume that the key is somehow available again
cipher = AES.new(key, AES.MODE_EAX, nonce)
data = cipher.decrypt_and_verify(ciphertext, tag)
print(data)

生成RSA密钥

from Crypto.PublicKey import RSA
#对密钥加密的密码
secret_code = "Unguessable"
#生成一个 2048 位的密钥
key = RSA.generate(2048)

#导出私钥,passphrase 指定了对私钥加密的密码
encrypted_key = key.export_key(passphrase=secret_code, pkcs=8,
                              protection="scryptAndAES128-CBC")

#将私钥保存到文件
file_out = open("rsa_key.bin","wb")
file_out.write(encrypted_key)
file_out.close()

#输出公钥
print(key.publickey().export_key())

生成公钥和私钥

生成了私钥并保存到private.pem,之后生成了公钥,保存为receiver.pem

from Crypto.PublicKey import RSA
#生成密钥
key = RSA.generate(2048)

#保存私钥
private_key = key.export_key()
file_out = open("private.pem", "wb")
file_out.write(private_key)
file_out.close()

#保存公钥
public_key = key.publickey().export_key()
file_out = open("receiver.pem", "wb")
file_out.write(public_key)
file_out.close()

RSA + AES混合加密

为了加密任意数量的数据,这里使用混合加密方式(RSA+AES)。这里使用 RSA 和 PKCS#1oaep 对 AES 会话密钥进行非对称加密

from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES, PKCS1_OAEP

#要加密的数据
data = "I met aliens in UFO. Here is the map.".encode("utf-8")
#加密数据的输出
file_out = open("encrypted_data.bin", "wb")

#读取公钥
recipient_key = RSA.import_key(open("receiver.pem").read())


session_key = get_random_bytes(16)

# Encrypt the session key with the public RSA key
#加密会话密钥
cipher_rsa = PKCS1_OAEP.new(recipient_key)
enc_session_key = cipher_rsa.encrypt(session_key)

# Encrypt the data with the AES session key
#利用 AES 会话密钥加密数据
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
[ file_out.write(x) for x in (enc_session_key, cipher_aes.nonce, tag, ciphertext) ]
file_out.close()


对于拥有私钥的解密者,首先使用私钥对会话密钥进行解密,再用会话密钥解密文件:

from Crypto.PublicKey import RSA
from Crypto.Cipher import AES, PKCS1_OAEP

file_in = open("encrypted_data.bin", "rb")

#导入私钥
private_key = RSA.import_key(open("private.pem").read())

#读取 AES 的相关参数
enc_session_key, nonce, tag, ciphertext = \
   [ file_in.read(x) for x in (private_key.size_in_bytes(), 16, 16, -1) ]

# Decrypt the session key with the private RSA key
# 对会话密钥解密
cipher_rsa = PKCS1_OAEP.new(private_key)
session_key = cipher_rsa.decrypt(enc_session_key)

# Decrypt the data with the AES session key
#使用会话密钥解密数据
cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
data = cipher_aes.decrypt_and_verify(ciphertext, tag)
print(data.decode("utf-8"))


安装gmssl(pip install gmssl)和pysmx(pip install snowland-smx)

https://gitee.com/basddsa/hggm#https://gitee.com/link?target=https%3A%2F%2Fblog.csdn.net%2Fqq_43339242%2Farticle%2Fdetails%2F123709822

python实现sm4

通过gmssl

##############################################################################
#                                                                            #
#                            国产SM4加密算法                                  #
#                                                                            #
##############################################################################

import binascii

from gmssl import sm4


class SM4:
    """
    国产加密 sm4加解密
    """

    def __init__(self):
        self.crypt_sm4 = sm4.CryptSM4()  # 实例化

    def str_to_hexStr(self, hex_str):
        """
        字符串转hex
        :param hex_str: 字符串
        :return: hex
        """
        hex_data = hex_str.encode('utf-8')
        str_bin = binascii.unhexlify(hex_data)
        return str_bin.decode('utf-8')

    def encryptSM4(self, encrypt_key, value):
        """
        国密sm4加密
        :param encrypt_key: sm4加密key
        :param value: 待加密的字符串
        :return: sm4加密后的十六进制值
        """
        crypt_sm4 = self.crypt_sm4
        crypt_sm4.set_key(encrypt_key.encode(), sm4.SM4_ENCRYPT)  # 设置密钥
        date_str = str(value)
        encrypt_value = crypt_sm4.crypt_ecb(date_str.encode())  # 开始加密。bytes类型
        return encrypt_value.hex()  # 返回十六进制值

    def decryptSM4(self, decrypt_key, encrypt_value):
        """
        国密sm4解密
        :param decrypt_key:sm4加密key
        :param encrypt_value: 待解密的十六进制值
        :return: 原字符串
        """
        crypt_sm4 = self.crypt_sm4
        crypt_sm4.set_key(decrypt_key.encode(), sm4.SM4_DECRYPT)  # 设置密钥
        decrypt_value = crypt_sm4.crypt_ecb(bytes.fromhex(encrypt_value))  # 开始解密。十六进制类型
        return decrypt_value.decode()
        # return self.str_to_hexStr(decrypt_value.hex())


if __name__ == '__main__':
    key = "f38fc9b32af486e65d6f93dbc41b9123"
    strData = "90897h8789thvht"
    SM4 = SM4()
    print("原字符:", strData)
    encData = SM4.encryptSM4(key, strData)  # 加密后的数据,返回bytes类型
    print("sm4加密结果:", encData)
    
    decData = SM4.decryptSM4(key, encData)
    print("sm4解密结果:", decData)  # 解密后的数据

标签:AES,加密,key,课设,sm4,第二周,file,out
From: https://www.cnblogs.com/yycyhyhf/p/16892936.html

相关文章

  • 课设第一周进展(snowland-smx)
    安装snowland-smxsnowland-smx简介snowland-smx是python实现的国密套件,对标python实现的gmssl,包含国密SM2,SM3,SM4,SM9,ZUC等。其代码实现效率上优于gmssl,接口设计上也......
  • 第二周 学习进度汇报
    第二周本周学习进度汇报:理论学习了解学习了Encoder-Decoder架构、Attention模型、Transformer原理;实践学习基于Transformer原理实现德语->英语机器翻译小例子;Transf......
  • 第二周总结
    OpenFlow论文有感InternetHistory,Technology,andSecurity课程学习第二周总结......
  • Leetcode刷题第二周
    链表:插入快,查询慢,存储不连续分为单链表,双链表和循环链表在链表中使用虚拟头结点,可以减少增删改查中对头结点的特殊处理移除链表元素203/***Definitionforsingly......
  • 第二周作业
    #!/bin/bashifconfig|grepinet|head-n1|tr-s''|cut-d""-f3ifconfig|grepinet|head-n1|tr-s''|cut-d""-f3|grep'3'>/dev/nullTEST=$......
  • C++OOP课设
    C++OOP课设您的第一个任务是编写一个代码示例,该示例集成并演示了C++中OOP的以下方面:●通过使用多个类进行继承。这应该包括作为一个例子的多重继承,这在现实世界中并不一......
  • 狐漠漠养成日记 Cp.00003 第二周
    上一周整周都在做UnityNewbiesJam,除了一些必要的比如考试或者课程,其他的都推后了。为了赶项目进度,这一周我可以说是废寝忘食,基本上每天一顿饭,就睡仨小时那种。以至于到......
  • 学习计划【硬件课程设计】【课设】
    学习计划【硬件课程设计】【课设】​​前言​​​​学习计划【硬件课程设计】【课设】​​​​时间内容及工作安排​​​​一、基础实验(30分):​​​​二、自选试验(70分):​​​......
  • 学生小组设计自选实验【硬件课设】
    学生分组和选题【硬件课程设计】​​前言​​​​推荐​​​​学生小组设计自选实验​​​​1方案设计​​​​2系统原理图设计​​​​3系统仿真与仿真结果​​​​4PCB......
  • 第二周总结
    文件操作打开方式#推荐用第二种1.f=open(文件路径,读写模式,encoding='utf8')f.close2.withopen(文件路径,读写模式,encoding='utf8')asf\n撬棍加一些字母会产......