C++ 使用openssl庫實現 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

  以前工做上須要用C++把軟件生成的用戶序列號用des加密cbc的模式,加密後爲二進制,轉化爲十六進制,而後提供給java寫的受權碼管理平臺。 java平臺會根據用戶序列號,生成一個受權碼,受權碼是用rsa 私加公解的模式加密的,加密後爲二進制,而後轉爲safeBase64格式。受權碼拿來在C++的軟件上受權,C++首先將safeBase64格式轉爲base64格式,再轉爲二進制,而後rsa解密出來獲得明文。html

  如今回頭整理那段時間的工做。小吐槽一下,想一想碰到的坑,腦瓜疼。看了我碰到的坑,大家也能理清楚很多疑惑。java

    先說DES加解密。java告訴用des,本身沒接觸過,網上找了一段代碼,調用openssl庫實現的des加解密,ecb模式的,折騰一番,實現了加密解密。跟java一碰,發現徹底對不上。java查看代碼,發現庫函數有cbc的字樣,用的cbc模式。ok嘛,接着實現cbc模式。頭疼的是找遍了百度和谷歌,都沒有找到有實現cbc模式的C++代碼。怎麼辦呢,我就對照着ecb的實現,和cbc模式加密的理論,本身作。幸運的是,作出來了。來實現cbc模式的加解密, 在調用openssl庫的接口時,須要傳入密匙和IV向量。網上的代碼有的IV向量是隨意的,有的是全零。而後我發現,IV向量的值並不是爲所欲爲就能實現加密解密。而後我用了網上的一個數組值,本身能夠加密解密了。而後我把密匙設置爲跟java一致,結果卻不美好,加密的結果跟java不相同,也不能把java的密文解密出來。而後呢,java調用的庫函數,只須要提供一個密匙KEY,所以java也不清楚問題出在哪。跟java反覆的討論中,java同事廷謀哥說,把IV向量設置爲密匙KEY試試,一試便成功了。須要注意的是java默認加密的填充方式爲pkcs5padding,C++須要本身實現。web

  再說說RSA加解密。java告訴用rsa, 也是本身沒接觸過。網上找代碼,copy了一份,公鑰解密私鑰解密, 隨機生成密匙的代碼。整理下來,能夠加解密了。問題是若是明文過長,加解密的結果是不對了,表面看能加密,解密爲空,實際上加密的結果是不完整的。好嘛,辛辛苦苦實現了,儘管不完美,可是能簡單用,趕忙把隨機生成祕鑰的代碼註釋掉,換上java的祕鑰。~~~呵呵呵,又不行了。一步步刨坑,rsa生成的祕鑰有長度得區別,不一樣的長度能實現加密的明文是不一樣的。rsa加解密是分「公鑰加密私鑰解密」、「私鑰加密公鑰解密」的。而且,公加私解的密文是變更的,私加公解密文是固定的, rsa加解密是須要分片的。另外呢,java默認生成的密匙,公鑰和私鑰都是pkcs#8, 而C++調用openssl生成的密匙,公鑰和私鑰都是pkcs#1格式。腦瓜疼吧,再疼一下。java把生成的祕鑰和加密後的密文是轉爲safaBase64格式的。這些在C++這邊都是須要本身實現的。須要注意的是java默認加密的填充方式爲pkcs1padding,openssl在這一點跟java是一致的。最後一個小關注點是全部採用UTF8編碼。數組

==============================================================函數

              進入正題工具

==============================================================編碼

1、openssl庫加密

  I)庫下載.net

    百度下載OpenSSL-Win32軟件,安裝後,安裝目錄有 lib文件夾  include文件夾htm

    II)庫使用__個人環境是VS2010

   項目屬性中,按照 ../openssl/include/openssl;的路徑配置; cpp文件中,按照#include "openssl/rsa.h"的方式調用

 

2、DES加密 cbc模式

       I)簡單說明[原理][祕鑰][IV向量][填充方式]

       II)代碼例子

 

3、RSA加密

  I)簡單說明[祕鑰]

  II)生成祕鑰對代碼例子

  III)公鑰加密私鑰解密代碼例子

  IIII)私鑰加密公鑰解密代碼例子

 

附1: RSA密匙格式在線轉換工具         DES/RSA加解密系列在線工具

附2:C++二進制字符串轉十六進制字符串  C++十六進制字符串轉二進制字符串

附3:C++二進制字符串轉Base64字符串    C++Base64字符串轉二進制字符串        C++base64格式和nonSafeBase64格式轉換

 

 

未完待續...

相關文章
相關標籤/搜索