glodrar 2023-03-20 10:14 采纳率: 100%
浏览 14
已结题

基于gmssl的sm2加密算法函数使用

使用官方给的demo验证成功了,demo:

int main(void)
{
    SM2_KEY sm2_key;
    SM2_KEY pub_key;
    unsigned char dgst[32];
    unsigned char sig[SM2_MAX_SIGNATURE_SIZE];
    size_t siglen;
    int ret;

    sm3_digest((unsigned char*)"hello world", strlen("hello world"), dgst);
    format_bytes(stdout, 0, 0, "to be signed digest", dgst, sizeof(dgst));

    sm2_key_generate(&sm2_key);

    sm2_sign(&sm2_key, dgst, sig, &siglen);
    format_bytes(stdout, 0, 0, "signature", sig, siglen);

    memcpy(&pub_key, &sm2_key, sizeof(SM2_POINT));

    if ((ret = sm2_verify(&pub_key, dgst, sig, siglen)) != 1) {
        fprintf(stderr, "verify failed\n");
    }
    else {
        printf("verify success\n");
    }

    return 0;

自己改造的函数验签失败,是传参的问题吗?


int sm2_sign_pre(SM2_KEY sm2_key,
    unsigned char *msg,
    unsigned char *dgst,
    unsigned char *sig,
    size_t siglen ) {
    int ret = 0;
    sm3_digest(msg, strlen(msg), dgst);
          /* sm2_key_generate(&sm2_key);      生成私钥key和公钥*/

    
    if ((ret = sm2_sign(&sm2_key, dgst, sig, &siglen)) != 1) {
        fprintf(stderr, "signature failed\n");
    }
    else {
        printf("signature success\n");
    }
    return ret;
}
int sm2_verify_pre( SM2_KEY pub_key,
                     unsigned char* msg,
                     unsigned char *dgst,
                     unsigned char *sig, 
    size_t siglen
                    ) {
    int ret;

    sm3_digest(msg, strlen(msg), dgst);

    if ((ret = sm2_verify(&pub_key, dgst, sig, siglen)) != 1) {
        return ret;
    }
    else {
        return 0;
    }
}


void main() {

    SM2_KEY sm2_key;
    memset(&sm2_key, 0x00, sizeof(sm2_key));

    sm2_key_generate(&sm2_key);
    //printf("私钥=[%x],公钥x=[%x],y=[%x]\n", sm2_key.private_key,sm2_key.public_key.x,sm2_key.public_key.y);

    unsigned char oridata[1024];
    unsigned char dgst[32];
    unsigned char sign[72];
    int sign_len=0;
    int ret = 0;

    memset(oridata,0x00,sizeof(oridata));
    memset(dgst, 0x00, sizeof(dgst));
    memset(sign, 0x00, sizeof(sign));

    strcpy(oridata, "qwertyuiopasdgfhjkl");

    sm2_sign_pre(sm2_key, &oridata, &dgst, &sign, sign_len);


    ret = sm2_verify_pre(sm2_key, &oridata, &dgst, &sign, sign_len);
    printf("ret = [%d]\n", ret);
}

  • 写回答

2条回答 默认 最新

  • lshen01 2023-03-20 10:40
    关注

    参考GPT和自己的思路:

    从您提供的代码中,无法准确判断您的问题所在。但是可以看出您进行了一些修改但验证不成功,这可能是参数传递的问题。建议您仔细比对官方demo中每一个参数的传递方式和您的修改代码中的参数传递方式,并检查传递的数据是否正确和数据类型是否匹配。同时,也可以尝试使用调试工具逐步验证您的代码,找出问题所在。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持