C 语言如何利用 openssl 进行 rsa pkcs1 加密

2015-12-12 19:31:13 +08:00
 larkifly
今天用 no_padding 没问题,用 pkcs1 就报错。报错如下:
140310769923944:error:0406D06E:lib(4):func(109):reason(110):rsa_pk1.c:151

代码如下:

char *rsa_encrypt(char *plain, char *to, char *key_path) {
char *p_en;
RSA *p_rsa;
FILE *file;
int f_len, rsa_len;
if((file = fopen(key_path, "r")) == NULL){
perror("open file error");
return NULL;
}

if((p_rsa = PEM_read_RSAPublicKey(file, NULL, NULL, NULL)) == NULL){
ERR_print_errors_fp(stdout);
return NULL;
}

f_len = strlen(plain);
rsa_len = RSA_size(p_rsa);
p_en = (char *)malloc(rsa_len+1);
memset(to, 0, rsa_len+1);
if(RSA_public_encrypt(rsa_len, (unsigned char*)plain, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING) < 0){
ERR_print_errors_fp(stdout);
return NULL;
}
strcpy(to, (char *)p_en);
RSA_free(p_rsa);
fclose(file);
}
4601 次点击
所在节点    程序员
9 条回复
jukka
2015-12-12 21:35:51 +08:00
google: c openssl rsa example
Xbluer
2015-12-12 22:33:31 +08:00
不用 google , man RSA_public_encrypt 即可。
RSA_PKCS1_PADDING 模式下,明文长度 < rsa_len - 11
semicircle21
2015-12-13 18:23:57 +08:00
我并不是安全工程师, 只是普通程序员, 所以, 不那么靠谱的安利一下:
cryptopp 比 openssl 好用多了 ...
larkifly
2015-12-14 09:52:26 +08:00
@jukka
@Xbluer

google 了,并没有 google 到
larkifly
2015-12-14 09:52:50 +08:00
@semicircle21 性能怎么样?
kimmykuang
2015-12-14 12:45:14 +08:00
@Xbluer 超过了会直接报错而不是截断吗
Xbluer
2015-12-14 18:42:19 +08:00
@kimmykuang 不会直接截断。直接截断产生的结果(即密文)是错误的,不符合函数定义的功能。如果需要加密的明文长度较长,则需要分组加密。
taozhijiangscu
2015-12-15 15:22:03 +08:00
openssl 自带很多例子, grep 一下游没有相似的呢
taozhijiangscu
2015-12-15 15:24:57 +08:00
@taozhijiangscu
https://github.com/taozhijiang/st_utils/blob/master/source/st_openssl.c

一般是 AES 块加密,速度性能比较好, RSA 用来加密加密串就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX