SM4介绍

SM4算法是一种对称加密算法,也被称为国密算法。它是由中国密码学家设计的,已被列入国家密码局的标准。

SM4算法使用128位的密钥和分组大小,使用32轮迭代加密,可以用于加密数据和验证消息认证码。它的加密效率很高,安全性也很好,被广泛应用于各种安全领域,如电子商务、移动通信和云计算等。

算法实现流程图

加密算法

密钥扩展算法


其中,K0~K3的生成过程如下:
设输入的密钥为MK=(MK0,MK1,MK2,MK3),则(K0,K1,K2,K3)=(MK0 ^ FK0,MK1 ^ FK1,MK2 ^ FK2,MK3 ^ FK3)
注:

  1. CKi以及FKi为常数
  2. i 的取值为 i=0,1,…31,共生成32个子密钥

源码

加密

S_BOX = [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, 0xDC, 0x4D, 0x20, 0x79, 0xEE, 0x5F, 0x3E, 0xD7, 0xCB, 0x39, 0x48]FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc]
CK = [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
]def wd_to_byte(wd, bys):bys.extend([(wd >> i) & 0xff for i in range(24, -1, -8)])def bys_to_wd(bys):ret = 0for i in range(4):bits = 24 - i * 8ret |= (bys[i] << bits)return retdef s_box(wd):"""进行非线性变换,查S盒:param wd: 输入一个32bits字:return: 返回一个32bits字   ->int"""ret = []for i in range(0, 4):byte = (wd >> (24 - i * 8)) & 0xffrow = byte >> 4col = byte & 0x0findex = (row * 16 + col)ret.append(S_BOX[index])return bys_to_wd(ret)def rotate_left(wd, bit):""":param wd: 待移位的字:param bit: 循环左移位数:return:"""return (wd << bit & 0xffffffff) | (wd >> (32 - bit))def Linear_transformation(wd):"""进行线性变换L:param wd: 32bits输入"""return wd ^ rotate_left(wd, 2) ^ rotate_left(wd, 10) ^ rotate_left(wd, 18) ^ rotate_left(wd, 24)def Tx(k1, k2, k3, ck):"""密钥扩展算法的合成变换"""xor = k1 ^ k2 ^ k3 ^ ckt = s_box(k1 ^ k2 ^ k3 ^ ck)return t ^ rotate_left(t, 13) ^ rotate_left(t, 23)def T(x1, x2, x3, rk):"""加密算法轮函数的合成变换"""t = x1 ^ x2 ^ x3 ^ rkt = s_box(t)return t ^ rotate_left(t, 2) ^ rotate_left(t, 10) ^ rotate_left(t, 18) ^ rotate_left(t, 24)def key_extend(main_key):MK = [(main_key >> (128 - (i + 1) * 32)) & 0xffffffff for i in range(4)]# 将128bits分为4个字keys = [FK[i] ^ MK[i] for i in range(4)]# 生成K0~K3RK = []for i in range(32):t = Tx(keys[i + 1], keys[i + 2], keys[i + 3], CK[i])k = keys[i] ^ tkeys.append(k)RK.append(k)return RKdef R(x0, x1, x2, x3):# 使用位运算符将数值限制在32位范围内x0 &= 0xffffffffx1 &= 0xffffffffx2 &= 0xffffffffx3 &= 0xffffffffs = f"{x3:08x}{x2:08x}{x1:08x}{x0:08x}"return sdef encode(plaintext, rk):X = [plaintext >> (128 - (i + 1) * 32) & 0xffffffff for i in range(4)]for i in range(32):t = T(X[1], X[2], X[3], rk[i])c = (t ^ X[0])X = X[1:] + [c]ciphertext = R(X[0], X[1], X[2], X[3])# 进行反序处理return ciphertextdef decode(ciphertext, rk):ciphertext = int(ciphertext, 16)X = [ciphertext >> (128 - (i + 1) * 32) & 0xffffffff for i in range(4)]for i in range(32):t = T(X[1], X[2], X[3], rk[31 - i])c = (t ^ X[0])X = X[1:] + [c]m = R(X[0], X[1], X[2], X[3])return mdef output(s, name):out = ""for i in range(0, len(s), 2):out += s[i:i + 2] + " "print(f"{name}:", end="")print(out.strip())if __name__ == '__main__':plaintext = 0x0123456789abcdeffedcba9876543210main_key = 0x0123456789abcdeffedcba9876543210rk = key_extend(main_key)print("加密:")ciphertext = encode(plaintext, rk)output(ciphertext, "ciphertext")print("解密:")m = decode(ciphertext, rk)output(m, "plaintext")

