是否是用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 !";
其他的长度也做类似的修改试试?
改为
char source[1024]="i like dancing !";
其他的长度也做类似的修改试试?
#3
错了.应该是 1024/8 = 128.
改成
char source[128]="i like dancing !";
rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.
改成
char source[128]="i like dancing !";
rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.
#4
因为我加密后要以http报文形式传过去给别人,我想要的是像MD5加密后的字符串,如:1KKKEEJ877HIUFSE
不相想得到这种东西:Œ<>„ü³—¢ëër‡0E¶ÿHý©>-èÈŸS6˜ý§(5»8°úp…Ïi‹Ö!ôÑuhöú0 Á…~ü“4kY&ìäDÔ¡;Uö*íK¨©%Êw'MȲcѼ0ب
#5
char source[128]="i like dancing !";改了输出还是一串乱码。
请问有别的解决方法吗?
#6
那你再加一个报文转换在中间好了,指望它出来就是这样是不可能的。
#7
你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
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
PEM_read_RSAPrivateKey 这个确认是对的,公钥和私钥都是用openssl生成的。
加密后是可以进行解密的,解密出来的是对的。只是加密后以%s输出是乱码而已。
#9
你要用ASCII码传送的话,在加密之后增加一个报文转换的过程,在接收端解密前再放一个报文恢复过程。
作用就是在8位纯二进制码和7位可传送代码形式之间转换。
作用就是在8位纯二进制码和7位可传送代码形式之间转换。
#10
这也是一种方法,不过对我现在开发的东西不太适用。现在是对别的公司定的接口来开发的,我这边发送报文过去,他们应答。程序只能改我这边的,接口那边的公司没法改的。呵呵 。
#11
那就是说他们那边能接受那些东西了,你就直接发给他们好了。RSA加密出来的肯定就是这个样子的。
#12
也是,反正先试试,到联调时再看对不对,不对再另外一说……
#13
hex to string.
string to hex.
0xfec8977319778abc ------ hex
"fec8977319778abc" ------ string
互转就行了
string to hex.
0xfec8977319778abc ------ hex
"fec8977319778abc" ------ string
互转就行了
#14
加密后必然是乱码啊...
如果加密后不是乱码,那才有问题
#15
今天已经解决了,用以下的函数进行转换,最后以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。
以下的函数可以进行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
其实base64编码用的很普遍
#18
恩,只要是二进制传输,base64之后可以随意的使用XML,JSON等等格式传输无障碍。
#1
......加密之后出来的不是乱码还能是什么?难道那个毫无艺术细胞的CPU还能把它给写成诗歌不成?
#2
你密钥长度是 1024位,可是你的密文才 char *source="i like dancing !";
改为
char source[1024]="i like dancing !";
其他的长度也做类似的修改试试?
改为
char source[1024]="i like dancing !";
其他的长度也做类似的修改试试?
#3
错了.应该是 1024/8 = 128.
改成
char source[128]="i like dancing !";
rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.
改成
char source[128]="i like dancing !";
rsa是以n位的"数字"为单位 加密的.
你的输入必须也是 最小单位的倍数,也就是说是 128的整数倍的 字符串.
#4
因为我加密后要以http报文形式传过去给别人,我想要的是像MD5加密后的字符串,如:1KKKEEJ877HIUFSE
不相想得到这种东西:Œ<>„ü³—¢ëër‡0E¶ÿHý©>-èÈŸS6˜ý§(5»8°úp…Ïi‹Ö!ôÑuhöú0 Á…~ü“4kY&ìäDÔ¡;Uö*íK¨©%Êw'MȲcѼ0ب
#5
char source[128]="i like dancing !";改了输出还是一串乱码。
请问有别的解决方法吗?
#6
那你再加一个报文转换在中间好了,指望它出来就是这样是不可能的。
#7
你加密和解密不是用的同一个密码吗?
PEM_read_RSAPrivateKey确认用对了吗??
文件内的内容是正确的吗?
我用一个全局的RSA加密解密了,你看看结果:
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
PEM_read_RSAPrivateKey 这个确认是对的,公钥和私钥都是用openssl生成的。
加密后是可以进行解密的,解密出来的是对的。只是加密后以%s输出是乱码而已。
#9
你要用ASCII码传送的话,在加密之后增加一个报文转换的过程,在接收端解密前再放一个报文恢复过程。
作用就是在8位纯二进制码和7位可传送代码形式之间转换。
作用就是在8位纯二进制码和7位可传送代码形式之间转换。
#10
这也是一种方法,不过对我现在开发的东西不太适用。现在是对别的公司定的接口来开发的,我这边发送报文过去,他们应答。程序只能改我这边的,接口那边的公司没法改的。呵呵 。
#11
那就是说他们那边能接受那些东西了,你就直接发给他们好了。RSA加密出来的肯定就是这个样子的。
#12
也是,反正先试试,到联调时再看对不对,不对再另外一说……
#13
hex to string.
string to hex.
0xfec8977319778abc ------ hex
"fec8977319778abc" ------ string
互转就行了
string to hex.
0xfec8977319778abc ------ hex
"fec8977319778abc" ------ string
互转就行了
#14
加密后必然是乱码啊...
如果加密后不是乱码,那才有问题
#15
今天已经解决了,用以下的函数进行转换,最后以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。
以下的函数可以进行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
其实base64编码用的很普遍
#18
恩,只要是二进制传输,base64之后可以随意的使用XML,JSON等等格式传输无障碍。