0


sm4国密算法怎么玩?原理看不懂,但是急着用怎么办?

看到这篇文章的读者,估计都会急着想知道如何使用SM4国密算法的,
好吧,我们废话不多说,直接开门见山了。
关于加密算法的一些简单的理论知识,我直接附在下方了,可以自行查看。

具体代码详见我上传的资源:
https://download.csdn.net/download/skyksksksksks/87490417

接下来简要说明一下国密算法,SM4国密算法简单来讲,
就是在DES算法基础上改进实现的一种算法,增加了非线性变换。
其中的算法原理不用深究,可以直接跳过,只要会用就行了。

接下来说正题,SM4国密算法主要业务流程无非5个,1 ECB加密、2 ECB解密、3 CBC加密、4 CBC解密、4 MAC。
是不是觉得很熟悉,对的,DES也是这个玩法,其实SM4就是国产DES算法,所以业务流程相似。

1ECB加密
输入,密钥(16字节)、输入数据(任意字节,单个数据大小为16字节)、输入数据长度
输出,输出数据(任意字节,单个数据大小为16字节,加密结果)、输出数据长度
2ECB解密
输入,密钥(16字节)、输入数据(任意字节,单个数据大小为16字节)、输入数据长度
输出,输出数据(任意字节,单个数据大小为16字节,解密结果)、输出数据长度
3CBC加密
输入,密钥(16字节)、初始数据(16字节)、输入数据(任意字节,单个数据大小为16字节)、输入数据长度
输出,输出数据(任意字节,单个数据大小为16字节,加密结果)、输出数据长度
4CBC解密
输入,密钥(16字节)、初始数据(16字节)、输入数据(任意字节,单个数据大小为16字节)、输入数据长度
输出,输出数据(任意字节,单个数据大小为16字节,解密结果)、输出数据长度
5MAC
输入,密钥(16字节)、初始数据(16字节)、输入数据(任意字节,单个数据大小为16字节)、输入数据长度
输出,输出数据(16字节,MAC结果)、输出数据长度

通过以上说明,基本上就可以使用SM4国密算法了,
接下来再进一步聊聊这个SM4国密算法,当然仅供了解。
特别是生成ECB加密、ECB解密、CBC加密、CBC解密、MAC,这5个业务流程的细节,
如果觉得太难,也可以直接跳过,只要会用就行了。

1ECB加密、ECB解密时:
按照SM4加密、解密即可,
2CBC加密时:
第1块输入数据 异或 初始数据
->上1步骤异或结果 用指定密钥 进行SM4加密
->第2块输入数据 异或 上1步骤加密结果
->上1步骤异或结果 用指定密钥 进行SM4加密
......(重复上面2步骤直至结束)
->将所有步骤的加密结果拼接在一起,就是加密结果,即输出数据
3CBC解密时:
第1块输入数据 用指定密钥 进行SM4解密
->上1步骤解密结果 异或 初始数据
->第2块输入数据 用指定密钥 进行SM4解密
->上1步骤解密结果 异或 第1块输入数据
......(重复上面2步骤直至结束)
->将所有步骤的异或结果拼接在一起,就是解密结果,即输出数据
4MAC时:
第1块输入数据 异或 初始数据
->第2块输入数据 异或 上1步骤异或结果
......(重复上面1步骤直至结束)
->将所有步骤的异或结果(16字节,实际只有1个) 从16进制数据转可见字符串(32字节,即0x31(1)->0x33 0x31(31))
->上1步骤转换结果前16字节 用指定密钥 进行SM4加密
->上1步骤加密结果 异或 上上1步骤转换结果后16字节
->上1步骤异或结果 用指定密钥 进行SM4加密
->上1步骤加密结果 从16进制数据转可见字符串(32字节,即0x31(1)->0x33 0x31(31))
->上1步骤转换结果前16字节,就是MAC结果,即输出数据
友情提示,上面的MAC业务流程只是某些场景中约定俗成的业务流程,
具体的MAC业务流程,还是需要按照具体情况而定。

这里我自己写了一个类,核心部分只用了C、C++语言,实现了以上功能。

