常用加密算法MD5、SHA-2和AES源码分享(CC++)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常⽤加密算法MD5、SHA-2和AES源码分享(CC++)
最近了解了⼀些加密算法,学习整理⼀些⽬前⽐较常⽤的三种加密⽅式(散列、对称、⾮对称)的相关经典算法
(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更新。

相关文档
最新文档