• 国密算法:利用python进行sm4算法的加解密,对称密钥


    本篇利用python中的gmssl库进行sm4算法的加解密演示。

    国密算法sm4特点:

    • 密钥长度:16bytes(128bits)
    • 分组长度和密钥长度均为128bits;
    • 是对称加密算法;分为ecb模式和cbc模式;
    • 明文和密文的长度相同;
    • 同样的数据,同样的key,每次加密结果一样。
    • 与DES和AES算法相似,国密SM4算法是一种分组加密算法。SM4分组密码算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成;
    • 加密算法和密钥扩展算法迭代轮数均为32轮;SM4加解密过程的算法相同但是轮密钥的使用顺序相反;
    • SM4密码算法使用模2加和循环移位作为基本运算;
    • 密钥扩展算法:SM4算法使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,总共使用32个轮密钥。
      因此需要使用密钥扩展算法,从加密密钥中产生32个轮密钥。

    gmssl库中的sm4:

    python提供了sm4算法相关的包,可以用导入gmssl包,利用这个包提供的sm4算法进行数据的加解密。

    #导入国密算法sm4包
    from gmssl import sm4
    
    • 1
    • 2

    常用API:

    实例化:sm4.CryptSM4()
    设置加密密钥key:set_key(key, sm4.SM4_ENCRYPT) # 设置密钥
    加密:crypt_ecb(plaintext)

    设置解密密钥key:set_key(key, sm4.SM4_DECRYPT) # 设置密钥
    解密:crypt_ecb(chipertext)

    测试代码:

    import binascii
    
    #导入国密算法sm4包
    from gmssl import sm4
    
    def sm4_encode(key, data):
        """
        国密sm4加密
        :param key: 密钥
        :param data: 原始数据
        :return: 密文hex
        """
        sm4Alg = sm4.CryptSM4()  # 实例化sm4
        sm4Alg.set_key(key.encode(), sm4.SM4_ENCRYPT)  # 设置密钥
        dateStr = str(data)
        print("明文:", dateStr);
        enRes = sm4Alg.crypt_ecb(dateStr.encode())  # 开始加密,bytes类型,ecb模式
        enHexStr = enRes.hex()
        print("密文:", enHexStr);
        return enHexStr # 返回十六进制值
        # return encrypt_value.hex()  
    
    def sm4_decode(key, data):
        """
        国密sm4解密
        :param key: 密钥
        :param data: 密文数据
        :return: 明文hex
        """
        sm4Alg = sm4.CryptSM4()  # 实例化sm4
        sm4Alg.set_key(key.encode(), sm4.SM4_DECRYPT)  # 设置密钥
        deRes = sm4Alg.crypt_ecb(bytes.fromhex(data))  # 开始解密。十六进制类型,ecb模式
        deHexStr = deRes.decode()
        print("解密后明文:", deRes);
        print("解密后明文hex:", deHexStr);
        return deHexStr
    
    #测试函数
    def test():
        key = "E1A90FB64DDE12AE";  
        strData = "12345abcde"
    
        enHexRes = sm4_encode(key,strData);
    
        print("解密测试===",enHexRes);
    
        sm4_decode(key,enHexRes);
    
    # main 
    if __name__ == '__main__':
        print("main begin");
        test();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    测试结果:

    % python sm4_t3.py
    main begin
    明文: 12345abcde
    密文: 39b1d120849884da97b57830de18fb75
    解密测试=== 39b1d120849884da97b57830de18fb75
    解密后明文: b’12345abcde’
    解密后明文hex: 12345abcde

  • 相关阅读:
    软件设计模式系列之十四——代理模式
    springboot实现ACL+RBAC权限体系
    响应头缺失、Options方法
    一次就能释放大量Mac内存空间的方法,你用过哪种?
    UNIAPP-ADB无线调试
    Clickhouse基准测试实践
    录屏功能怎么打开?检查一下你的电脑这些设置
    SQL注入 Less26(过滤空格和注释符,使用不带空格的报错注入)
    6 Redis的慢查询&配置
    Android 系统定位和高德定位
  • 原文地址:https://blog.csdn.net/liranke/article/details/127796991