1.加密後得內容中帶有結束符,cout輸出不能正常輸出
2.將加密後的內容存到檔案,解密的時候再讀出來,可能會碰到結束符而提前終止讀取檔案,導致解密失敗
3.將加密後的內容轉為十六進製制,解密再轉回來是完全可以的,但是我將加密後的內容轉為二進位制會有問題,我看解密的時候具體資料都是一樣的,卻解密失敗。這個我也未解決。
// openssldemo.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include#include #include #include #include #include #include #include #include #include "openssl/md5.h"
#include "openssl/sha.h"
#include "openssl/des.h"
#include "openssl/rsa.h"
#include "openssl/pem.h"
#include "base64.h"
#include "memery.h"
using namespace std;
#define key_length 2048
#define pub_key_file "pubkey.pem"
#define pri_key_file "prikey.pem"
#pragma warning(disable:4996)
void str_to_two(const uchar *str,int strlen,uchar *twostr);
void two_to_str(const uchar *indata,int indatalen,uchar *outstr);
string string_to_hex(std::string const &str);
string hex_to_string(std::string const &str);
string getmsg(int ret)
return message;
}//2進製轉16進製制
unsigned char char2hexchar(const unsigned char &x)
//sha1加密
string sha1(const string &str)
; sha1_final(szsha1,&c);
string strsha1="";
// unsigned char strtmphex;
char buf[41] = ;
char tmp[3] = ;
for (int i=0;ivecciphertext;
unsigned char tmp[8]=;
for (size_t i=0;iveccleartext;
unsigned char tmp[8];
for (size_t i=0;i=0)
;str_to_two((unsigned char*)strret.c_str(),strret.size(),twoarray); //將加密後的內容轉為2進製
//memcpy((char*)strtwo.c_str(),twoarray,strlen((char*)twoarray));
writefile("rsa_en_2.txt",string((char*)twoarray));
}//釋放記憶體
delete encryptedtext;
bio_free_all(keybio);
rsa_free(rsa);
return 1;
}//私鑰解密
int rsa_pri_decrypt(const string ciphertext,const string prikey)
; str_to_two((unsigned char*)en_data.c_str(),en_data.size(),twoarray);
writefile("a_rsa_de_2.txt",string((char*)twoarray));
string strret;
rsa *rsa=rsa_new();
//string path="..//file";
/*file *f=fopen(path.c_str(),"rb+");
rsa = pem_read_rsaprivatekey(f, null, null, null);
if(rsa==null) */
bio *keybio;
keybio=bio_new_mem_buf((unsigned char*)prikey.c_str(),-1);
//三種方式
//1.讀取記憶體裡生成的金鑰對,再從記憶體生成rsa
//2.讀取磁碟裡生成的金鑰對文字檔案,再從記憶體生成rsa
//3.直接從讀取檔案指標生成rsa
rsa=pem_read_bio_rsaprivatekey(keybio,&rsa,null,null);
// 從檔案中讀取私鑰
int len=rsa_size(rsa);
char *decryptedtext=new char[len+1];
memset(decryptedtext,0,len+1);
int ret=rsa_private_decrypt(en_data.size(),(unsigned char*)en_data.c_str(),(unsigned char*)decryptedtext,rsa,rsa_pkcs1_padding);
if(ret>=0)
else
return 0;
//釋放記憶體
delete decryptedtext;
bio_free_all(keybio);
rsa_free(rsa);
return 1;
}/******************************************
** 功能:字元轉二進位制
** 引數:
** str:輸入的字元
** strlen:輸入字串的長度
** twostr:字串轉換成的二進位制
*******************************************
*/void str_to_two(const uchar *str,int strlen,uchar *twostr)
else}}
twostr++;
*twostr='\0'; //結束字串
}/******************************************
** 功能:二進位制轉字元
** 引數:
** indata:輸入的二進位制陣列
** indatalen:輸入二進位制陣列的長度
** outstr:二進位制轉換後的字元
*******************************************
*/void two_to_str(const uchar *indata,int indatalen,uchar *outstr)
++kk;
}outstr[kk]='\0';
}string string_to_hex(string const &str)
; sprintf(hex, "%#.2x ", (unsigned char)str[i]);
ret += hex;
}return ret;
}string hex_to_string(string const &str)
return ret;
}int _tmain(int argc, _tchar* ar**)
openssl C語言編碼實現rsa加密
首先介紹下命令台下openssl工具的簡單使用 1 生成乙個金鑰 openssl genrsa out test.key 1024 這裡 out指定生成檔案的。需要注意的是這個檔案包含了公鑰和金鑰兩部分,也就是說這個檔案即可用來加密也可以用來解密。後面的1024是生成金鑰的長度。2 openssl可...
mysql 簡單應用 MYSQL 簡單應用
簡單整理 待補充 安裝install mysql community release el7 5.noarch.x86 64.rpm yum install mysql mysql server mysql devel mysql secure installation 建立密碼 建立使用者 gra...
CDP簡單應用
cdp簡單應用 今天,學習了cisco的cdp協議。原來一直以為cdp發現鄰居,只能發現直連的裝置。但今天老師還講了,在一定條件下,cdp不只能發現直連的鄰居。注意在這裡是有條件的 cisco中的cdp協議,一般都是用來檢視鄰居資訊的。如 裝置名稱 裝置ip 埠號碼 傳送這個資訊的埠 裝置效能 裝置...