解密

由于SM4算法是对合运算,因此解密算法与加密算法相同,只是轮密钥的使用顺序相反。

运行结果

加密:
ciphertext:68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46
解密
plaintext:01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10

国密算法 SM4加密算法 Python完整实现相关推荐

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

    本篇利用python中的gmssl库进行sm4算法的加解密演示. 国密算法sm4特点: 密钥长度:16bytes(128bits) 分组长度和密钥长度均为128bits: 是对称加密算法:分为ecb模 ...

  2. 国密算法-SM4加解密工具类

    import cn.hutool.crypto.symmetric.SymmetricCrypto;/*** @author : chenfan* @className : SM4Utils* @da ...

  3. PHP实现国密算法SM4

    关于什么是国密算法,我就不多赘述了,好奇的可以看这位博主的文章,好像有简易文档的下载链接(百度文库好像也有) 传送门: http://blog.csdn.net/archimekai/article/ ...

  4. 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用

    本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...

  5. 关于国密算法SM4的流程

    关于国密算法SM4的流程 原来用于无线局域网的国密算法SMS4被定义为SM4作为密码行业标准发布.SM4是一个分组对称密钥算法,明文.密钥.密文都是16字节,加密和解密密钥相同.通过32次循环的非线性 ...

  6. 国密算法 SM4 对称加密 分组密码 python实现完整代码

    目前,python实现的国密算法库主要是python-gmssl库和snowland-smx(pysmx)库,二者都对SM2(仅公钥加解密和数字签名).SM3.SM4进行了细致而优雅的实现. GMSS ...

  7. 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用

    我们继续来进行国密算法的演示. 本篇演示sm2非对称算法的实现,国密算法库gmssl的使用. 一 sm2算法的特点: sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的: 非对称加密算法,即有 ...

  8. SM4国密算法原理及python代码实现

    SM4简介 SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布.相关标准为"GM/T 0002-2012<SM4分组密 ...

  9. 国密算法SM4 的JAVA实现(基于BC实现)

    一.pom文件引用 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov- ...

最新文章

  1. [原创]Gerrit中文乱码问题解决方案分享
  2. 瞎聊Spring Cloud
  3. ng-template 和 TemplateRef.createEmbeddedView
  4. windows7 nginx php mysql_windows7配置Nginx+php+mysql的详细教程
  5. centos amd双显卡_PCIe4.0和PCIe3.0对显卡性能差别大吗?
  6. OpenCV形态学运算
  7. postgresql基本使用(一)
  8. PAT1011. A+B和C
  9. oracle tcp 上限,操作系统用户最大进程数限制maxuproc
  10. openwrt 添加luci选项
  11. Javascript特效:利用给节点增加参数或者闭包实现百度首页换肤
  12. 第七章 Android嵌入式组态软件
  13. 流行的灯谜集锦(包括天鹅类)
  14. 计算机网络与通信第二版复习,自学考试计算机网络与通信笔记第二章
  15. canvas给文字增加阴影效果
  16. 排查定时任务为什么不执行
  17. 为什么大部分人做网赚是赚不到钱的,这才是真正的原因!
  18. 从CMS垃圾回收器分析常用的垃圾回收算法
  19. Github webhooks 自动部署博客文章,使用总结【含视频】
  20. 基于触摸屏的LED驱动电路设计

热门文章

  1. com.sun.mail.smtp.protected void rcptTo() 方法
  2. 保健文汇杂志保健文汇杂志社保健文汇编辑部2022年第36期目录
  3. Matlab图形窗口大小的控制 ,plot窗口大小,figure大小,axis设置,实用
  4. linux下查看显卡和驱动版本
  5. vba xla文件宏文件解密
  6. 联想凌拓“开业大吉” 是试水还是全面变革的前兆?
  7. 网易邮箱大师中添加qq邮箱时,需要开启IMAP,一直卡在验证密保的界面
  8. 健康管理项目第九天(套餐预约之占比饼形图、运营数据统计、报表导出 )
  9. 前端模拟自动解析手机号姓名地址
  10. 如何申请试用MaxCompute 2.0