常用加密算法MD5、SHA-2和AES源碼分享(C/C++)


代碼路徑:https://github.com/prophetss/MD5-SHA2-AES 

  最近了解了一些加密算法,學習整理一些目前比較常用的三種加密方式(散列、對稱、非對稱)的相關經典算法(MD5、SHA-2、AES、RSA),這次分享的是MD5、SHA-2和ASE的純C源碼,另外兩個我找時間整理好后會在貼出來。大概介紹下這三種算法,詳細的相關內容可以在網上搜索。MD5是一種散列算法可以將任何數據散列成128位,速度很快,一般感覺用於數據文件校驗比較多(安全性相對較低而且散列位數128位還是有概率碰撞,雖然極低極低,所以也有了另外這個SHA-2散列算法)。AES是一種非常安全的對稱加密,數據傳輸加密都可以用,然后有128、192、256位密鑰,當然密鑰越長加密解密越慢,看情況使用。

 

  三種算法的核心算法代碼都是我在網上查找的:

  MD5是基於Ron Rivest(RSA的那個R..)的算法,實現是由Colin Plumb 在1993年實現的。

  AES核心算法源碼(點這里

  SHA2核心算法源碼(點這里

  我對其進行了整理和封裝,最大程度方便使用

 

  MD5因為不牽扯密鑰和解密所以超簡單,兩個接口一個散列文件一個散列數據:

  void MD5File(const char *filename, unsigned char *digest);

  void MD5Data(const unsigned char *data, unsigned int len, unsigned char *digest);

 

  AES首先得確認密鑰長度,我這個是256位測試的,我代碼里已經定義好相關三個宏AES_128、AES_192、AES_256,自行替換代入,接口我分別封裝了加密解密數據和文件一共四個接口:

  int aes_cipher_data(uint8_t *in, size_t in_len, uint8_t *out, uint8_t *key, size_t key_len);

  int aes_decipher_data(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len, uint8_t *key, size_t key_len);

  int aes_cipher_file(const char *in_filename, const char *out_filename, uint8_t *key, size_t key_len);

  int aes_decipher_file(const char *in_filename, const char *out_filename, uint8_t *key, size_t key_len);

  因為aes加密需要進行補位之前沒有做,我這次更新添加了PKCS5Padding補位方法,填充的原則是:數據長度除16,余數不為16,需要補滿16個字節,填充(16-len)個(16-len),等於0額外填充16個16。所以aes_cipher_data數據加密函數輸出out的輸入長度16向上取整或額外多16;數據解密aes_decipher_data函數的out大小和in_len一樣大就可以,而輸出參數out_len為解密后實際數據長度(因為解密前不知道密文數據的實際長度)。文件的加密解密使用相當簡單不用考慮長度問題直接調用即可。

 

  SHA-2散列加密,這個加密和MD5類似,可以散列更多位數(所以碰撞概率更小當然速度也慢),我沒有添加直接文件可調用的接口,因為一般很少會用到(文件校驗MD5就已經夠用),如果有需要的話可以用對照MD5里的文件散列接口代碼稍作修改就可以,SHA-2一共有224、256、384和512四種散列長度,接口分別如下:

  void sha224(const unsigned char *message, unsigned int len, unsigned char *digest);

  void sha256(const unsigned char *message, unsigned int len, unsigned char *digest);

  void sha384(const unsigned char *message, unsigned int len, unsigned char *digest);

  void sha512(const unsigned char *message, unsigned int len, unsigned char *digest);

 

代碼我分別在linux和windows系統進行了簡單測試,測試代碼也已上傳,歡迎大家下載交流!

=================================================================

2018-02-06 00:22:30更新

=================================================================

2018-03-08 23:30:59更新

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM