首页 > 其他分享 >使用OpenSSL进行RSA加密解密

使用OpenSSL进行RSA加密解密

时间:2022-11-02 17:07:10浏览次数:42  
标签:en rsa 解密 RSA char key OpenSSL NULL


生成一个密钥:


openssl genrsa -out test.key 1024



这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。

openssl可以将这个文件中的公钥提取出来:



openssl rsa -in test.key -pubout -out test_pub.key



-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。

我在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件



openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en



-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。

解密文件:



openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de


-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。

至此,一次加密解密的过程告终。在实际使用中还可能包括证书,这个以后有机会再说~

-------------------------------------------------------------------------------------------------------------------
下来介绍下在程序如何利用之前生成的test.key和test_pub.key来进行信息的加密与解密(当然也可以直接利用openssl的API来生成密钥文件)。

下面是一个例子,这个例子利用已有的密钥来对source字符串进行加密与解密:

//下面本来都是尖括号,但是新浪博客尖括号没法显示,又懒得写代码,就换成引号了
#include “stdio.h”
#include “stdlib.h”
#include “openssl/rsa.h”
#include “openssl/pem.h”
#include “openssl/err.h”
#include “string.h”
#define OPENSSLKEY "test.key"
#define PUBLICKEY "test_pub.key"
#define BUFFSIZE 1024
char* my_encrypt(char *str,char *path_key);//加密
char* my_decrypt(char *str,char *path_key);//解密
int main(void){
char *source="i like dancing !";
char *ptr_en,*ptr_de;
printf("source is :%s\n",source);
ptr_en=my_encrypt(source,PUBLICKEY);
printf("after encrypt:%s\n",ptr_en);
ptr_de=my_decrypt(ptr_en,OPENSSLKEY);
printf("after decrypt:%s\n",ptr_de);
if(ptr_en!=NULL){
free(ptr_en);
}
if(ptr_de!=NULL){
free(ptr_de);
}
return 0;
}
char *my_encrypt(char *str,char *path_key){
char *p_en;
RSA *p_rsa;
FILE *file;
int flen,rsa_len;
if((file=fopen(path_key,"r"))==NULL){
perror("open key file error");
return NULL;
}
if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
//if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){ 换成这句死活通不过,无论是否将公钥分离源文件
ERR_print_errors_fp(stdout);
return NULL;
}
flen=strlen(str);
rsa_len=RSA_size(p_rsa);
p_en=(unsigned char *)malloc(rsa_len+1);
memset(p_en,0,rsa_len+1);
if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){
return NULL;
}
RSA_free(p_rsa);
fclose(file);
return p_en;
}
char *my_decrypt(char *str,char *path_key){
char *p_de;
RSA *p_rsa;
FILE *file;
int rsa_len;
if((file=fopen(path_key,"r"))==NULL){
perror("open key file error");
return NULL;
}
if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
ERR_print_errors_fp(stdout);
return NULL;
}
rsa_len=RSA_size(p_rsa);
p_de=(unsigned char *)malloc(rsa_len+1);
memset(p_de,0,rsa_len+1);
if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){
return NULL;
}
RSA_free(p_rsa);
fclose(file);
return p_de;
}


在gcc时记得加选项,不然编译无法通过:

gcc test.c -o test -lcrypto -lssl

标签:en,rsa,解密,RSA,char,key,OpenSSL,NULL
From: https://blog.51cto.com/u_15858333/5817777

相关文章

  • Ansible - 加密解密
    ansible-vault用途encryption/decryptionutilityforAnsibledatafiles主要应用于包含敏感信息的场景,可以加密和解密敏感信息See'ansible-vault--help'formo......
  • 最新js解密思路
    直接上源代码,这次的js加密比较少见,解密过程比之前长一些,因为就遇到过两次,在研究解密思路var_cl_jUWGomd=function(a,b){a=a-0x1ec;varc=_cl_jUWGomc[a];if(_cl_jUWGomd['Q......
  • <4> os.popen()获取js解密结果
    #访问js文件,获取解密结果defdecrypto(self,data:str):#加密字符串importoswithos.popen("nodejs文件{}".format(data)asp:returnp.read.s......
  • (转)Android快捷方式解密
    Android快捷方式解密泡在网上的日子/文 发表于2015-11-1618:38 第次阅读 免费使用亚马逊云科技30余种核心云服务产品,包括云服务器,CDN等,长达12个月万维广告......
  • 【Python】AES.MODE_CBC和 AES.MODE_ECB 加解密
    AES加解密MODE_CBC和MODE_ECB两种模式的完整实现 importjsonfromCrypto.CipherimportAESimportbase64importbinascii#数据类classMData():def__i......
  • 【五期杨志】CCF-A(NeurIPS'20) Self-supervised multimodal versatile networks
    AlayracJB,RecasensA,SchneiderR,etal.Self-supervisedmultimodalversatilenetworks[J].AdvancesinNeuralInformationProcessingSystems,2020,33:2......
  • [单片机] rsa2048签名算法
    RSA-2048具有617个十进制数字,共2048bits。是目前最大的RSA数字,有20万美金的悬赏用于对RSA-2048的因式分解。RSA-2048:为非对称成加密算法,发送方和接收方均各有一组公钥和私......
  • [python] bin转dfu 脚本 RSA2048 签名 解密 公钥 私钥
    /lib/importhashlibimportosimportsysimporttimefromdatetimeimportdatetimeimportrsaclassmy_sign():pubkey=""privkey=""def__init__(self,pa......
  • RSA算法详解
    基础知识RSA设计\(m^{ed}\equiv1\:(mod\:n)\)RSA密钥生成第一步,随机选择两个不相等的质数p和q。如61和53。(质数越大越安全。)第二步,计算p和q的乘积n。把61和5......
  • 【XSY3528】解密(多项式)
    给出\(\{a\},\{c\}\),满足矩阵\(A_{i,j}=a_j^i\)且\(A\cdot\overrightarrow{b}=\overrightarrow{c}\),求\(\{b\}\)。移项变为\(\overrightarrow{b}=A^{-1}\cdot\ove......