实验二验收3

密码算法

实现了基于python库gmssl和pysmx的sm2、sm3、sm4算法,加密公文还使用了rc4对称算法,采用sha-256算法保护用户的密码

sm2加解密、签名验签代码如下

from pysmx.SM2 import generate_keypair
import pysmx
import base64
len_para = 64
pk, sk = generate_keypair(len_para)
sig = pysmx.SM2.Sign("20181204", sk, '12345678', len_para)
print('签名验签')
print("签名:", base64.b64encode(sig))
print("明文:20181204")
print("验签结果:",pysmx.SM2.Verify(sig, "20181204", pk, len_para))
hash_algorithm = "sm3"
e = b"20181204"
print("-"*100)
print('加解密')
print('明文 = %s' % e)
C = pysmx.SM2.Encrypt(e, pk, len_para, 0, hash_algorithm=hash_algorithm)
print('密文 = %s' % C)
m = pysmx.SM2.Decrypt(C, sk, len_para, hash_algorithm=hash_algorithm)
print('解密结果 = %s' % m)

sm3哈希算法如下

from pysmx.SM3 import digest
from pysmx.SM3 import SM3

'''
s = '20181204'
print(digest(s))
'''

sm3 = SM3()
sm3.update('20181204')
print(sm3.hexdigest())

sm4对称算法加解密代码如下

from pysmx.SM4 import Sm4, ENCRYPT, DECRYPT
import base64
key_data = b'2018120420181204'  # 至少16字节
sm4 = Sm4()
input_data = b"2018120420181204"
print("明文",input_data)
sm4.sm4_set_key(key_data, ENCRYPT)
msg = sm4.sm4_crypt_ecb(input_data)
print("密文",msg)
sm4.sm4_set_key(key_data, DECRYPT)
m_b = sm4.sm4_crypt_ecb(msg)
print("解密后的明文",m_b)

利用gmssl库实现的sm2、3、4(由同组同学李长兴写的)

#! /usr/bin/python
# encoding : utf-8
import time
import base64
from gmssl import sm2,sm4
import codecs
SM2_PRIVATE_KEY = '00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'
SM2_PUBLIC_KEY = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'
sm2_crypt = sm2.CryptSM2(public_key=SM2_PUBLIC_KEY, private_key=SM2_PRIVATE_KEY)

SM4_KEY = b'3l5butlj26hvv313'
SM4_IV = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' #  bytes类型
sm4_crypt = sm4.CryptSM4()

def base64_en(png_org,png_en):
    with open(png_org, 'rb') as f:
        image_base64 = str(base64.b64encode(f.read()), encoding='utf-8')
    with open(png_en,'wt') as f_en:
        f_en.write(image_base64)

def base64_de(png_en,png_de):
    with open(png_en,"r") as f:
        imgdata = base64.b64decode(f.read())
    with open(png_de,'wb+') as f_de:
        f_de.write(imgdata)

def sm2_en(png_org,png_en):
    with open(png_org, 'rb') as f:
        image_base64 = base64.b64encode(f.read())
        image_sm2 = str(sm2_crypt.encrypt(image_base64))
    with open(png_en,'wt') as f_en:
        f_en.write(image_sm2)

def sm2_de(png_en,png_de):
    with open(png_en,"r") as f:
        image_sm2 = codecs.escape_decode(bytes(f.read()[2:-1],encoding="utf-8"), "hex-escape")[0]
        image_base64 = sm2_crypt.decrypt(image_sm2)
        imgdata = base64.b64decode(image_base64)
    with open(png_de,'wb') as f_de:
        f_de.write(imgdata)

def sm4_en(png_org,png_en):
    sm4_crypt.set_key(SM4_KEY, sm4.SM4_ENCRYPT)
    time_start = time.time()
    print(time_start)
    with open(png_org, 'rb') as f:
        image_base64 = base64.b64encode(f.read())
        time_1 = time.time()
        print(time_1-time_start)
        image_sm4 = str(sm4_crypt.crypt_ecb(image_base64))
        time_2 = time.time()
        print(time_2 - time_1)
    with open(png_en,'wt') as f_en:
        f_en.write(image_sm4)

def sm4_de(png_en,png_de):
    sm4_crypt.set_key(SM4_KEY, sm4.SM4_DECRYPT)
    with open(png_en,"r") as f:
        image_sm4 = codecs.escape_decode(bytes(f.read()[2:-1],encoding="utf-8"), "hex-escape")[0]
        image_base64 = sm4_crypt.crypt_ecb(image_sm4)
        imgdata = base64.b64decode(image_base64)
    with open(png_de,'wb') as f_de:
        f_de.write(imgdata)


if __name__ == '__main__':
    #f_org ='bas.txt'
    #f_en ='basen.txt'
    #f_de ='basde.txt'
    # f_org = '1.png'
    # f_en = '12321.txt'
    # f_de = '123321.png'
    # pngfile_base64_en(p_org,p_en)
    # pngfile_base64_de(p_en,p_de)
    f_org = 'abc.pdf'
    f_en = '2.txt'
    f_de = 'asdf+z44.pdf'
    #sm2_en(f_org,f_en)
    #sm2_de(f_en,f_de)
    time_start = time.time()
    sm4_en(f_org,f_en)
    time_mid = time.time()
    print(time_mid-time_start)
    sm4_de(f_en,f_de)
    time_end = time.time()
    print(time_end-time_mid)
posted @ 2023-06-04 22:40  孙菲遥  阅读(91)  评论(0编辑  收藏  举报