信息安全——MD5的实现
1.问题描述
MD5以512比特一块的方式处理输入的消息文本,每个块又划分为十六个32比特的子块。算法的输出由四个32比特的块组成,将它们级联成一个128比特的Hash值。
①首先填充消息使填充后的长度恰好为一个比512的倍数小64的数。填充方法是附一个“1”在消息后面,再补多个“0”。然后,在其后附上64比特的消息长度(填充前)的二进制表示。算法中使用了四个32比特的变量A、B、C、D,先把这四个变量初始化为:
A=01234567,B=89ABCDEF,C=FEDCBA98,D=76543210
称它们为链接变量。
① 接着进行算法的主循环,循环的次数是消息中512比特的块的数目。
将上面四个变量复制到另外的变量中:A到AA,B到BB,C到CC,D到DD。
主循环有四轮, 每一轮由16次操作组成。F、G、H、I函数,FF、GG、HH、II四种操作详见教材各密码学参考书。所有这些步骤进行完之后,将A、B、C、D分别加上AA、BB、CC、DD,然后用下一块数据继续进行算法。
③最后的输出是A、B、C、D的级联。
2.基本要求
以MD5(x)的形式实现,x为01串。
3. 实现提示
注意消息文本、各种变量的类型及其类型转换。
可以参考这里:www.cnblogs.com/fullsail/archive/2013/02/22/2921505.html
代码如下:
md5.h
#include "md5.h"#include <iostream>#include <string>using namespace std;int main(){string str;cout << "Please enter the data:" << endl;cin >> str;unsigned char result[16] ={0}; md5((unsigned char*)str.c_str(), str.length(), result);cout << "MD5 is ";for (int j = 0; j < 16; j++)printf ("%02X", result[j]);cout << "."<< endl; system ("pause");return 0;}