博客
关于我
SM9-加解密
阅读量:708 次
发布时间:2019-03-17

本文共 1652 字,大约阅读时间需要 5 分钟。

SM9加密算法实现

算法过程

SM9加密算法是一种基于BN曲线的椭圆曲线加密算法,主要包括以下几个步骤:

  • 128字节到ECN2的转换:将128字节的输入数据转换为ECN2格式,ECN2是椭圆曲线点的加密表示。

  • ECN2点的打印:将ECN2点的坐标信息转换为字节形式并输出。

  • 字符链接:将不同类型的字符(如字节和ECN2点)进行链接,生成最终的输出结果。

  • 点测试:验证给定的点是否在SM9曲线上。

  • SM4块加密:对消息进行块加密,使用SM4算法进行加密操作。

  • SM4块解密:对加密后的消息进行解密,恢复原始消息。

  • SM9 H1函数:实现SM9标准中的H1函数,用于生成加密密钥。

  • SM9 MAC计算:计算SM9的消息认证码(MAC),用于数据完整性验证。

  • SM9初始化:初始化SM9曲线的基本参数,包括曲线方程和基点。

  • SM9加密密钥生成:生成加密过程所需的公钥和私钥。

  • SM9加密过程:基于SM9标准对消息进行加密操作,包含密钥派生、非对称加密和认证码计算等步骤。

  • 程序实现

    下面是SM9加密算法的实现代码,主要包含以下功能:

    #include "SM9_enc_dec.h"#include "kdf.h"#include "SM4.h"#define BNLEN 16#define SM3_len 64typedef struct {    big a, b;} zzn12;typedef struct {    zzn12 x, y;    big z.a, z.b;    enum { MR_EPOINT_INFINITY, MR_EPOINT_NORMAL } marker;} ecn2;typedef struct {    unsigned char data[BNLEN];} big;typedef struct {    unsigned char char_data[BNLEN];} big_to_bytes_t;// ... 其他结构体和函数定义/** * @brief 将128字节的输入转换为ECN2点 * @param Ppubs 输入128字节的数据 * @param res 输出的ECN2点 * @return 是否成功 */BOOL bytes128_to_ecn2(unsigned char Ppubs[], ecn2 *res) {    zzn2 x, y;    big a, b;    ecn2 r;    // ... 初始化ECN2点    return ecn2_set(&x, &y, res);}/** * @brief 打印ECN2点的字节表示 * @param x ECN2点 * @return void */void ecn2_Bytes128_Print(ecn2 x) {    // ... 输出ECN2点的坐标}/** * @brief 链接字符 * @param message 输入的消息 * @param len 消息长度 * @param w zzn12元素 * @param Z 输出的字符数组 * @param Zlen 输出数组的长度 * @return void */void LinkCharZzn12(unsigned char *message, int len, zzn12 w, unsigned char *Z, int Zlen) {    // ... 将字符数组Z生成最终输出}// ... 其他函数定义/** * @brief 测试点是否在SM9曲线上 * @param point 要测试的点 * @return 0: 成功 1: 不在曲线上 */int Test_Point(epoint *point) {    // ... 实现SM9曲线的点测试}// ... 其他函数实现

    参考文献

  • 国标—SM9-加解密
  • 密码学-基础理论与应用(李子臣著)
  • 商用密码检测中心-源码下载
  • 转载地址:http://yovez.baihongyu.com/

    你可能感兴趣的文章
    Plotly:如何结合 make_subplots() 和 ff.create_distplot()?
    查看>>
    Plotly:如何绘制累积的“步骤“;直方图?
    查看>>
    PLSQL developer12安装图解
    查看>>
    PLSQL window操作
    查看>>
    plsql 存储过程 测试
    查看>>
    plsql 安装后database下拉没有东西
    查看>>
    PLSQL_Oracle PLSQL内置函数大全(概念)
    查看>>
    PLSQL_案例优化系列_体验逻辑结构如何影响SQL优化(案例3)
    查看>>
    PLSQL中INDEX BY TABLE的 DELETE操作
    查看>>
    plsql学习笔记---plsql相关概念,以及基础结构
    查看>>
    plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致
    查看>>
    plsql查询乱码问题解决
    查看>>
    PLSQL的DBMS_GETLINE
    查看>>
    quartz简单demo,教你最快使用quartz
    查看>>
    PlutoSDR学习笔记(一)—函数API手册
    查看>>
    Quartz安装包中的15个example
    查看>>
    Quartz学习总结(2)——定时任务框架Quartz详解
    查看>>
    pm2 start命令中的json格式详解
    查看>>
    pm2启动报错
    查看>>
    pm2通过配置文件部署nodejs代码到服务器
    查看>>