调用OpenSSL实现RSA加解密和签名操作

RSA公钥可以从证书和公钥文件,RSA私钥可以从私钥文件中提取。OpenSSL使用了一种BIO抽象IO机制读写所用文件,可以打开文件相关联的BIO,通过BIO读写文件内容。

代码示例如下:

// 证书、私钥、公钥都是PEM格式文件

// 编译命令:gcc -o test test_pubkey_pem.c -lcrypto -std=c99

#include <openssl/x509.h>

#include <openssl/pem.h>

#include<stdio.h>

#include<string.h>

// 文件路径

char cert_filename[] = "/root/test.crt";

char pubkey_filename[] = "/root/testpub.pem";

char prikey_filename[] = "/root/testpri.pem";

int main()

{

EVP_PKEY *pkey;

BIO *pubkey_bio;

BIO *prikey_bio;

BIO *cert;

/************ 从证书中提取公钥 ****************/

// 打开证书文件

cert = BIO_new_file(cert_filename, "r");

// 读入X509证书

X509 * x_cert = PEM_read_bio_X509(cert, NULL, NULL, NULL);

BIO_free(cert);

// 提取出密钥EVP_PKEY结构

pkey = X509_get_pubkey(x_cert);

// 提取出RSA结构的公钥

RSA* rsa_from_cert = EVP_PKEY_get1_RSA(pkey);

X509_free(x_cert);

EVP_PKEY_free(pkey);

// 打印公钥的值

BIO * print_out=BIO_new(BIO_s_file());

BIO_set_fp(print_out,stdout,BIO_NOCLOSE);

RSA_print(print_out, rsa_from_cert, 0);

int ret;

/************ 从公钥文件中提取公钥 ****************/

//导入公钥文件

char rsa_in[] = "testing";

int rsa_inlen = strlen(rsa_in);

pubkey_bio=BIO_new_file(pubkey_filename,"r");

// 提取出密钥EVP_PKEY结构

pkey=PEM_read_bio_PUBKEY(pubkey_bio, NULL, NULL, NULL);

// 提取出公钥RSA结构

RSA* rsa = EVP_PKEY_get1_RSA(pkey);

RSA_print(print_out, rsa, 0);

/************ 从公钥文件中提取公钥 ****************/

prikey_bio=BIO_new_file(prikey_filename,"r");

pkey=PEM_read_bio_PrivateKey(prikey_bio, NULL, NULL, NULL);

RSA *pri_rsa = EVP_PKEY_get1_RSA(pkey);

/*********** 预分配控件 ******************/

// 根据RSA公钥长度分配RSA加密输出空间

int keysize = RSA_size(rsa);

printf("keysize:%d\n", keysize);

unsigned char *rsa_out = OPENSSL_malloc(keysize);

unsigned char *rsa_out_cert = OPENSSL_malloc(keysize);

unsigned char *dec_out = OPENSSL_malloc(keysize);

unsigned char *sign_out = OPENSSL_malloc(keysize);

unsigned char *verify_out = OPENSSL_malloc(keysize);

// 使用RKCS#1填充标准

int pad = RSA_PKCS1_PADDING;

/*********** RSA公钥加密 ******************/

int rsa_outlen_cert = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out_cert, rsa_from_cert, pad);

int rsa_outlen = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);

printf("rsa_outlen is: %d\n", rsa_outlen);

for(int i=0; i<rsa_outlen; i++){

printf("%02x", rsa_out[i]);

if((i+1)%16 == 0)

printf("\n");

}

printf("\n");

printf("rsa_outlen_cert is: %d\n", rsa_outlen_cert);

for(int i=0; i<rsa_outlen_cert; i++){

printf("%02x", rsa_out_cert[i]);

if((i+1)%16 == 0)

printf("\n");

}

printf("\n");

/*********** RSA私钥解密 ******************/

int dec_len = RSA_private_decrypt(rsa_outlen_cert, rsa_out_cert, dec_out, pri_rsa, pad);

if(!memcmp(rsa_in, dec_out, dec_len)){

printf("decrypt success!\n");

}else{

printf("decrypt fail!\n");

}

printf("dec_len is %d\n", dec_len);

/*********** RSA私钥签名 *******************/

int sign_len = RSA_private_encrypt(rsa_inlen, rsa_in, sign_out, pri_rsa, pad);

printf("sign_len is: %d\n", sign_len);

