OpenSSL开源工程中,实现RSA签名方法有多种。该方法基于OpenSSL 3.0版本,调用OpenSSL EVP层的EVP_DigestSign*()与EVP_DigestVerify*()实现pss填充方式的RSA消息签名。消息摘要采用sha256计算,pss中的GMF1采用sha224计算。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include< openssl/rsa.h>
#include <openssl/evp.h>int rsa_sign_test()
{unsigned char plaintext[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";unsigned int p_text_len = sizeof(plaintext) - 1;unsigned char sig[256];unsigned int  signLen = 0;int rv = 0;BIGNUM *e = NULL;RSA *r = NULL;EVP_MD_CTX *mdctx = NULL;EVP_PKEY *evpkey;/** 生成RSA公私钥对 **/e = BN_new();BN_set_word(e, 65537);r = RSA_new();int bits = 1024;if (RSA_generate_key_ex(r, bits, e, NULL) != 1){printf("RSA_generate_key_ex is failed.\n");rv = -2;goto end;}evpkey = EVP_PKEY_new();if(evpkey == NULL){printf("EVP_PKEY_new is failed.\n");rv = -2;goto end;}if (EVP_PKEY_set1_RSA(evpkey, r) != 1)  //保存RSA结构体到EVP_PKEY结构体{printf("EVP_PKEY_set1_RSA is failed.\n");rv = -3;goto end;}/**  消息完整签名计算 **/mdctx = EVP_MD_CTX_create();if (mdctx == NULL){printf("EVP_MD_CTX_create is failed.\n");rv = -4;goto end;}EVP_PKEY_CTX *ectx;if (!EVP_DigestSignInit(mdctx, &ectx, EVP_sha256(), NULL, evpkey)){printf("EVP_DigestSignInit is failed.\n");rv = -4;goto end;}/**  设置签名填充方式为pss填充 **/if (!EVP_PKEY_CTX_set_rsa_padding(ectx, RSA_PKCS1_PSS_PADDING)){printf("EVP_PKEY_CTX_set_rsa_padding is failed.\n");rv = -4;goto end;}if (!EVP_PKEY_CTX_set_rsa_mgf1_md(ectx, EVP_sha224())){printf("EVP_PKEY_CTX_set_rsa_padding is failed.\n");rv = -4;goto end;}if (!EVP_DigestSignUpdate(mdctx, plaintext, p_text_len)){printf("EVP_DigestSignUpdate is failed.\n");rv = -4;goto end;}if (!EVP_DigestSignFinal(mdctx, NULL, &signLen)){printf("EVP_DigestSignFinal is failed.\n");rv = -4;goto end;}if (!EVP_DigestSignFinal(mdctx, sig, &signLen)){printf("EVP_DigestSignFinal is failed.\n");rv = -4;goto end;}EVP_MD_CTX_destroy(mdctx);/**  消息完整验签计算 **/mdctx = EVP_MD_CTX_create();if (mdctx == NULL){printf("EVP_MD_CTX_create is failed.\n");rv = -4;goto end;}if (!EVP_DigestVerifyInit(mdctx, &ectx, EVP_sha256(), NULL, evpkey)){printf("EVP_DigestVerifyInit is failed.\n");rv = -4;goto end;}/**  设置签名填充方式为pss填充 **/if (!EVP_PKEY_CTX_set_rsa_padding(ectx, RSA_PKCS1_PSS_PADDING)){printf("EVP_PKEY_CTX_set_rsa_padding is failed.\n");rv = -4;goto end;}if (!EVP_PKEY_CTX_set_rsa_mgf1_md(ectx, EVP_sha224())){printf("EVP_PKEY_CTX_set_rsa_padding is failed.\n");rv = -4;goto end;}if (!EVP_DigestVerifyUpdate(mdctx, plaintext, p_text_len)){printf("EVP_DigestVerifyUpdate is failed.\n");rv = -4;goto end;}if (!EVP_DigestVerifyFinal(mdctx, sig, signLen)){printf("EVP_DigestVerifyFinal is failed.\n");rv = -4;goto end;}end:if(e != NULL)BN_free(e);if (r != NULL)RSA_free(r);if (evpkey != NULL)EVP_PKEY_free(evpkey);EVP_MD_CTX_destroy(mdctx);return rv;
}int main(int argc, const char * argv[])
{int ret = 0;ret = rsa_sign_test();if (ret < 0){printf("rsa_sign_test is failed.\n");}else{printf("rsa_sign_test successed.\n");}return 0;
}

相关资源:

1.openssl 介绍(五) openssl rsa签名验签

2.Difference between EVP_PKEY_sign and EVP_DigestSignInit

3.rsa - 带有 PKCS1-PSS 填充的 RSA 签名的 maskGenAlgorithm

C语言——基于OpenSSL 的RSA 签名验签算法相关推荐

  1. [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用

    环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...

  2. 国密SM9算法C++实现之五:签名验签算法

    SM9算法C++实现系列目录: 基于JPBC的SM9算法的java实现与测试 国密SM9算法C++实现之0:源码下载地址 国密SM9算法C++实现之一:算法简介 国密SM9算法C++实现之二:测试工具 ...

  3. php pkcs7签名验签算法,OpenSSL 签名验签接口调用及测试

    OpenSSL 签名验签接口调用及测试 概述 项目中我们经常会遇到开发签名.验签功能.签名.验签是可信赖网络的一个重要功能.因此,我记录了OpenSSL 签名验签接口调用及测试. 相关测试代码 bas ...

  4. Java 实现RSA 签名/验签与加密解密

    文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...

  5. RSA签名验签学习笔记

    RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行 ...

  6. java基础-RSA签名验签

    一.介绍 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私钥.两者之 ...

  7. 支付宝php rsa签名验签工具,alipay rsa2 签名验证

    一.验签准备 1.原始报文: [gmt_create=2020-03-25 10:59:32&charset=utf-8&gmt_payment=2020-03-25 10:59:38 ...

  8. 支付宝开放平台RSA签名验签工具----生成密钥报错

    标题 原因:是在安装的时候路径上有一个空格导致的:

  9. Java基于OpenSSL生成 RSA 公私钥对数据进行加解密

    使用OpenSSL来生成私钥和公钥 验证机器上是否安装openssl 命令:openssl version -a [root@node00 test]# openssl version -a Open ...

最新文章

  1. sharepoint2013保存当前输入的列表
  2. VMware打开虚拟机黑屏
  3. Linux命令 - watch
  4. 计算机怎么远程桌面,电脑远程桌面如何连接 电脑远程桌面连接方法【详解】...
  5. C++:构造函数重载类内定义函数(内联函数)
  6. python的json.dump参数使用
  7. html5中加入音频,在H5场景中插入自定义音频和视频(任意画面)
  8. 模块化配电系统在高密度数据中心的应用
  9. Android 两种方式实现类似水波扩散效果
  10. DSP 基于 TMS320F2803x 的 I2C 上的 PMBus 的软件应用
  11. 超详细的QSS样式表入门Demo
  12. Android Studio 下载安装教程
  13. 全国行政边界矢量数据下载
  14. 双路服务器装mac系统,华硕Z10 C612,双路E5继续折腾调试改机型Macpro终于成功。...
  15. opencv python 的基本操作案例(一) 记录,可查看
  16. AIMD response function的一般推导
  17. eSpeak: Linux文本转语音工具
  18. 关于Word插入图片闪退
  19. 奥城大学计算机专业,我大四了,托福84,gre1571612.02..._GRE考试_帮考网
  20. aligned_alloc

热门文章

  1. debian9 xfce关闭桌面锁定(Automatically lock)
  2. Python---PDF、WORD和Base64互转
  3. python输出文本格式的内容最常使用的引号是什么_python的print函数_无引号、单引号、双引号、三引号用法...
  4. Vivado公开课-01基础篇:Vivado一切超乎想象 笔记
  5. SpringBoot中运行测试:java.lang.NullPointerException
  6. 兰州公交车更换IC卡机实现“手机公交卡”
  7. 带你了解STM32中的I2C
  8. 相片打印机原理_极印手机照片打印机体验:让照片「活起来」的随身玩物
  9. zookeeper从入门到入土
  10. css 固定宽度,文字均匀分布