linux C语言 用openssl进行签名验签 --- 亲测2 sha256 sha512
时间:2020-03-21
本文章向大家介绍linux C语言 用openssl进行签名验签 --- 亲测2 sha256 sha512,主要包括linux C语言 用openssl进行签名验签 --- 亲测2 sha256 sha512使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#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.csdn.net/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; }
原文地址:https://www.cnblogs.com/LiuYanYGZ/p/12541170.html
- Silverlight:针式打印机文字模糊的改善办法
- 大数据和云计算技术周报:NoSQL特辑
- 常用业务接口界面化 in python flask
- 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
- 区块链推动支付革命
- MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
- nohup命令
- 跨浏览器的剪贴板访问解决方案
- 装逼必备:大型分布式网站术语分析
- 年前爆炸一波!小程序视频功能来了!
- ubuntu13.04环境hadoop1.2.1单机模式安装
- silverlight:telerik RadControls中RadGridView的一个Bug及解决办法
- scope引起的问题
- JS正则表达式常用函数汇总
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu 16.04无法切换root权限问题的解决
- leetcode栈之用队列实现栈
- 在Linux上识别同样内容的文件详解
- Ubuntu下pycharm无法导入类的解决方法
- leetcode栈之最小栈
- Linux基础学习之利用tcpdump抓包实例代码
- Linux/Unix关于时间和时间戳的命令行
- git文件管理心得分享
- Linux如何实现断点续传文件功能
- Xshell实现Windows上传文件到Linux主机的方法
- Linux中的EXT系列文件系统格式详解
- Linux中hexdump命令用法
- CentOS7挂载新数据盘的完整步骤
- Linux下安装Keepalived及原理分析
- centos6搭建gitlab的方法步骤