今天用 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); }
1 jukka 2015-12-12 21:35:51 +08:00 google: c openssl rsa example |
![]() | 2 Xbluer 2015-12-12 22:33:31 +08:00 不用 google , man RSA_public_encrypt 即可。 RSA_PKCS1_PADDING 模式下,明文长度 < rsa_len - 11 |
3 semicircle21 2015-12-13 18:23:57 +08:00 我并不是安全工程师, 只是普通程序员, 所以, 不那么靠谱的安利一下: cryptopp 比 openssl 好用多了 ... |
![]() | 5 larkifly OP @semicircle21 性能怎么样? |
6 kimmykuang 2015-12-14 12:45:14 +08:00 via Android @Xbluer 超过了会直接报错而不是截断吗 |
![]() | 7 Xbluer 2015-12-14 18:42:19 +08:00 @kimmykuang 不会直接截断。直接截断产生的结果(即密文)是错误的,不符合函数定义的功能。如果需要加密的明文长度较长,则需要分组加密。 |
![]() | 8 taozhijiangscu 2015-12-15 15:22:03 +08:00 openssl 自带很多例子, grep 一下游没有相似的呢 |
![]() | 9 taozhijiangscu 2015-12-15 15:24:57 +08:00 @taozhijiangscu https://github.com/taozhijiang/st_utils/blob/master/source/st_openssl.c 一般是 AES 块加密,速度性能比较好, RSA 用来加密加密串就好了 |