为什么openssl 进行RSA加密后,打印出来的是乱码?

时间:2023-01-15 13:10:38
本人初使用openssl,用下面的代码(网上找的)进行RSA加密后,打印出来的是乱码.

是否是用RSA_NO_PADDING有什么关系?

还是加密后的得到的ptr_en(  printf("after encrypt:%s\n",ptr_en);  )要是另外的格式输出?

如果我将char *ptr_en 赋给一个数组,用%d或%X都是可以打印出来的, 但是我用打印出来的字符串去进行解密是解密不出来的,请问高手


#include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<openssl/rsa.h>
 #include<openssl/pem.h>
 #include<openssl/err.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;
 }

18 个解决方案

#1


......加密之后出来的不是乱码还能是什么?难道那个毫无艺术细胞的CPU还能把它给写成诗歌不成?

#2


你密钥长度是 1024位,可是你的密文才 char *source="i like dancing !";
改为
char source[1024]="i like dancing !";
其他的长度也做类似的修改试试?

#3


错了.应该是 1024/8 = 128.
改成
char source[128]="i like dancing !";

rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.

#4


引用 1 楼  的回复:
......加密之后出来的不是乱码还能是什么?难道那个毫无艺术细胞的CPU还能把它给写成诗歌不成?


因为我加密后要以http报文形式传过去给别人,我想要的是像MD5加密后的字符串,如:1KKKEEJ877HIUFSE
不相想得到这种东西:Œ<>„ü³—¢ëër‡0E¶ÿHý©>-èÈŸS6˜ý§(5»8°úp…Ïi‹Ö!ôÑuhöú0        Á…~ü“4kY&ìäDÔ¡;Uö*íK¨©%Êw'MȲcѼ0ب

#5


引用 3 楼  的回复:
错了.应该是 1024/8 = 128.
改成
char source[128]="i like dancing !";

rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.

char source[128]="i like dancing !";改了输出还是一串乱码。
请问有别的解决方法吗?

#6


那你再加一个报文转换在中间好了,指望它出来就是这样是不可能的。

#7


你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.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);//解密
RSA *g_rsa;
int main(void){
char source[BUFFSIZE]="i like dancing !";
char *ptr_en,*ptr_de;

BIGNUM* m_BigNumber = BN_new();
BN_set_word(m_BigNumber, RSA_F4);//默认值 e=0x10001L
g_rsa = RSA_new();
int ret=RSA_generate_key_ex(g_rsa, BUFFSIZE, m_BigNumber, 0);
printf("source is    :%s\n",source);
ptr_en=my_encrypt(source,OPENSSLKEY);
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;
}
//RSA *g_rsa;
//RSA_generate_key_ex(m_rsa, m_Bits, m_BigNumber, 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(g_rsa);
p_en=(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,g_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(g_rsa);
p_de=(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,g_rsa,RSA_NO_PADDING)<0){
return NULL;
}
// RSA_free(p_rsa);
// fclose(file);
return p_de;
}


#8


引用 7 楼  的回复:
你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/……


PEM_read_RSAPrivateKey 这个确认是对的,公钥和私钥都是用openssl生成的。

加密后是可以进行解密的,解密出来的是对的。只是加密后以%s输出是乱码而已。

#9


你要用ASCII码传送的话,在加密之后增加一个报文转换的过程,在接收端解密前再放一个报文恢复过程。

作用就是在8位纯二进制码和7位可传送代码形式之间转换。

#10


引用 9 楼  的回复:
你要用ASCII码传送的话,在加密之后增加一个报文转换的过程,在接收端解密前再放一个报文恢复过程。

作用就是在8位纯二进制码和7位可传送代码形式之间转换。


这也是一种方法,不过对我现在开发的东西不太适用。现在是对别的公司定的接口来开发的,我这边发送报文过去,他们应答。程序只能改我这边的,接口那边的公司没法改的。呵呵 。

#11


那就是说他们那边能接受那些东西了,你就直接发给他们好了。RSA加密出来的肯定就是这个样子的。

#12


引用 11 楼  的回复:
那就是说他们那边能接受那些东西了,你就直接发给他们好了。RSA加密出来的肯定就是这个样子的。

也是,反正先试试,到联调时再看对不对,不对再另外一说……

#13


hex to string.
string to hex.

0xfec8977319778abc   ------    hex

"fec8977319778abc"   ------    string

