sm4国产加密算法的python代码实现

代码内容 

        内容针对了解原理但实现困难的同学,所以内容不再赘述。s盒和常参数等内容展示在最后。

         关于每轮运算后的换位(1234>2341):将计算结果直接添加到列表末尾,再以后四个元素作为新对象,便于密钥扩展中保留每一次的密钥

def exkey(key_w):#密钥扩展
	key = []
	for x in range(4):#密钥和初始参数异或
		a = eval('0x'+key_w[x*8+2:x*8+10])#分4组
		a = a^kwi[x]
		key.append(a)
	for x in range(32):#32轮密钥扩展
		s = ''
		a = key[-1]^key[-2]^key[-3]^cki[x]
		a = format(a,'032b')
		for y in range(0,30,8): #过s盒
			y = eval('0b' + a[y:y+8])
			y = sh[y]
			s += format(y,'08b')
		a = eval('0b'+s)
		s = s*2#字节拼凑后再选位置以实现字节的循环左移
		a = a^eval('0b'+s[13:45])^eval('0b'+s[23:55])#移位和异或
		key.append(a^key[x])
	return key[4:]#返回起作用的密钥
def function(m_in,key_in):#主函数
	ki = exkey(key_in)#获取密钥
	m = []
	for x in range(4):#分4组
		x = eval('0x'+m_in[x*8+2:x*8+10])
		m.append(x)
	for x in range(32):#过程同密钥扩展,不同在于下面的循环左移
		s = ''
		a = m[-1]^m[-2]^m[-3]^ki[x]
		a = format(a,'032b')
		for y in range(0,30,8):
			y = eval('0b' + a[y:y+8])
			y = sh[y]
			s += format(y,'08b')
		a = eval('0b'+ s)
		s = s*2
		a = a^eval('0b'+s[2:34])^eval('0b'+s[10:42])^eval('0b'+s[18:50])^eval('0b'+s[24:56])
		m.append(a^m[x])
	s = '0x'
	for x in range(1,5):#加密后倒序输出
		s += format(m[-x],'08x')
	return s

示范结果:

mw = '0x0123456789abcdeffedcba9876543210'
keyw = '0x01010101010101010101010101010101'
print(function(mw,keyw))

0x6fc90f5c54420aea50bbfefd76ab043b
[Finished in 193ms]

 其它内容

sh = [0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
	0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,
	0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,
	0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,
	0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,
	0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,
	0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,
	0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,0x18,0xf0,0x7d,0xec,0x3a,0xde,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48,
	]#s盒
kwi = [0x7fd7124d,0x8a63c998,0x12354889,0x00000011]#系统参数
cki = [0x00070E15,0x1C232A31,0x383F464D,0x545B6269,0x70777E85,0x8C939AA1,0xA8AFB6BD,0xC4CBD2D9,0xE0E7EEF5,0xFC030A11,0x181F262D,0x343B4249,0x50575E65,0x6C737A81,0x888F969D,0xA4ABB2B9,
		0xC0C7CED5,0xDCE3EAF1,0xF8FF060D,0x141B2229,0x30373E45,0x4C535A61,0x686F767D,0x848B9299,0xA0A7AEB5,0xBCC3CAD1,0xD8DFE6ED,0xF4FB0209,0x10171E25,0x2C333A41,0x484F565D,0x646B7279
	]#密钥常数

个人性编写请多包涵

如有错误请多指教,如有雷同纯属意外,如有侵权立即联系。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值