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
看错误提示百度一下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实现。