sm2签名与sm4加密(一)

这篇具有很好参考价值的文章主要介绍了sm2签名与sm4加密(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为某些不可抗原因,友商加密平台系统无法提供接口进行加密验签,以至于需要自己实现监管要求的加密验签。

接口要求,报文先经过sm2生成签名,之后进行sm4加密。收到报文后,先进行sm4解密,解密后将报文进行验签。验证成功之后既结束全部流程。

所以整体上分为两大部分,一为sm4加密,二为sm2签名。

首先先说简单的sm4加密,调用代码参考了开源项目openssl。

1.准备密钥和需要加密的报文

2.将报文进行分组,每16个字也就是128bit为一组,这里采用最简单的ECB分组方式,对不足16位的最后一组进行补位,采用pkcs7方式进行补位,就是差几位就补几位的几,比如8位差八位,就补八个八,对于16整数倍补16位的16(方便解码)

3.生成轮密钥,将32位的密钥分成八位一组的四组,编号为k0k1k2k3,通过互相运算及s盒,得到k4,再选取k1k2k3k4,运算得到k5,。循环32次,得到k0-k35,选取k4-k35为生成的轮密钥结果

4.进行加密,同样将一组16个字也是32位分成八位一组的四组,轮加密Bi⊕F(B(i-1)⊕B(i-2)⊕B(i-3)⊕k(i-4))得到下一组,最终得到B31-B35,拼成一个串返回这一组的加密结果,单组加密完毕。

最终把所有组拼在一起就是加密结果。

解密正好相反,因为必然是16的整数倍,所以直接分组。将生成的轮密钥与加密后的报文进行逆运算,最终得到补码后的原报文,取报文最后一位,截取最后一位对应的数字得到原始信息

参考代码:文章来源地址https://www.toymoban.com/news/detail-519148.html


#include "e_os2.h"
#include "sm4.h"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

void sm4_decrypt_ecb(unsigned char* key,
    int length,
    unsigned char* input,
    unsigned char* output)
{
    unsigned char* tmp=NULL ;
    unsigned char* tmp1 = NULL;
    int length1 = length;


    int bodylength;                /*解密后报文体长度 */
    int pkcs = 0;                      /*补位值 */
    SM4_KEY ks;                   /*轮密钥结构体 */

    tmp = (unsigned char*)malloc(sizeof(char) * length+1);
    memset(tmp, 0x00, length + 1);
    tmp1 = tmp;
    ossl_sm4_set_key(key, &ks);  /*通过密钥生成32轮密钥*/

    while (length1 > 0)
    {
        ossl_sm4_decrypt(input, tmp, &ks); /* 进行单组解密,暂存至tmp*/
        input += 16;
        tmp += 16;
        length1 -= 16;
    }

    bodylength = strlen(tmp1);
    pkcs = (int)tmp1[bodylength - 1];   /*取最后一位pkcs补位字符,转换成数字*/

    strncpy(output, tmp1, (bodylength - pkcs));  /*去除补位字符,拷贝至输出*/

    tmp = NULL;
    tmp1 = NULL;
}
void sm4_encrypt_ecb(unsigned char* key,
    int length,
    unsigned char* input,
    unsigned char* output) {
    int bodylength;                /*补位后报文体长度 */
    SM4_KEY ks;                   /*轮密钥结构体 */
    unsigned char pkcs;                      /*补位值 */
    unsigned char* tmp= output;

    pkcs = 16 - (length % 16);                /*获取补位值*/
    memset(input + strlen(input), pkcs, pkcs); /*报文补位*/

    ossl_sm4_set_key(key, &ks);  /*通过密钥生成32轮密钥*/
    bodylength = strlen(input);
    while (bodylength > 0)
    {
        ossl_sm4_encrypt(input, tmp, &ks); /* 进行单组加密*/
        input += 16;
        tmp += 16;
        bodylength -= 16;
    }
}
void main() {
    char key[16+1] ;
    char input[100];
    char input1[100];
    char output1[100];
    char output[100];

    memset(key,0x00, sizeof(key));
    memset(input, 0x00, sizeof(input));
    memset(input1, 0x00, sizeof(input1));
    memset(output1, 0x00, sizeof(output1));
    memset(output, 0x00, sizeof(output));
    
    strcpy(key, "1234567890abcdef");
    strcpy(input, "1234567890abcdeghhjuuu5555678900uuuuuuu");
    sm4_encrypt_ecb(key, strlen(input), input, output);
    strcpy(input1, output);
    sm4_decrypt_ecb(key, strlen(input1), input1, output1);
    printf("input=[%s],\noutput=[%s]", input, output1);
}

到了这里,关于sm2签名与sm4加密(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 商用密码应用与安全性评估要点笔记(SM2公钥加密算法)

    1、SM2算法简介         SM2密码算法是我国2010年发布的商用密码算法,属于公钥密码算法,也成为非对称密钥机制密码算法。SM2基于椭圆曲线离散对数问题,相对于RSA基于大整数因数分解更具优越性。         SM2算法于2012年成为我国密码行业标准,并于2017年被ISO采纳,成为

    2024年02月01日
    浏览(45)
  • Python实现国家商用密码算法sm2/sm3/sm4/sm9(国密)

    2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,这其中就包括 SM1、SM2、SM3 、SM4、SM7、SM9、ZUC(祖冲之加密算法)等,SM 代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。SM1 和 SM7 的算法不公开,其余算法都已成为 ISO/IEC

    2024年02月15日
    浏览(49)
  • 新手入门 | 掌握国密算法:新手指南: SM2 / SM3 / SM4密码算法详解

    在密码学领域,有多种加密与签名算法,它们在信息安全领域发挥着举足轻重的作用。如今,随着互联网的快速发展,网络安全已经成为各类信息系统完整性、可用性、保密性的重要保障,越来越多的国产密码算法得到了广泛的应用与关注。在本文中,我们将重点介绍三个经

    2024年02月12日
    浏览(157)
  • SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算的概念

    为了保障商用密码的安全性,国家密码局制定了一系列密码标准,包括:SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC) 等。 SM1、SM4、SM7、祖冲之密码(ZUC)是 对称算法 。 SM2、SM9是 非对称算法 。 SM3是 哈希算法 。 SM1、SM7算法不公开,调用该算法时,需要通过 加

    2024年02月03日
    浏览(39)
  • 使用 Java Bouncy Castle实现国密算法SM4、SM3以及SM2的加密

    国密算法的实现借助了Java库函数 Bouncy Castle,加密库安装使用教程请参考链接 SM4,又称为商密算法,是一种分组密码算法,于2012年由中国密码技术研究中心(中国密码学会成员)发布,目前已成为我国国家密码算法,并在多个领域得到了广泛的应用。SM4算法采用了32轮迭代结

    2024年02月16日
    浏览(68)
  • 国密SM2算法的加密签名消息语法封装解析p7格式signedData

    前文可参考:SM2算法的加密签名消息语法规范(三)如何构造signedData_天对地,雨对风的博客-CSDN博客系列。 这里直接讲openssl asn1解析和封装的部分代码。 国密 p7格式标准,参考:GMT0010-2012 1、p7 签名结构:  编写结构体GMTSignedData.h 注意:SM2_SignedData_st结构中的sign类型修改为

    2024年02月11日
    浏览(46)
  • SM2椭圆曲线公钥密码算法--密钥对与数字签名

    SM2算法全称是SM2椭圆曲线公钥密码算法(SM是商用密码的拼音缩写),是一种基于“椭圆曲线”的密码ECC(Elliptic Curve Cryptography)。2016年,SM2成为中国国家密码标准。 在商用密码体系中,SM2主要用于替换RSA加密算法。 SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于

    2024年02月11日
    浏览(47)
  • java实现国密SM4的加密和解密方式(即时通讯的消息对话加密采用SM2还是SM4)

    1.对于即时通讯的消息对话加密采用SM2还是SM4更合适? 对于即时通讯的消息对话加密,建议采用SM4对称加密算法,而不是SM2非对称加密算法。 SM2主要用于数字签名和密钥交换,其加密速度比SM4慢,而且SM2不太适合对长消息进行加密,因为它只能对比较短的数据块进行加密,这

    2024年02月07日
    浏览(82)
  • 国密算法 SM4 对称加密 分组密码 python实现完整代码

    目前,python实现的国密算法库主要是 python-gmssl 库和 snowland-smx ( pysmx )库,二者都对SM2(仅公钥加解密和数字签名)、SM3、SM4进行了细致而优雅的实现。 GMSSL. https://github.com/duanhongyi/gmssl snowland-smx. https://gitee.com/snowlandltd/ snowland-smx-python PyCryptodome. https://www.pycryptodome.org 最近用

    2024年02月06日
    浏览(54)
  • 国密算法 SM2 公钥加密 数字签名 密钥交换 全网最高效的开源python代码

    此前发布过SM2、SM3、SM4、ZUC等文章,以及开源的完整python代码。近些天看到一篇电子科大兰同学的硕士毕业论文(兰修文. ECC计算算法的优化及其在SM2实现中的运用[D]. 成都: 电子科技大学, 2019),文中采用预计算加速SM2椭圆曲线基点点乘,将这个思路用python代码实现后,实测

    2024年02月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包