linux C语言 用openssl进行签名验签

C语言——基于OpenSSL 的RSA 签名验签算法 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< open... 阅读详情
#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;
}

http://www.manongjc.com/detail/15-alqnotqnekvsocu.html

https://www.cnblogs.com/LiuYanYGZ/p/12540577.html

Linux C语言调用OpenSSL: RSA签名验签算法(填充模式PSS) 本文主要介绍在Linux环境下,使用c语言调用openssl库函数,实现RSA签名验签算法(PSS填充模式)。 阅读详情

相关推荐

手把手教你用C语言实现SM2签名验签:基于OpenSSL/GMSSL EVP接口的完整实战

本文详细介绍了如何使用C语言基于OpenSSL/GMSSL EVP接口实现SM2签名验签功能。从环境搭建、密钥生成到签名验签的完整流程,提供了实战代码示例和性能优化建议,帮助开发者快速掌握国密算法SM2的核心技术。

weixin_32428571的博客 275

基于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...

henter的专栏 1万+

Java实现国密SM2签名验签:从ECC原理到Bouncy Castle实战

椭圆曲线密码学(ECC)是一种基于椭圆曲线离散对数问题的非对称加密技术,相比RSA,ECC在相同安全强度下密钥更短、计算效率更高。其核心价值在于为数字身份认证和数据完整性保护提供了高效的数学基础,广泛应用于金融支付、物联网设备认证等高安全场景。国密SM2算法正是ECC在中国商用密码体系中的具体实现,通过定义标准曲线参数和配套SM3哈希算法,成为金融、政务等领域合规改造的关键技术。本文聚焦SM2签名与验签的工程实践,深入解析其与ECC的关联,并基于Bouncy Castle库提供完整的Java代码示例,涵盖密

weixin_33946020的博客 362

在Linux中运行调用gmp/openssl库函数的C

在Linux中运行调用gmp/openssl库函数的C

m0_51429482的博客 719

ESP32-S3 RSA加密与签名验签实战:基于mbedTLS与硬件加速

非对称加密是现代信息安全的核心技术之一,它通过公钥和私钥的配对,解决了通信双方在不安全信道中安全交换信息或验证身份的根本问题。其原理基于数学难题(如大数分解),公钥可公开分发用于加密或验签,私钥则严格保密用于解密或签名,从而实现了无需预先共享密钥的安全通信。这一技术对于构建可信的物联网系统至关重要,尤其在设备身份认证、指令防篡改等场景中具有不可替代的价值。本文以ESP32-S3芯片为例,深入探讨如何利用其内置的硬件加密加速器,通过mbedTLS库高效实现RSA非对称加密与签名验签的全流程,涵盖密钥管理、代码

weixin_34110749的博客 397

ECC签名验签工具源码解析:从原理到实战的轻量级实现

数字签名是现代信息安全的核心技术之一,它基于非对称密码学原理,通过私钥生成、公钥验证的方式,确保数据的完整性、真实性和不可否认性。其技术价值在于为数字世界中的身份认证、数据防篡改和交易授权提供了基础安全保证,广泛应用于软件分发、API安全、物联网设备认证和区块链交易等场景。椭圆曲线密码学(ECC)作为一种更高效的算法,能以更短的密钥长度提供与传统RSA相当甚至更高的安全强度,特别适合资源受限的移动和嵌入式环境。本文聚焦于一个轻量级的ECC签名验签工具源码,深入剖析其核心模块,包括椭圆曲线基础运算、ECDSA

weixin_30595035的博客 305

openssl linux c语言,Linux下C语言使用openssl库加密算法RSA

首先介绍下命令台下openssl工具的简单使用:1)生成一个密钥:opensslgenrsa-outtest.key1024这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。2)openssl可以将这个文件中的公钥提取出来:opensslrsa-intest.key-pubout-o...

weixin_34401008的博客 889

深入解析RSA加密与签名:OpenSSL实战指南与安全应用

非对称加密是现代信息安全体系的基石,其核心原理在于使用一对数学上关联的密钥(公钥与私钥)解决密钥分发与身份认证难题。RSA算法基于大数分解的数学难题,通过公钥加密、私钥解密实现数据保密,通过私钥签名、公钥验签确保数据完整性与身份真实性。这项技术在构建可信数字环境中具有不可替代的价值,广泛应用于HTTPS安全连接、API接口签名验签、软件分发验证及数字证书等场景。OpenSSL作为功能强大的开源密码学工具库,提供了从密钥生成、加密解密到签名验签的全套命令行工具与编程接口,是实践RSA算法的标准选择。掌握其使用

