SM4分组加密算法原理和c语言实现

一、前言

    在之前的文章中介绍了《SM3国密杂凑值算法的原理和c语言实现》,这篇文章主要是用c语言撸一个SM4分组加密算法。

    随着信息安全的普及以及等级保护等安全政策落地,国密算法越来越频繁的出现在项目开发中,在较新的一些openssl版本中已经有了SM2、SM3、SM4等国密接口,还有Gmssl等开源加密库也均对国密算法进行了支持。

    不过在一些底层的开发中,尤其涉及到内核驱动层开发、TCM等密码卡开发,现有的一些加密库由于过多的依赖,是无法直接使用的,这时候恐怕就得要求开发人员对国密接口进行重新实现。

二、SM4分组加密算法

    常见的分组加密算法有DES、3DES、AES、SM4等,该类算法的一个特点就是对称加密,既解密过程所使用的密钥与加密过程所使用的密钥是同一个,或者对加密密钥做一些简单的数学换算得到。

    使用分组加密算法加密数据之后,信息数据的保护就变成了密钥的保护,谁得到了密钥谁就可以破解密文数据。

    SM4分组加密算法可以按照字面意思理解,如果有一批数据需要进行加密,首先需要对数据分成若干小组,每次加密其实处理(经过32轮的非线性迭代运算)的是单个小组中的数据,然后将所有分组的密文放一起就是整个密文了。

    SM4分组加密算法的每个分组大小是128bit(16字节),所用的密钥长度也是128bit(16字节),最后生成的密文长度也是128bit(16字节)。我们可以直接认为SM4就是对16字节的数据进行加密,加密之后生成16字节的密文数据。

    如果遇到某个分组数据不足16字节怎么办?

    那么我们可以填充特定字符串至满16字节为止,只要解密方知道你填充了多少个字节的无用数据,或者知道你填充的特定字符串是什么,解密之后直接去掉就可以了。具体填充的数据可以根据开发人员个人喜好去确定,无实际意义。

三、加解密流程

    SM4分组加密算法的详细流程可参照 GM/T0002-2012《SM4分组密码算法》中所述。

1、密钥扩展过程

    密钥扩展主要是为了得到轮密钥,而整个加密和解密过程使用的就是轮密钥,轮密钥是一个类似rk[32]数组的形式,每一个元素为32bit(4字节)。

    (1)SM4所用密钥ekey长度为16字节,既128bit,首先创建MK[4](单个元素长度为32bit,可当成int型数值),将16字节的ekey放入MK数组中,需要注意的是,要转化为大端格式。

    (2)然后可以创建一个K[36]数组(单个元素长度为32bit,可当成int型数值),K数组的0~3下标元素直接从对应下标的MK与对应下标的FK异或得到。FK为系统参数,是一个FK[4]数组类型的格式,每个元素32bit。

    而K数组对应的4~35下标的元素则通过K[i+4]  = k[i] ^ T' (K[i+1] ^ K[i+2] ^ k[i+3])获得,同样就可到了对应下标的rk值。

    (3)T'是置换函数,置换函数是非线性变换函数和一个线性变换函数合成的。其中非线性变换函数用到了Sbox,可以将Sbox理解为一个16乘16的二维数组,每个元素为8bit。既每个字节的数据(高4位得到行号,低4位可以得到列号)可以通过查看Sbox表变成新的字节。

2、加解密过程

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值