文档章节

国密算法SM2/3/4实现

realm520
 realm520
发布于 2016/11/24 10:22
字数 545
阅读 5.3K
收藏 5
ECC

相关信息

国家密码管理局发布的标准

开源实现

简单介绍

SM2

这个就是椭圆加密算法,只是选择了不同的参数。因此用其他一直椭圆曲线的算法实现,通过修改相关方程的参数,也可以实现SM2。关于椭圆曲线的具体算法,可以参考zmworm大神的文章,不过我还是没看懂。

http://www.pediy.com/kssd/pediy06/pediy6014.htm

SM3

这个是类似MD5,SHA256的摘要算法。通过一系列的位运算来获得一个256bit的大数。

SM4

对称加密算法,没仔细看,直接拿源码来用了。跟一般的加密算法用起来没啥区别,一个key既可以加密,也可以解密。

测试

直接上结果吧,最后的测试通过的情况是这样:

  • SM2: 参考GmSSL的实现,直接利用OpenSSL里面的函数设定曲线的参数实现
  • SM3: 直接使用pygmcrypto源码
  • SM4: 直接使用pygmcrypto源码

测试代码: SM4

#include <string.h>
#include <stdio.h>
#include "sm4.h"

int main()
{
    unsigned char key[16] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
    unsigned char input[16] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
    unsigned char output[16];
    sm4_context ctx;
    unsigned long i;

    printf("Key: ");
    for(i=0;i<16;i++)
        printf("%02x ", key[i]);
    printf("\n");
    //encrypt standard testing vector
    sm4_setkey_enc(&ctx,key);
    sm4_crypt_ecb(&ctx,1,16,input,output);
    printf("Encrypted: ");
    for(i=0;i<16;i++)
        printf("%02x ", output[i]);
    printf("\n");

    //decrypt testing
    sm4_setkey_dec(&ctx,key);
    sm4_crypt_ecb(&ctx,0,16,output,output);
    printf("Decrypted: ");
    for(i=0;i<16;i++)
        printf("%02x ", output[i]);
    printf("\n");


    return 0;
}

SM3

#include <string.h>
#include <stdio.h>
#include "sm3.h"

int main( int argc, char *argv[] )
{
        unsigned char *input = "ab";
        int ilen = 2;
        unsigned char output[32];
        int i;
        sm3_context ctx;

        printf("Message:\n");
        printf("%s\n",input);

        sm3(input, ilen, output);
        printf("Hash:\n   ");
        for(i=0; i<32; i++)
        {
                printf("%02x",output[i]);
                if (((i+1) % 4 ) == 0) printf(" ");
        }
        printf("\n");

        printf("Message:\n");
        for(i=0; i < 16; i++)
                printf("abcd");
        printf("\n");

        sm3_starts( &ctx );
        for(i=0; i < 16; i++)
                sm3_update( &ctx, "abcd", 4 );
        sm3_finish( &ctx, output );
        memset( &ctx, 0, sizeof( sm3_context ) );

        printf("Hash:\n   ");
        for(i=0; i<32; i++)
        {
                printf("%02x",output[i]);
                if (((i+1) % 4 ) == 0) printf(" ");
        }
        printf("\n");
    //getch();  //VS2008
}

© 著作权归作者所有

realm520
粉丝 9
博文 13
码字总数 25892
作品 0
南京
架构师
私信 提问
加载中

评论(0)

沃通CA协办“2019密码应用高峰论坛”,探讨国密证书全生态应用

2019年9月7日至8日,“2019中国密码学会密码应用高峰论坛”在贵州省贵阳市顺利召开,沃通CA作为协办单位出席本次会议并发表《国密证书全生态应用研究与实践》主题报告,与现场专家学者共同探...

wossl
2019/09/11
48
0
国密SM2素域椭圆曲线快速约减算法x64编程研究(上)

这是NIST公开资料公布的256位素域椭圆曲线快速约减算法描述: p256 = (2 ^ 256) − (2 ^ 224) + (2 ^ 192) + (2 ^ 96) − 1p256 = ffffffff 00000001 00000000 00000000 00000000 ffffffff ......

safedead
2015/02/10
534
0
支持国密算法的 Python 加密包 - gmssl-python

GMSSL GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。 安装 pip install gmss...

段洪义
2018/07/30
3.9K
0
基于python的国密算法gmssl-python版本发布[3.2.1]

关于 项目起源于一个银行合作项目,银行接口中涉及了大量的国密算法,但是目前大多数类库都是java或者c/c++,于是本人东拼西凑了一个类库,希望能给大家带来方便。 GMSSL GmSSL是一个开源的加...

段洪义
2018/07/30
6
0
部署国密SSL证书,如何兼容国际主流浏览器?

国密算法在主流操作系统、浏览器等客户端中,还没有实现广泛兼容。因此,在面向开放互联网的产品应用中,国密算法无法得到广泛应用。比如,在SSL证书应用领域,由于国际主流浏览器不信任国密...

wossl
2019/06/18
166
0

没有更多内容

加载失败,请刷新页面

加载更多

java 获取json某个值

String jsonStr = "{\"name\":\"小可爱\",\"course\":\"191010入门课程4年级3讲\",\"teacherPhone\":\"11111111111\"}";JSONObject jsonObject = JSONObject.parseObject(jsonStr); ......

varju
9分钟前
27
0
如何使用printf系列便携地打印size_t变量?

我有一个size_t类型的变量,我想用printf()打印它。 我使用什么格式说明符来便携地打印它? 在32位机器中, %u似乎是正确的。 我用g++ -g -W -Wall -Werror -ansi -pedantic ,没有任何警告。...

javail
15分钟前
35
0
Hostbuddy for Mac(host文件编修改管理工具) v2.2.4永久激活版

想要快速更换你Mac电脑中的host文件么?host文件编修改管理工具哪款好用? Hostbuddy Mac版好用吗?在这款host文件管理软件Hostbuddy for Mac中,有着简单轻松使用方法,可以通过软件快速更新...

mac小叮当
24分钟前
39
0
正则表达式匹配DNS主机名或IP地址?

是否有人方便使用与任何合法DNS主机名或IP地址匹配的正则表达式? 编写一个可以在95%的时间内正常工作的代码很容易,但是我希望得到经过充分测试的东西,以完全匹配最新的DNS主机名RFC规范。...

技术盛宴
30分钟前
37
0
Vue中你可能认为是bug的情况原来是这样的

前言 我们知道Vue框架剧本双向数据绑定功能,在我们使用方便的同时,还有一些细节问题我们并不知道,接下来一起探讨一些吧 双向数据绑定 js变量改变影响页面 页面改变影响js变量 Vue2是如何做...

涂老师
31分钟前
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部