代碼路徑: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更新
