代码路径: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更新