#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/sha.h>
#include <openssl/crypto.h>
/*
* 参考https://blog.youkuaiyun.com/zjf535214685/article/details/82182241
*/
#define PUBLIC_KEY_PATH ("./rsapubkey.pem")
#define PRIVATE_KEY_PATH ("./rsaprivatekey.pem")
#define isUseSha256 (1)
#if isUseSha256
#define SHA_WHICH NID_sha256
#define WHICH_DIGEST_LENGTH SHA256_DIGEST_LENGTH
#else
#define SHA_WHICH NID_sha512
#define WHICH_DIGEST_LENGTH SHA512_DIGEST_LENGTH
#endif
void printHex(unsigned char *md, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
printf("%02x", md[i]);
}
printf("\n");
}
/*读取私钥*/
RSA* ReadPrivateKey(char* p_KeyPath)
{
FILE *fp = NULL;
RSA *priRsa = NULL;
printf("PrivateKeyPath[%s] \n", p_KeyPath);
/* 打开密钥文件 */
if(NULL == (fp = fopen(p_KeyPath, "r")))
{
printf( "fopen[%s] failed \n", p_KeyPath);
return NULL;
}
/* 获取私钥 */
priRsa = PEM_read_RSAPrivateKey(fp, NULL, NULL,NULL);
if(NULL == priRsa)
{
ERR_print_errors_fp(stdout);
printf( "PEM_read_RSAPrivateKey\n");
fclose(fp);
return NULL;
}
fclose(fp);
return priRsa;
}
/*读取公匙*/
RSA* ReadPublicKey(char* p_KeyPath)
{
FILE *fp = NULL;
RSA *pubRsa = NULL;
printf("PublicKeyPath[%s]\n", p_KeyPath);
/* 打开密钥文件 */
if(NULL == (fp = fopen(p_KeyPath, "r")))
{
printf( "fopen[%s] \n", p_KeyPath);
return NULL;
}
/* 获取公钥 */
if(NULL == (pubRsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL,NULL)))
{
printf( "PEM_read_RSAPrivateKey error\n");
fclose(fp);
return NULL;
}
fclose(fp);
return pubRsa;
}
int test_RSA_sign_verify(void)
{
char *data = "china";
char buf[128] = {0};
RSA *pubKey = NULL;
RSA *privKey = NULL;
int nOutLen = sizeof(buf);
int nRet = 0;
//1. 对数据进行sha256算法摘要
unsigned char md[WHICH_DIGEST_LENGTH];
#if isUseSha256
SHA256((unsigned char *)data, strlen(data), md);
#else
SHA512((unsigned char *)data, strlen(data), md);
#endif
printHex(md, WHICH_DIGEST_LENGTH);
// 2. 读取私钥
privKey = ReadPrivateKey(PRIVATE_KEY_PATH);
if (!privKey)
{
ERR_print_errors_fp (stderr);
return -1;
}
// 3. 读取公匙
pubKey = ReadPublicKey(PUBLIC_KEY_PATH);
if(!pubKey)
{
RSA_free(privKey);
printf("Error: can't load public key");
return -1;
}
// 4. 签名
nRet = RSA_sign(SHA_WHICH, md, WHICH_DIGEST_LENGTH, buf, &nOutLen, privKey);
if(nRet != 1)
{
printf("RSA_sign err !!! \n");
goto quit;
}
printf("RSA_sign len = %d:", nOutLen);
printHex(buf, nOutLen);
// 5. 验签
nRet = RSA_verify(SHA_WHICH, md, WHICH_DIGEST_LENGTH, buf, nOutLen, pubKey);
if(nRet != 1)
{
printf("RSA_verify err !!! \n");
goto quit;
}
printf("RSA_verify Success !!! \n");
quit:
RSA_free(privKey);
RSA_free(pubKey);
return 0;
}
int main(int argc, char *argv[])
{
test_RSA_sign_verify();
return 0;
}
相关推荐
手把手教你用C语言实现SM2签名验签:基于OpenSSL/GMSSL EVP接口的完整实战
本文详细介绍了如何使用C语言基于OpenSSL/GMSSL EVP接口实现SM2签名验签功能。从环境搭建、密钥生成到签名验签的完整流程,提供了实战代码示例和性能优化建议,帮助开发者快速掌握国密算法SM2的核心技术。
基于OpenSSL 1.1.1版实现的SM2签名与验签C程序
OpenSSL 1.1.1 版提供了对国密 SM4、SM3、SM2 算法的支持。对于 SM2 算法,在源码的 crypto/sm2 目录下,sm2_sign.c 文件中实现了 SM2 签名与验签,sm2_crypt.c 文件中实现了 SM2 加密与解密,这些源码是很好的学习范例。但是sm2.h, sm3.h, sm4.h 这些头文件是放在源码的 crypto/include/inter...
Java实现国密SM2签名验签:从ECC原理到Bouncy Castle实战
椭圆曲线密码学(ECC)是一种基于椭圆曲线离散对数问题的非对称加密技术,相比RSA,ECC在相同安全强度下密钥更短、计算效率更高。其核心价值在于为数字身份认证和数据完整性保护提供了高效的数学基础,广泛应用于金融支付、物联网设备认证等高安全场景。国密SM2算法正是ECC在中国商用密码体系中的具体实现,通过定义标准曲线参数和配套SM3哈希算法,成为金融、政务等领域合规改造的关键技术。本文聚焦SM2签名与验签的工程实践,深入解析其与ECC的关联,并基于Bouncy Castle库提供完整的Java代码示例,涵盖密
在Linux中运行调用gmp/openssl库函数的C
在Linux中运行调用gmp/openssl库函数的C
ESP32-S3 RSA加密与签名验签实战:基于mbedTLS与硬件加速
非对称加密是现代信息安全的核心技术之一,它通过公钥和私钥的配对,解决了通信双方在不安全信道中安全交换信息或验证身份的根本问题。其原理基于数学难题(如大数分解),公钥可公开分发用于加密或验签,私钥则严格保密用于解密或签名,从而实现了无需预先共享密钥的安全通信。这一技术对于构建可信的物联网系统至关重要,尤其在设备身份认证、指令防篡改等场景中具有不可替代的价值。本文以ESP32-S3芯片为例,深入探讨如何利用其内置的硬件加密加速器,通过mbedTLS库高效实现RSA非对称加密与签名验签的全流程,涵盖密钥管理、代码
ECC签名验签工具源码解析:从原理到实战的轻量级实现
数字签名是现代信息安全的核心技术之一,它基于非对称密码学原理,通过私钥生成、公钥验证的方式,确保数据的完整性、真实性和不可否认性。其技术价值在于为数字世界中的身份认证、数据防篡改和交易授权提供了基础安全保证,广泛应用于软件分发、API安全、物联网设备认证和区块链交易等场景。椭圆曲线密码学(ECC)作为一种更高效的算法,能以更短的密钥长度提供与传统RSA相当甚至更高的安全强度,特别适合资源受限的移动和嵌入式环境。本文聚焦于一个轻量级的ECC签名验签工具源码,深入剖析其核心模块,包括椭圆曲线基础运算、ECDSA
openssl linux c语言,Linux下C语言使用openssl库加密算法RSA
首先介绍下命令台下openssl工具的简单使用:1)生成一个密钥:opensslgenrsa-outtest.key1024这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。2)openssl可以将这个文件中的公钥提取出来:opensslrsa-intest.key-pubout-o...
深入解析RSA加密与签名:OpenSSL实战指南与安全应用
非对称加密是现代信息安全体系的基石,其核心原理在于使用一对数学上关联的密钥(公钥与私钥)解决密钥分发与身份认证难题。RSA算法基于大数分解的数学难题,通过公钥加密、私钥解密实现数据保密,通过私钥签名、公钥验签确保数据完整性与身份真实性。这项技术在构建可信数字环境中具有不可替代的价值,广泛应用于HTTPS安全连接、API接口签名验签、软件分发验证及数字证书等场景。OpenSSL作为功能强大的开源密码学工具库,提供了从密钥生成、加密解密到签名验签的全套命令行工具与编程接口,是实践RSA算法的标准选择。掌握其使用
linux C语言用openssl进行签名验签
生成公钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem。生成加密的私钥:openssl genrsa -out rsa_private_key.pem -des3 2048。生成私钥:openssl genrsa -out rsa_private_key.pem 2048。运行:gcc rsa_verify.c -lcrypto;运行:gcc rsa_sign.c -lcrypto;1.安装openssl。
Python国密算法SM2/SM3签名验签不一致问题排查与修复指南
国密算法(SM2、SM3、SM4)作为我国自主研发的商用密码标准,在金融、政务等关键领域的数据安全传输与身份认证中扮演着核心角色。其技术原理基于椭圆曲线密码学(SM2)和密码杂凑算法(SM3),通过非对称加密和哈希校验保障数据的机密性、完整性与不可否认性。在工程实践中,Python开发者常因标准理解偏差、库实现差异和环境编码陷阱,遭遇SM2签名验签不一致、SM3哈希值对不上等典型问题。这些问题的根源往往在于密钥格式、签名输出格式、用户ID处理及数据编码等环节缺乏统一规范。本文聚焦SM2签名验签与SM3哈希校
linux系统openssl的C++开发环境搭建
在Linux上进行OpenSSL的C++开发,你需要安装OpenSSL库并且在编译时链接该库。
linux c 程序签名,linux C语言 用openssl进行签名验签 --- 亲测2 sha256 sha512
#include #include#include#include#include#include/** 参考https://blog.csdn.net/zjf535214685/article/details/82182241*/#define PUBLIC_KEY_PATH ("./rsapubkey.pem")#define PRIVATE_KEY_PATH ("./rsaprivatek...
基于OpenSSL,实现C语言RSA的PKCS10的证书请求
在自己的学习过程中,可以参考网络中,自己创建一个CA中心,自己产生一个证书请求,自己用CA中心颁发一个自签名的证书,这样在验证过程中,就可以验证此证书了。这里的证书请求就是PKCS10,简称为P10。在接触密码学中,就会涉及到证书,我们在虚拟网络中产生信任,就要有一个信任源,而在密码层面,信任源就是颁布证书的认证中心,从而,证书就是我们可以相信的虚拟对象。具体调用方式如下,我添加了一些注释,便于理解,这里在使用RSA做签名和验签时不同于SM2,RSA在签名验签入参时,需要先对源数据进行hash计算。
linux c 程序签名,linux C语言 签名验签 --- 亲测 sha256 sha512
签名:#include #include #include #include #include #include /** 参考https://blog.csdn.net/zjf535214685/article/details/82182241*/#define PRIVATE_KEY_PATH ("./rsaprivatekey.pem")#define SHA_WHICH NID...
openssl+ SM2 + linux 签名校验开发实例(C++)
SM2签名使用消息摘要算法对原始消息进行哈希,通常采用SM3算法。在校验过程中,验证者也需要使用相同的哈希算法对接收到的消息进行哈希。
linux c 使用openssl实现SHA1WithRSA实现,签名,验签
linux c 使用openssl实现SHA1WithRSA实现,签名,验签
openssl-1.1.1e 在 linux 和 windows 的使用,并使用 c++ 和 c# 开发 dll 进行文件的签名于验证
文章目录参考链接前言一、在 linux 使用 参考链接 Command Line Elliptic Curve Operations 前言 因工作需要,正在研究 openssl 的使用,需要进行产品加解密,需要用到 openssl 进行 ecc 算法的加解密,使用的曲线是 secp256r1 ,在 openssl 中使用命令 ecparam -list_curves 无法查看到该曲线,查阅资...
MuJoCo 动捕接口 Mocap 直接操控机械臂(附代码)
动作捕捉(Motion Capture,简称 Mocap)是一种记录并处理人或物体动作的技术,在影视、游戏、机器人等领域应用广泛。通过上下左右以及alt_l,alt_r可以控制hand这个hody跟着mocap进行同步,这里将quat固定为Z朝下。首先在 scene.xml 中修改添加 mocap 和 equality。下面介绍如何配置 Mocap 以及使用按键进行末端控制。控制核心代码,通过按键控制mocap的pos和quat。
openssl编译,签名 ,验签踩坑
1.下载源码之后经典三部曲 ./config make make intsall ./config 时候配置自己所需要安装的路径 setarch i386 ./config no-asm shared --prefix=$(pwd)/__install /* 这句号确定配置的板子为32位* 64位不需要更改/ /************************************************ 踩坑原因: makefile编译选项去掉-m64 以为编译的就是32位库 实际依旧默认为64
基于Simulink的魔术公式轮胎动力学仿真
本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。
Halcon 3D点云处理实战:从PLY文件读取到曲面匹配的完整流程(附避坑指南)
本文详细介绍了Halcon在3D点云处理中的完整流程,从PLY文件读取到曲面匹配,特别强调了3D算子的应用技巧和避坑指南。通过实战案例和参数优化建议,帮助开发者高效处理工业视觉检测中的复杂点云数据,提升匹配精度和性能。
275



被折叠的 条评论
为什么被折叠?



