博客
关于我
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/

    你可能感兴趣的文章
    PANDA VALUE_COUNTS包含GROUP BY之前的所有值
    查看>>
    Pandas - 有条件的删除重复项
    查看>>
    pandas -按连续日期时间段分组
    查看>>
    pandas -更改重新采样的时间序列的开始和结束日期
    查看>>
    pandas :to_excel() float_format
    查看>>
    pandas :加入有条件的数据框
    查看>>
    pandas :将多列汇总为一列,没有最后一列
    查看>>
    pandas :将时间戳转换为 datetime.date
    查看>>
    pandas :将行取消堆叠到新列中
    查看>>
    pandas DataFrame 中的自定义浮点格式
    查看>>
    Pandas DataFrame 的 describe()方法详解-ChatGPT4o作答
    查看>>
    Pandas DataFrame中删除列级的方法链接解决方案
    查看>>
    Pandas DataFrame中的列从浮点数输出到货币(负值)
    查看>>
    Pandas DataFrame中的列从浮点数输出到货币(负值)
    查看>>
    pandas DataFrame的一些操作
    查看>>
    Pandas Dataframe的日志文件
    查看>>
    pandas GROUPBY+变换和多列
    查看>>
    pandas Groupby:创建两列的Groupby时,如何按正确的顺序对工作日进行排序?
    查看>>
    Pandas matplotlib 无法显示中文
    查看>>
    pandas PIVOT_TABLE保持索引
    查看>>