Linux下C语言使用openssl库加密算法RSA
程序员文章站
2022-07-12 23:00:01
...
首先介绍下命令台下openssl工具的简单使用:
1)生成一个**:
openssl genrsa -out test.key 1024
这里-out指定生成文件的。需要注意的是这个文件包含了公钥和**两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成**的长度。
2)openssl可以将这个文件中的公钥提取出来:
openssl rsa -in test.key -pubout -out test_pub.key
-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。
3)在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件:
openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
-in指定要加密的文件,-inkey指定**,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
4)解密文件:
openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。
至此,一次加密解密的过程告终。
使用openssl库的C的API实现加密解密:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#define OPENSSLKEY "test.key"
#define PUBLICKEY "test_pub.key"
char *encrypt(char *str,char *path_key)
{
char *p_en=NULL;
RSA *p_rsa=NULL;
FILE *fp=NULL;
int rsa_len=0;
if((fp=fopen(path_key,"rb"))==NULL)
{
printf("open %s failure\n",path_key);
goto clean;
}
if((p_rsa=PEM_read_RSA_PUBKEY(fp,NULL,NULL,NULL))==NULL)
{
ERR_print_errors_fp(stdout);
goto clean;
}
rsa_len=RSA_size(p_rsa);
p_en=(char *)malloc(rsa_len+1);
if(!p_en)
{
printf("malloc failure\n");
goto clean;
}
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)
{
printf("RSA_public_encrypt error\n");
goto clean;
}
clean:
if(p_rsa) RSA_free(p_rsa);
if(fp) fclose(fp);
return p_en;
}
char *decrypt(char *str,char *path_key)
{
char *p_de=NULL;
RSA *p_rsa=NULL;
FILE *fp=NULL;
int rsa_len=0;//initialize to zero
if((fp=fopen(path_key,"rb"))==NULL)
{
printf("open %s error\n",path_key);
goto clean;
}
if((p_rsa=PEM_read_RSAPrivateKey(fp,NULL,NULL,NULL))==NULL)
{
ERR_print_errors_fp(stdout);
goto clean;
}
rsa_len=RSA_size(p_rsa);
p_de=(char *)malloc(rsa_len+1);
if(!p_de)
{
printf("malloc error\n");
goto clean;
}
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)
{
printf("RSA_private_decrypt error\n");
goto clean;
}
clean:
if(p_rsa) RSA_free(p_rsa);
if(fp) fclose(fp);
return p_de;
}
int main(int argc,char **argv)
{
char *source="i like dancing !!!";
char *ptf_en;
char *ptf_de;
printf("source is : %s\n",source);
ptf_en=encrypt(source,PUBLICKEY);
printf("pth_ed is : %s\n",ptf_en);
ptf_de=decrypt(ptf_en,OPENSSLKEY);
printf("ptf_de is : %s\n",ptf_de);
free(ptf_en);
free(ptf_de);
return 0;
}
在上面的openssl命令行工具使用中已经创建了两把钥匙:公钥和**
test.key test_pub.key
接下来编译,运行程序
[email protected]:~/ssl_examples/rsa$ gcc rsa_examples.c -o rsa_examples -lcrypto
[email protected]:~/ssl_examples/rsa$ ./rsa_examples
source is : i like dancing !!!
pth_ed is : VxtKˏLϹxTwj^
ptf_de is : i like dancing !!!
修改程序的main函数中的最后三个打印语句的空格数,运行结果的第二部分可能不同,这个地方我也有疑问,还得研究研究
推荐阅读
-
Windows10下使用C语言通过ODBC链接MySQL数据库的方法教程
-
C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解
-
在linux下使用c语言实现MQTT(二.编程实现)
-
Linux下C语言使用openssl库进行加密
-
Linux下C语言使用openssl库加密算法RSA
-
Linux下C语言使用openssl库加密算法DES
-
Linux下C语言使用openssl库加密算法SHA1
-
Linux下C语言使用openssl库加密算法AES
-
Linux下C语言使用openssl库加密算法MD5
-
在Linux下如何使用openssl生成RSA公钥和私钥对