互转就行了

#14


引用 8 楼  的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>……

加密后必然是乱码啊...
如果加密后不是乱码,那才有问题

#15


引用 14 楼  的回复:
引用 8 楼  的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include……


今天已经解决了,用以下的函数进行转换,最后以16进制的字符串放在报文中传过去。



#define TOLOWER(x) ((x) | 0x20) 
#define isxdigit(c) (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F'))
#define isdigit(c) ('0' <= (c) && (c) <= '9') 

//bin2str(signret,out,strlen(signret),16); 转换为16进制
//last char of in must be 0x00
void bin2str(unsigned char* in,char* out,int size,int base)
{
unsigned char* pt1 = in;
char* pt2 = out;
do
{
pt2 += sprintf(pt2,"%02X",*pt1++);
size--;
}while(*pt1 && size);
}

void str2bin(char* in,unsigned char* out,int size,int base)
{
unsigned char* pt1 = (unsigned char*)in;
unsigned char* pt2 = out; 
while (isxdigit(*pt1) && size--)

*pt2++ = base * ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10) + ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10);


}

#16


已经解决,最后以16进制的字符串传过去。
以下的函数可以进行ASCII转以某进制的字符串,也可以以某进制的字符串转换为ASCII。

#define TOLOWER(x) ((x) | 0x20) 
#define isxdigit(c) (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F'))
#define isdigit(c) ('0' <= (c) && (c) <= '9') 

//bin2str(signret,out,strlen(signret),16); 转换为16进制
//last char of in must be 0x00
void bin2str(unsigned char* in,char* out,int size,int base)
{
unsigned char* pt1 = in;
char* pt2 = out;
do
{
pt2 += sprintf(pt2,"%02X",*pt1++);
size--;
}while(*pt1 && size);
}

void str2bin(char* in,unsigned char* out,int size,int base)
{
unsigned char* pt1 = (unsigned char*)in;
unsigned char* pt2 = out; 
while (isxdigit(*pt1) && size--)

*pt2++ = base * ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10) + ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10);


}

#17


引用 15 楼  的回复:
引用 14 楼 的回复:

引用 8 楼 的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<strin……

其实base64编码用的很普遍

#18


引用 17 楼  的回复:
引用 15 楼  的回复:
引用 14 楼 的回复:

引用 8 楼 的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>……


恩,只要是二进制传输,base64之后可以随意的使用XML,JSON等等格式传输无障碍。

#1


......加密之后出来的不是乱码还能是什么?难道那个毫无艺术细胞的CPU还能把它给写成诗歌不成?

#2


你密钥长度是 1024位,可是你的密文才 char *source="i like dancing !";
改为
char source[1024]="i like dancing !";
其他的长度也做类似的修改试试?

#3


错了.应该是 1024/8 = 128.
改成
char source[128]="i like dancing !";

rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.

#4


引用 1 楼  的回复:
......加密之后出来的不是乱码还能是什么?难道那个毫无艺术细胞的CPU还能把它给写成诗歌不成?


因为我加密后要以http报文形式传过去给别人,我想要的是像MD5加密后的字符串,如:1KKKEEJ877HIUFSE
不相想得到这种东西:Œ<>„ü³—¢ëër‡0E¶ÿHý©>-èÈŸS6˜ý§(5»8°úp…Ïi‹Ö!ôÑuhöú0        Á…~ü“4kY&ìäDÔ¡;Uö*íK¨©%Êw'MȲcѼ0ب

#5


引用 3 楼  的回复:
错了.应该是 1024/8 = 128.
改成
char source[128]="i like dancing !";

rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.

char source[128]="i like dancing !";改了输出还是一串乱码。
请问有别的解决方法吗?

#6


那你再加一个报文转换在中间好了,指望它出来就是这样是不可能的。

#7


你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.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);//解密
RSA *g_rsa;
int main(void){
char source[BUFFSIZE]="i like dancing !";
char *ptr_en,*ptr_de;

BIGNUM* m_BigNumber = BN_new();
BN_set_word(m_BigNumber, RSA_F4);//默认值 e=0x10001L
g_rsa = RSA_new();
int ret=RSA_generate_key_ex(g_rsa, BUFFSIZE, m_BigNumber, 0);
printf("source is    :%s\n",source);
ptr_en=my_encrypt(source,OPENSSLKEY);
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;
}
//RSA *g_rsa;
//RSA_generate_key_ex(m_rsa, m_Bits, m_BigNumber, 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(g_rsa);
p_en=(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,g_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(g_rsa);
p_de=(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,g_rsa,RSA_NO_PADDING)<0){
return NULL;
}
// RSA_free(p_rsa);
// fclose(file);
return p_de;
}