类中函数声明见下方:

    /*
    @param
    pstcdData 数据
    lOperatorType 操作类型,1 ECB加密、2 ECB解密、3 CBC加密、4 CBC解密、5 MAC
    (无此参数)lKeyDataBits 密钥数据位数
    pucKeyData 密钥数据(大小为16字节)
    (无此参数)lKeyDataSize 密钥数据大小
    pucInitValueData 初始值数据(操作类型为1 ECB加密、2 ECB解密时,无此参数;操作类型为3 CBC加密、4 CBC解密、5 MAC时,如果无此参数的数据,可以给全0的数据,大小为16字节)
    (无此参数)lInitValueDataSize 初始值数据大小
    (无此参数)pucUserIDData 用户ID数据
    (无此参数)lUserIDDataSize 用户ID数据大小
    pucInputData 输入数据(单个数据大小为16字节)
    lInputDataSize 输入数据大小
    (无此参数)pcucSignData 签名数据
    (无此参数)lSignDataSize 签名数据大小
    pucOutputData 输出数据(操作类型为1 ECB加密、2 ECB解密、3 CBC加密、4 CBC解密时,单个数据大小为16字节;操作类型为5 MAC时,大小为16字节)
    lOutputDataSize 输出数据大小
    @return
    0 成功、<0 失败
    @note
    操作类型为5 MAC时,和网上的测试结果匹配,和工具上的测试结果不匹配
    */
    long SM4(STCalculateData *pstcdData);

具体代码详见我上传的资源:
https://download.csdn.net/download/skyksksksksks/87490417

附:
算法分类:

1可逆算法
加密过程中需要使用密钥,输入明文后由系统经过密钥和加密算法处理成密文,
这种加密后的数据是可以被解密的,将密钥和密文,经过解密算法处理,
就能解密。
包含对称算法、非对称算法两类。

1.1对称算法(常用于加解密数据、信息摘要)
SM4、DES

1.2非对称算法(常用于加解密数据)
SM2、RSA

2不可逆算法
其特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,
这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,
得到相同的加密密文并被系统重新识别后,才能真正解密。
(常用于信息摘要、数据校验)
SM3、CRC、MD、SHA

详细列举:

我国公钥密码(椭圆曲线)算法(即SM2)
加密
公钥数据大小为64字节
输入数据大小为任意字节
输出数据大小为任意字节
解密
私钥数据大小为32字节
输入数据大小为任意字节
输出数据大小为任意字节
签名
私钥数据大小为32字节
用户ID数据大小为任意字节
输入数据大小为任意字节
输出数据大小为64字节
验证
公钥数据大小为64字节
用户ID数据大小为任意字节
输入数据大小为任意字节
签名数据大小为64字节

我国密码散列函数标准(即SM3)
密钥数据大小为任意字节
输入数据大小为任意字节
输出数据大小为32字节

我国分组密码算法(即SM4)
密钥数据大小为16字节
输入数据单个数据大小为16字节
输出数据单个数据大小为16字节

RSA加密算法(RSA algorithm,即RSA)
加密
公钥数据大小为任意字节
输入数据大小为任意字节
输出数据大小为任意字节
解密
私钥数据大小为任意字节
输入数据大小为任意字节
输出数据大小为任意字节
签名
私钥数据大小为任意字节
输入数据大小为任意字节
输出数据大小为任意字节
验证
公钥数据大小为任意字节
输入数据大小为任意字节
签名数据大小为任意字节

循环冗余校验(Cyclic Redundancy Check,即CRC)
输入数据大小为任意字节
输出数据大小为1、2、4字节

信息摘要算法(Message-Digest Algorithm,即MD)
输入数据大小为任意字节
输出数据大小为16字节

安全散列算法(Secure Hash Algorithm,即SHA)
输入数据大小为任意字节
输出数据大小为20、28、32、48、64字节

数据加密标准(Data Encryption Standard,即DES)
密钥数据大小为8、16、24字节
输入数据单个数据大小为8字节
输出数据单个数据大小为8字节

电码本(Electronic Codebook,即ECB):
是分组密码的一种最基本的工作模式;
在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。

密码分组链接模式(Cipher-block chaining,即CBC):
在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密;
在这种方法中,每个密文块都依赖于它前面的所有明文块;
同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

消息认证码(Message Authentication Code,即MAC):
带密钥的Hash函数;
通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。

标签: 安全 c++ windows

本文转载自: https://blog.csdn.net/skyksksksksks/article/details/129273477
版权归原作者 skyksksksksks 所有, 如有侵权,请联系我们删除。

“sm4国密算法怎么玩?原理看不懂,但是急着用怎么办?”的评论:

还没有评论