0


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

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

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

接下来简要说明一下国密算法,SM3国密算法简单来讲,
就是SHA-256算法基础上改进实现的一种算法,采用Merkle-Damgard结构。
其中的算法原理不用深究,可以直接跳过,只要会用就行了。

接下来说正题,SM3国密算法主要业务流程无非2个,1 加密、2 MAC。
1加密
输入,输入数据(任意字节)、输入数据长度
输出,输出数据(32字节,加密结果)、输出数据长度
2MAC
输入,密钥(任意字节)、密钥长度、输入数据(任意字节)、输入数据长度
输出,输出数据(32字节,MAC结果)、输出数据长度

通过以上说明,基本上就可以使用SM3国密算法了,
接下来再进一步聊聊这个SM3国密算法,当然仅供了解。
SM3其实就是国产哈希算法,是不可逆算法,主要是用来校验传输数据是否准确的,
所以只要知道己方需要将一个很长的数据加密得到一个值,然后再将这个值给到另一方,
在然后另一方也进行同样的加密,然后比对即可。

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

类中函数声明见下方:

    /*
    @param
    pstcdData 数据
    lOperatorType 操作类型,1 加密、2 MAC
    (无此参数)lKeyDataBits 密钥数据位数
    pucKeyData 密钥数据(操作类型为1 加密时,无此参数;操作类型为2 MAC时,大小为任意字节)
    lKeyDataSize 密钥数据大小(操作类型为1 加密时,无此参数)
    (无此参数)pucInitValueData 初始值数据
    (无此参数)lInitValueDataSize 初始值数据大小
    (无此参数)pucUserIDData 用户ID数据
    (无此参数)lUserIDDataSize 用户ID数据大小
    pucInputData 输入数据(大小为任意字节)
    lInputDataSize 输入数据大小
    (无此参数)pcucSignData 签名数据
    (无此参数)lSignDataSize 签名数据大小
    pucOutputData 输出数据(大小为32字节)
    lOutputDataSize 输出数据大小
    @return
    0 成功、<0 失败
    */
    long SM3(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函数;
通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。


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

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

还没有评论