OpenSSL C 簡單應用

2021-10-03 16:24:11 字數 3906 閱讀 2998

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 埠號碼 傳送這個資訊的埠 裝置效能 裝置...