weixin_33798152的博客 367

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。

Sunny Boy001的博客 1608

Python国密算法SM2/SM3签名验签不一致问题排查与修复指南

国密算法(SM2、SM3、SM4)作为我国自主研发的商用密码标准,在金融、政务等关键领域的数据安全传输与身份认证中扮演着核心角色。其技术原理基于椭圆曲线密码学(SM2)和密码杂凑算法(SM3),通过非对称加密和哈希校验保障数据的机密性、完整性与不可否认性。在工程实践中,Python开发者常因标准理解偏差、库实现差异和环境编码陷阱,遭遇SM2签名验签不一致、SM3哈希值对不上等典型问题。这些问题的根源往往在于密钥格式、签名输出格式、用户ID处理及数据编码等环节缺乏统一规范。本文聚焦SM2签名验签与SM3哈希校

weixin_34050005的博客 383

linux系统openssl的C++开发环境搭建

在Linux上进行OpenSSL的C++开发,你需要安装OpenSSL库并且在编译时链接该库。

N阶二进制的博客 2916

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...

weixin_39966765的博客 357

基于OpenSSL,实现C语言RSA的PKCS10的证书请求

在自己的学习过程中,可以参考网络中,自己创建一个CA中心,自己产生一个证书请求,自己用CA中心颁发一个自签名的证书,这样在验证过程中,就可以验证此证书了。这里的证书请求就是PKCS10,简称为P10。在接触密码学中,就会涉及到证书,我们在虚拟网络中产生信任,就要有一个信任源,而在密码层面,信任源就是颁布证书的认证中心,从而,证书就是我们可以相信的虚拟对象。具体调用方式如下,我添加了一些注释,便于理解,这里在使用RSA做签名和验签时不同于SM2,RSA在签名验签入参时,需要先对源数据进行hash计算。

weixin_49984575的博客 1248

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...

weixin_39543652的博客 436

openssl+ SM2 + linux 签名校验开发实例(C++)

SM2签名使用消息摘要算法对原始消息进行哈希,通常采用SM3算法。在校验过程中,验证者也需要使用相同的哈希算法对接收到的消息进行哈希。

N阶二进制的博客 2597

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 无法查看到该曲线,查阅资...

u012849539的博客 3202

MuJoCo 动捕接口 Mocap 直接操控机械臂(附代码)

动作捕捉(Motion Capture,简称 Mocap)是一种记录并处理人或物体动作的技术,在影视、游戏、机器人等领域应用广泛。通过上下左右以及alt_l,alt_r可以控制hand这个hody跟着mocap进行同步,这里将quat固定为Z朝下。首先在 scene.xml 中修改添加 mocap 和 equality。下面介绍如何配置 Mocap 以及使用按键进行末端控制。控制核心代码,通过按键控制mocap的pos和quat。

darcsdn 879

openssl编译,签名 ,验签踩坑

1.下载源码之后经典三部曲 ./config make make intsall ./config 时候配置自己所需要安装的路径 setarch i386 ./config no-asm shared --prefix=$(pwd)/__install /* 这句号确定配置的板子为32位* 64位不需要更改/ /************************************************ 踩坑原因: makefile编译选项去掉-m64 以为编译的就是32位库 实际依旧默认为64

qq_34763705的博客 714

基于Simulink的魔术公式轮胎动力学仿真

本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。

shy_201992的博客 6940

Halcon 3D点云处理实战:从PLY文件读取到曲面匹配的完整流程(附避坑指南)

本文详细介绍了Halcon在3D点云处理中的完整流程,从PLY文件读取到曲面匹配,特别强调了3D算子的应用技巧和避坑指南。通过实战案例和参数优化建议,帮助开发者高效处理工业视觉检测中的复杂点云数据,提升匹配精度和性能。

weixin_42535720的博客 277
上一篇: Photoshop倾斜图片矫正
下一篇: ubuntu 支持中文输入法
我是谁??
博客等级 码龄11年 242粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值