SM2国密算法封装 C++

2020-03-07  本文已影响0人  布灵不灵的丙丙

背景介绍:

项目应某客户要求,需要对密码等安全属性要求高的字段进行加密保护与传输,并且必须使用国密(SM2, SM3, SM4)加密算法,项目是C++语言开发,需要与java前端进行调试,本人以前也没有接触过加密算法,因此查询了很多资料,走了很多弯路,现在将自己整理的关于SM2算法一些东西发出来,希望可以对有需要的小伙伴有所帮助。

场景介绍:

假设,给了你一个hex编码的公钥,然后给了一个待加密字段,如何加密,或者说给了一个hex编码的私钥,给了一个hex编码的待解密字段,如何解密?我的文章就围绕这个给您解答。

特别感谢

感谢两位博主的文章及其开源项目,通过他们的源码学到了很多东西,以下为链接:

https://github.com/greendow/SM2-encrypt-and-decrypt
https://github.com/NEWPLAN/SMx

前置介绍

文档

公钥及私钥介绍:

加密模式

#define BUFFER_APPEND_STRING(buffer1, pos1, length1, x) \
    memcpy(&buffer1[pos1], x, length1); \
    pos1 = pos1 + length1

流程讲解

加密流程

void setMessage(const unsigned char* c1,
    const unsigned char* c2,
    const unsigned char* c3,
    const unsigned char* messagg,
    const unsigned int msgByteLen)
{
    int pos1 = 0;
    BUFFER_APPEND_STRING(messagg, pos1, 1 + 64
        , c1);
    BUFFER_APPEND_STRING(messagg, pos1, 32
        , c3);
    BUFFER_APPEND_STRING(messagg, pos1, msgByteLen
        , c2);

    DEFINE_SHOW_STRING(messagg, pos1);
}

解密过程:

void getMessage(unsigned char* c1,
    unsigned char* c2,
    unsigned char* c3,
    const unsigned char* messagg,
    const unsigned int msgByteLen)
{
    int pos1 = 0;
    int pos2 = 0;
    BUFFER_APPEND_STRING(c1, pos1, 1 + 64
        , &messagg[pos2]);
    DEFINE_SHOW_STRING(c1, pos1);
    pos2 = pos2 + pos1;
    pos1 = 0;
    BUFFER_APPEND_STRING(c3, pos1, 32
        , &messagg[pos2]);
    DEFINE_SHOW_STRING(c3, 32);
    pos2 = pos2 + pos1;
    pos1 = 0;
    BUFFER_APPEND_STRING(c2, pos1, (msgByteLen - pos2)
        , &messagg[pos2]);
    DEFINE_SHOW_STRING(c2, msgByteLen - pos2);

}

未完待续,稍后整理将代码开源

上一篇下一篇

猜你喜欢

热点阅读