#8


引用 7 楼  的回复:
你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/……


PEM_read_RSAPrivateKey 这个确认是对的,公钥和私钥都是用openssl生成的。

加密后是可以进行解密的,解密出来的是对的。只是加密后以%s输出是乱码而已。

#9


你要用ASCII码传送的话,在加密之后增加一个报文转换的过程,在接收端解密前再放一个报文恢复过程。

作用就是在8位纯二进制码和7位可传送代码形式之间转换。

#10


引用 9 楼  的回复:
你要用ASCII码传送的话,在加密之后增加一个报文转换的过程,在接收端解密前再放一个报文恢复过程。

作用就是在8位纯二进制码和7位可传送代码形式之间转换。


这也是一种方法,不过对我现在开发的东西不太适用。现在是对别的公司定的接口来开发的,我这边发送报文过去,他们应答。程序只能改我这边的,接口那边的公司没法改的。呵呵 。

#11


那就是说他们那边能接受那些东西了,你就直接发给他们好了。RSA加密出来的肯定就是这个样子的。

#12


引用 11 楼  的回复:
那就是说他们那边能接受那些东西了,你就直接发给他们好了。RSA加密出来的肯定就是这个样子的。

也是,反正先试试,到联调时再看对不对,不对再另外一说……

#13


hex to string.
string to hex.

0xfec8977319778abc   ------    hex

"fec8977319778abc"   ------    string

互转就行了

#14


引用 8 楼  的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>……

加密后必然是乱码啊...
如果加密后不是乱码,那才有问题

#15


引用 14 楼  的回复:
引用 8 楼  的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include……


今天已经解决了,用以下的函数进行转换,最后以16进制的字符串放在报文中传过去。



#define TOLOWER(x) ((x) | 0x20) 
#define isxdigit(c) (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F'))
#define isdigit(c) ('0' <= (c) && (c) <= '9') 

//bin2str(signret,out,strlen(signret),16); 转换为16进制
//last char of in must be 0x00
void bin2str(unsigned char* in,char* out,int size,int base)
{
unsigned char* pt1 = in;
char* pt2 = out;
do
{
pt2 += sprintf(pt2,"%02X",*pt1++);
size--;
}while(*pt1 && size);
}

void str2bin(char* in,unsigned char* out,int size,int base)
{
unsigned char* pt1 = (unsigned char*)in;
unsigned char* pt2 = out; 
while (isxdigit(*pt1) && size--)

*pt2++ = base * ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10) + ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10);


}

#16


已经解决,最后以16进制的字符串传过去。
以下的函数可以进行ASCII转以某进制的字符串,也可以以某进制的字符串转换为ASCII。

#define TOLOWER(x) ((x) | 0x20) 
#define isxdigit(c) (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F'))
#define isdigit(c) ('0' <= (c) && (c) <= '9') 

//bin2str(signret,out,strlen(signret),16); 转换为16进制
//last char of in must be 0x00
void bin2str(unsigned char* in,char* out,int size,int base)
{
unsigned char* pt1 = in;
char* pt2 = out;
do
{
pt2 += sprintf(pt2,"%02X",*pt1++);
size--;
}while(*pt1 && size);
}

void str2bin(char* in,unsigned char* out,int size,int base)
{
unsigned char* pt1 = (unsigned char*)in;
unsigned char* pt2 = out; 
while (isxdigit(*pt1) && size--)

*pt2++ = base * ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10) + ( isdigit(*pt1) ? *pt1++-'0' : TOLOWER(*pt1++)-'a'+10);


}

#17


引用 15 楼  的回复:
引用 14 楼 的回复:

引用 8 楼 的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#include<strin……

其实base64编码用的很普遍

#18


引用 17 楼  的回复:
引用 15 楼  的回复:
引用 14 楼 的回复:

引用 8 楼 的回复:
引用 7 楼 的回复:

你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
C/C++ code

#include<stdio.h>
#include<stdlib.h>……


恩,只要是二进制传输,base64之后可以随意的使用XML,JSON等等格式传输无障碍。