MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和c语言源代码在Internet RFC 1321中有详细的描述(.ietf/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是与,|是或,~是非,^是异或)
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
假设Mj表示消息的第j个子分组(从0到15),<<
FF(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (F(b, c, d) + Mj + ti) << s
GG(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (G(b, c, d) + Mj + ti) << s
HH(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (H(b, c, d) + Mj + ti) << s
II(a, b, c, d, Mj, s, ti)表示 a = b + ((a + (I(b, c, d) + Mj + ti) << s
这四轮(64步)是:
第一轮
FF(a, b, c, d, M0, 7, 0xd76aa478)
FF(d, a, b, c, M1, 12, 0xe8c7b756)
FF(c, d, a, b, M2, 17, 0x242070db)
FF(b, c, d, a, M3, 22, 0xc1bdceee)
FF(a, b, c, d, M4, 7, 0xf57c0faf)
FF(d, a, b, c, M5, 12, 0x4787c62a)
FF(c, d, a, b, M6, 17, 0xa8304613)
FF(b, c, d, a, M7, 22, 0xfd469501)
FF(a, b, c, d, M8, 7, 0x698098d8)
FF(d, a, b, c, M9, 12, 0x8b44f7af)
FF(c, d, a, b, M10, 17, 0xffff5bb1)
FF(b, c, d, a, M11, 22, 0x895cd7be)
FF(a, b, c, d, M12, 7, 0x6b901122)
FF(d, a, b, c, M13, 12, 0xfd987193)
FF(c, d, a, b, M14, 17, 0xa679438e)
FF(b, c, d, a, M15, 22, 0x49b40821)
第二轮
GG(a, b, c, d, M1, 5, 0xf61e2562)
GG(d, a, b, c, M6, 9, 0xc040b340)
GG(c, d, a, b, M11, 14, 0x265e5a51)
GG(b, c, d, a, M0, 20, 0xe9b6c7aa)
GG(a, b, c, d, M5, 5, 0xd62f105d)
GG(d, a, b, c, M10, 9, 0x02441453)
GG(c, d, a, b, M15, 14, 0xd8a1e681)
GG(b, c, d, a, M4, 20, 0xe7d3fbc8)
GG(a, b, c, d, M9, 5, 0x21e1cde6)
GG(d, a, b, c, M14, 9, 0xc33707d6)
GG(c, d, a, b, M3, 14, 0xf4d50d87)
GG(b, c, d, a, M8, 20, 0x455a14ed)
GG(a, b, c, d, M13, 5, 0xa9e3e905)
GG(d, a, b, c, M2, 9, 0xfcefa3f8)
GG(c, d, a, b, M7, 14, 0x676f02d9)
GG(b, c, d, a, M12, 20, 0x8d2a4c8a)
第三轮
HH(a, b, c, d, M5, 4, 0xfffa3942)
HH(d, a, b, c, M8, 11, 0x8771f681)
HH(c, d, a, b, M11, 16, 0x6d9d6122)
HH(b, c, d, a, M14, 23, 0xfde5380c)
HH(a, b, c, d, M1, 4, 0xa4beea44)
HH(d, a, b, c, M4, 11, 0x4bdecfa9)
HH(c, d, a, b, M7, 16, 0xf6bb4b60)
HH(b, c, d, a, M10, 23, 0xbebfbc70)
HH(a, b, c, d, M13, 4, 0x289b7ec6)
HH(d, a, b, c, M0, 11, 0xeaa127fa)
HH(c, d, a, b, M3, 16, 0xd4ef3085)
HH(b, c, d, a, M6, 23, 0x04881d05)
HH(a, b, c, d, M9, 4, 0xd9d4d039)
HH(d, a, b, c, M12, 11, 0xe6db99e5)
HH(c, d, a, b, M15, 16, 0x1fa27cf8)
HH(b, c, d, a, M2, 23, 0xc4ac5665)
第四轮
II(a, b, c, d, M0, 6, 0xf4292244)
II(d, a, b, c, M7, 10, 0x432aff97)
II(c, d, a, b, M14, 15, 0xab9423a7)
II(b, c, d, a, M5, 21, 0xfc93a039)
II(a, b, c, d, M12, 6, 0x655b59c3)
II(d, a, b, c, M3, 10, 0x8f0ccc92)
II(c, d, a, b, M10, 15, 0xffeff47d)
II(b, c, d, a, M1, 21, 0x85845dd1)
II(a, b, c, d, M8, 6, 0x6fa87e4f)
II(d, a, b, c, M15, 10, 0xfe2ce6e0)
II(c, d, a, b, M6, 15, 0xa3014314)
II(b, c, d, a, M13, 21, 0x4e0811a1)
II(a, b, c, d, M4, 6, 0xf7537e82)
II(d, a, b, c, M11, 10, 0xbd3af235)
II(c, d, a, b, M2, 15, 0x2ad7d2bb)
II(b, c, d, a, M9, 21, 0xeb86d391)
常数ti可以如下选择:
在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)
所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。
当你按照我上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
关于巢湖的美丽传说
山西大学调剂过去的研究生,当然有奖学金(已改称助学金)。基本学制期内毕业的,助学金按1年10个月发放。
山西大学研究生国家助学金发放办法
(2014年6月30日制订,山大研字〔2014〕5号文件发布)
为保证我校研究生专心致力于学业,促进研究生培养质量不断提高,根据国家有关规定,研究生普通奖学金调整为研究生国家助学金,现就有关事宜规定如下:
一、资助对象及条件
山西大学研究生国家助学金资助对象为全日制研究生(不含定向就业生)。包括硕士生和博士生。
接受资助的研究生必须全脱产在校学习,要求将全部人事档案、组织关系在规定时间内转入山西大学。未在规定时间内转入档案的,除因不可抗力等正当事由外,视为放弃接受资助资格。
二、资助年限
研究生助学金按基本学制范围内(专业学位硕士生2或3年,学术学位硕士生3年;一般博士生3年,硕博连读博士生4年。)实际在校学习时间发放。基本学制期满仍不能毕业的研究生不再享受助学金。
助学金发放按1年10个月计。
三、资助标准
博士研究生的资助标准为每生每月1000元。
硕士研究生的资助标准为每生每月600元。
四、管理办法
研究生助学金由计财处根据研究生院提供的符合条件的学生名单按月直接发放到学生个人的银行账户中。
有下列情形之一者,停发助学金:
1.休学期间的学生;
2.受警告和警告以上处分,在相应处分期内的学生(处分解除后处分期内的助学金不再补发);
3.档案转出学校的学生。
五、本办法从2014级研究生开始执行。
六、本办法由研究生院负责解释。
在长江北岸,江淮之间镶嵌着中国五大淡水湖之一的巢湖。她烟波浩森,苍茫无际,有着许多美丽的传说。在汉刘安《淮南子》中,就记载了“历阳之都,一夕咸湖”的故事。东汉王充的《论衡》中还有一个巢湖出黄金的故事。至于“巢湖”得名,一种说法是湖泊形状像个鸟巢;还有一种说法是古代湖边人为了避水灾,以树为巢。
古诗云:“大湖淡雅西湖媚,未若巢湖气象雄”。巢湖之美,主要在湖,在岛,在山。姥山位于碧波荡漾的湖心,上有玲珑精巧的文峰塔。中庙是巢湖神女庙,耸峙于突入湖中的凤凰矶上。从中庙向东可见隐约的银屏山,千年银屏牡丹扎根峭岩之上。奇花之下,传说是吕洞宾修炼的“仙人洞”。关于银屏牡丹,传说它是违抗武则天旨意的牡丹仙子,拒绝雪天开放,由牡丹之都洛阳贬到巢湖边。另一则神话说,吕洞宾来银屏山修炼,不小心留下一粒仙丹,得天光地气孕育而成。正因为银屏牡丹有那么多神奇的传说,每年谷雨前后,远近游客前去看牡丹的络绎不绝。
巢湖水产丰富,特产有银白鲜嫩的白米虾、体大肉肥的金甲红毛蟹。小小的银鱼是鱼中珍品,说是孟姜女千里寻夫,途经巢湖,泪珠滴落湖中变成。湖中还产毛刀鱼,相传鲁班建中庙时,撒下的刨花。姥山是巢湖第一胜境。相传巢湖将陷时,有一焦婆先知,备船救民。后船上人满,焦婆恐船翻,自己跳入湖中化成一山,后人称为姥山。舍己救人的焦毋化为姥山,女儿化为姑山,母女可望不可及,女儿昼夜伤心啼哭,泪如泉涌。巢湖水涨,百姓纷纷逃离。吕洞宾云游至此,对焦氏母女十分同情,对玉帝陷巢州非常不满。遂使法术,使骇浪淘天的巢湖变得平静清泓,焦姑的眼泪变成了串串银鱼,浮游姥山与姑山之间,传递母女的爱文峰塔高七层,共100多级,为条石青砖砌成,每层风铃8只,塔内有砖雕佛像和石刻匾额题词。塔始建于明崇祯年间,清代李鸿章倡议重修。据民间传说,李鸿章为清代重臣之后,正“挡浪”(合肥方言,即有权有势)时,有位地理先生对他说:“合肥地势好,出了不少人。只是府门对着巢湖姥山,姥山平了些,不能出人头地,所以合肥出不了状元。如果塔修好,起名叫‘文峰塔’,就可以应一句谣谚:‘姥山尖一尖,合肥出状元’。”第二年,李鸿章的子侄正是考期,他委托江苏补用道吴毓芬募了一笔钱又续添了三层。可是这“尖一尖,中状元”的消息不知怎么让工匠知道了,他们不满李鸿章这种“假公济私”的做法,就找个借口没有把塔顶装上,姥山并没有“尖一尖”,这样合肥也就没有出状元。