for(int i=0; i<sign_len; i++){

printf("%02x", sign_out[i]);

if((i+1)%16 == 0)

printf("\n");

}

printf("\n");

/********** RSA公钥验签 *******************/

int verify_len = RSA_public_decrypt(sign_len, sign_out, verify_out, rsa, pad);

printf("verify_len is %d\n", verify_len);

if(!memcmp(rsa_in, verify_out, verify_len)){

printf("verify success!\n");

}else{

printf("verify fail!\n");

}

/***********释放变量清理空间 ****************/

OPENSSL_free(rsa_out);

OPENSSL_free(dec_out);

OPENSSL_free(rsa_out_cert);

OPENSSL_free(sign_out);

OPENSSL_free(verify_out);

BIO_free(pubkey_bio);

BIO_free(prikey_bio);

EVP_PKEY_free(pkey);

RSA_free(rsa);

RSA_free(pri_rsa);

RSA_free(rsa_from_cert);

return 0;

}

调用OpenSSL实现RSA加解密和签名操作的更多相关文章

  1. RSA加密通信小结(四)--RSA加解密的实际操作与流程小结

    在上一篇文章中,我们已经将密钥的生成方法和流程,归纳总结.而本篇主要是讲如何利用密钥进行加解密. 首先,在上一篇文章中的我们生成了很多密钥,证书等等. 在上述生成的文件中,接收服务端加密报文:pkcs ...

  2. openssl进行RSA加解密(C++)

    密钥对根据RSA的加密机制(自行查找RSA工作原理),通常可以私钥加密-公钥解密(多用于签名),公钥加密-私钥解密(多用于数据传输加密),私钥可以生成公钥. 密钥对生成生成私钥,长度为2048,默认格 ...

  3. openssl在多平台和多语言之间进行RSA加解密注意事项

    首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...

  4. openssl - rsa加解密例程

    原文链接: http://www.cnblogs.com/cswuyg/p/3187462.html openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加 ...

  5. openssl rsa 加解密

    <h4>1.openssl进行rsa加密解密</h4>首先介绍下命令台下openssl工具的简单使用:生成一个密钥:<pre lang="c" esc ...

  6. 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence

    遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...

  7. 全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件

    作者: zyl910 一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时. 由于 .Net.J ...

  8. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  9. RSA 加解密 秘钥对说明

    rsa非对称加密, 加解密需要不同的秘钥,称作一对. rsa加解密分两种,第一:公钥加密私钥解密.第二:私钥加密公钥解密. 需要注意的是,公加私解得到的密文是变化的,而私加公解的得到的密文是固定的. ...

随机推荐

  1. js二维数组定义和初始化的三种方法总结

    js二维数组定义和初始化的三种方法总结 方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],[& ...

  2. 洛谷 P1236 算24点

    题目描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为"算24点".您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数 ...

  3. bzoj 2067 [ Poi 2004 ] SZN —— 二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2067 问题1:贪心考虑,应该是每个点的儿子尽量两两配对,如果剩一个就和自己合并向上,所以 a ...

  4. Spring Theme简单应用

    Spring MVC特性里由一个是关于Spring Theme主题的应用,所以写了个Demo 1.这里先看项目结构(Meven项目) 2.所需的POM依赖 <dependency> < ...

  5. HTML5移动Web开发

    1. 响应式web设计 说到这个,移动开发面对的屏幕尺寸那叫一个丰富,其中安卓阵营就够让人头痛的.我们在PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能正常显示的固定宽度居中 ...

  6. noip2016 小结(ac两题+学习总结)

    NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...

  7. vue.js学习文档

    1.实例化vue对象 new Vue(){ } 2.对象属性 el: 控制的属性 data: 数据存储位置 methods: 方法存储位置 template: 模板样式 computed: 计算属性 ...

  8. 60使用nanopim1plus查看HDMI显示分辨率的问题(分色排版)V1.0

    60使用nanopim1plus查看HDMI显示分辨率的问题(分色排版)V1.0 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17: ...

  9. python 关于一个懒惰和非懒惰的

    >>> pa = re.compile(r'<.*>') >>> result = pa.findall('<H1>title</H1 ...

  10. phpcms v9文章内容页调用上一篇下一篇的方法(转)

    phpcms v9文章内容页调用上一篇下一篇的方法如下,魔客吧(www.moke8.com)提示您直接摘取如下代码中的红色部分即可: 上一篇:{$previous_page[url]}" t ...