Python实现SM4算法

Python实现SM4算法

SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

  最近在写Python脚本时,需要用到SM4算法,通过百度查找SM4算法实现基本都是基于c语言。用于Python的只有看到一篇http://blog.csdn.net/siddontang/article/details/8952632提到,不过是通过工具将c转换到Python。到GitHub上下载代码来,安装到Python环境,果断出错 o(╥﹏╥)o
  
error

  看错误提示百度一下vcvarsall.bat,感觉解决起来又是比较麻烦,就是解决这个错误说不定还有其他错误;另一种思路是将c代码编译成dll库在Python中调用,不过也比较麻烦,先得装c的编译器。
  SM4属于分组对称算法,主要是通过sbox做非线性变换,移位操作进行线性变换,难度应该不大。查看SM4的c代码发现确实不是很复杂,于是将其移植到Python语言,简单测试了几组标准数据及2k的文件,可以正常使用。

主要实现的函数有:

1、int型数据及list相互转化,大端模式

def GET_UINT32_BE(key_data):
    tmp_data = int((key_data[0] << 24) | (key_data[1] << 16) | (key_data[2] << 8) | (key_data[3]))
    return tmp_data

def PUT_UINT32_BE(n):
    return [int((n>>24)&0xff), int((n>>16)&0xff), int((n>>8)&0xff), int((n)&0xff)]

2、移位运算

def SHL(x, n):
    xx = int(int(x << n) & 0xffffffff)
    return xx

def ROTL(x, n):
    xx = SHL(x, n)
    yy = xx | int((x >> (32 - n)) & 0xffffffff)
    return yy

3、list的异或运算

def XOR(a, b):
    return list(map(lambda x, y: x ^ y, a, b))

4、S盒变换,也就是查表SboxTable

def sm4Sbox(idx):
    return SboxTable[idx]

5、外部调用接口

ECB运算:

 sm4_crypt_ecb(mode, key, data)

CBC运算:

sm4_crypt_cbc(mode, key, iv, data)
    其中,mode:0为加密,1为解密

具体代码参考:链接: https://pan.baidu.com/s/1nwVXzcP 密码: a2f9

总结,将c代码移植到Python比较容易,一些在Python下找不到现有库的算法也可以考虑直接用Python实现。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
SM4算SM4算法是一法是一种分组种分组密码算法,也是中国自密码算法,也是中国自主设计的密码算法之一。下面是使用Python实现SM4算法的主设计的密码算法之一。下面是使用Python实现SM4算法的示例代码: ``` from示例代码: ``` from Crypto.Cipher Crypto.Cipher import SM4 import SM4 key =key = b b'012'01234567893456789abcdef' plaintextabcdef' plaintext = b' = b'Hello, world!' Hello, worldcipher = SM!' cipher =4.new(key SM,4.new SM4.MODE_E(key, SMCB) c4.MODE_Eiphertext = cipherCB) c.encrypt(plaintext) print(ciphertext = cipher.encrypt(plaintextiphertext.hex()) ) print(c```iphertext.hex()) ``` 在这个示例中,我们使用了Python的`Crypto`库来实现SM4算法。首先,我们定义了一个16字节的密钥和一个明 在这个示例中,我们使用了Python的`Crypto`库来实现SM4算法。首先,我们定义了一个16字节的密钥和一个明文。然后,我们使用`SM4.new()`函数创建了一个SM4加密器,并指定了ECB模式。最后,我们使用加密器的`encrypt文。然后,我们使用`SM4.new()`函数创建了一个SM4加密器,并指定了ECB模式。最后,我们使用加密器的`encrypt()`函数对明文进行加密,并将结果以十六进制字符串的形式输出。 需要注意的是,为了使用`Crypto`库,你需要先安装它。你可以使用以下命令来安装: ``` pip install pycryptodome ```()`函数对明文进行加密,并将结果以十六进制字符串的形式输出。 需要注意的是,为了使用`Crypto`库, 你需要先安装它。你可以使用以下命令来安装: ``` pip install pycryptodome ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值