




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA 实现MD4算法首先说说MD4的发展:MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位,一般128位长的MD4散列被表示为32位的十六进制数字。这个算法影响了后来的算法如MD5、SHA 家族和RIPEMD等。1991年Den Boer和Bosselaers发表了一篇文章指出MD4的短处,至今未能找到基于MD4以上改进的算法有任何可以用来进攻的弱点。2004年8月有人报告在计算MD4时可能发生杂凑冲撞。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步
2、和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。public class MD4 private static int A, B, C, D; private static int X = new int16; private static int F(int X, int Y, int Z) return (X & Y) | (X) & Z); private static int G(int X, int Y, i
3、nt Z) return (X & Y) | (X & Z) | (Y & Z); private static int H(int X, int Y, int Z) return X Y Z; private static int lshift(int x, int s) if (s = 0) return x; return (x (32 - s) & (0x7FFFFFFF (31 - s); private static int ROUND1(int a, int b, int c, int d, int k, int s) return (lshift(a + F(b, c, d)
4、+ Xk, s); private static int ROUND2(int a, int b, int c, int d, int k, int s) return (lshift(a + G(b, c, d) + Xk + (int) 0x5A, s); private static int ROUND3(int a, int b, int c, int d, int k, int s) return (lshift(a + H(b, c, d) + Xk + (int) 0x6ED9EBA1, s); public static void mdfour64(int M) int j;
5、int AA, BB, CC, DD; for (j = 0; j 16; j+) Xj = Mj; AA = A; BB = B; CC = C; DD = D; A = ROUND1(A, B, C, D, 0, 3); D = ROUND1(D, A, B, C, 1, 7); C = ROUND1(C, D, A, B, 2, 11); B = ROUND1(B, C, D, A, 3, 19); A = ROUND1(A, B, C, D, 4, 3); D = ROUND1(D, A, B, C, 5, 7); C = ROUND1(C, D, A, B, 6, 11); B =
6、ROUND1(B, C, D, A, 7, 19); A = ROUND1(A, B, C, D, 8, 3); D = ROUND1(D, A, B, C, 9, 7); C = ROUND1(C, D, A, B, 10, 11); B = ROUND1(B, C, D, A, 11, 19); A = ROUND1(A, B, C, D, 12, 3); D = ROUND1(D, A, B, C, 13, 7); C = ROUND1(C, D, A, B, 14, 11); B = ROUND1(B, C, D, A, 15, 19); A = ROUND2(A, B, C, D,
7、0, 3); D = ROUND2(D, A, B, C, 4, 5); C = ROUND2(C, D, A, B, 8, 9); B = ROUND2(B, C, D, A, 12, 13); A = ROUND2(A, B, C, D, 1, 3); D = ROUND2(D, A, B, C, 5, 5); C = ROUND2(C, D, A, B, 9, 9); B = ROUND2(B, C, D, A, 13, 13); A = ROUND2(A, B, C, D, 2, 3); D = ROUND2(D, A, B, C, 6, 5); C = ROUND2(C, D, A,
8、 B, 10, 9); B = ROUND2(B, C, D, A, 14, 13); A = ROUND2(A, B, C, D, 3, 3); D = ROUND2(D, A, B, C, 7, 5); C = ROUND2(C, D, A, B, 11, 9); B = ROUND2(B, C, D, A, 15, 13); A = ROUND3(A, B, C, D, 0, 3); D = ROUND3(D, A, B, C, 8, 9); C = ROUND3(C, D, A, B, 4, 11); B = ROUND3(B, C, D, A, 12, 15); A = ROUND3
9、(A, B, C, D, 2, 3); D = ROUND3(D, A, B, C, 10, 9); C = ROUND3(C, D, A, B, 6, 11); B = ROUND3(B, C, D, A, 14, 15); A = ROUND3(A, B, C, D, 1, 3); D = ROUND3(D, A, B, C, 9, 9); C = ROUND3(C, D, A, B, 5, 11); B = ROUND3(B, C, D, A, 13, 15); A = ROUND3(A, B, C, D, 3, 3); D = ROUND3(D, A, B, C, 11, 9); C
10、= ROUND3(C, D, A, B, 7, 11); B = ROUND3(B, C, D, A, 15, 15); A += AA; B += BB; C += CC; D += DD; A &= 0xFFFFFFFF; B &= 0xFFFFFFFF; C &= 0xFFFFFFFF; D &= 0xFFFFFFFF; public static void copy64(int M, byte in, int offset) int i; for (i = 0; i 16; i+) Mi = (inoffset + i * 4 + 3 24) & 0xFF) | (inoffset +
11、 i * 4 + 2 16) & 0xFF0000) | (inoffset + i * 4 + 1 8) & 0xFF); out2 + offset = (byte) (x 16) & 0xFF); out3 + offset = (byte) (x 24) & 0xFF); public static byte mdfour(byte in) byte out = new byte16; byte buf = new byte128; int n = in.length; int M = new int16; int b = n * 8; int i; int offset; A = 0
12、x; B = 0xefcdab89; C = 0x98badcfe; D = 0x; offset = 0; while (n 64) copy64(M, in, offset); mdfour64(M); offset += 64; n -= 64; for (i = 0; i 128; i+) bufi = (i + offset in.length) ? inoffset + i : 0; bufn = (byte) 0x80; if (n = 55) copy4(buf, 56, b); copy64(M, buf); mdfour64(M); else copy4(buf, 120,
13、 b); copy64(M, buf); mdfour64(M); copy64(M, buf, 64); mdfour64(M); for (i = 0; i 128; i+) bufi = 0; copy64(M, buf); copy4(out, 0, A); copy4(out, 4, B); copy4(out, 8, C); copy4(out, 12, D); A = B = C = D = 0; return out; private static final char HEX_DIGITS = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d,
14、 e, f ; public static String toHexString(byte b) return toHexString(b, 0, b.length); public static String toHexString(byte b, int off, int len) char buf = new charlen * 2; for (int i = 0, j = 0, k; i 4) & 0x0F; bufj+ = HEX_DIGITSk & 0x0F; return new String(buf); private static String getTestResult(String s) return toHexString(mdfour(s.getBytes(); public static void main(String args) System.out.println(getTestResult(); System.out.println(getTestResult(a); System.out.println(getTestResult(abc); System.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学生创新创业基础项目教程 课件 项目九 模拟开办企业
- 主管药师(专业知识)模拟试卷答案学习资料
- 种子学第一章2013学习资料
- (高清版)DB510100∕T 171-2015 海栀子观赏苗木扦插培育技术规程及质量分级
- 幼儿园大班体育教案
- 李宁品牌分销渠道研究
- 决胜关键2025年计算机二级考试试题及答案
- 车间巡查管理制度建设
- 食品日常查验管理制度
- 通宝集团印章管理制度
- 2025山西地质集团招聘37人笔试参考题库附带答案详解
- 《中华人民共和国招标投标法》知识培训
- 【大数据百家讲坛】2025年DeepSeek、Manus与AI+Agent行业现状报告
- 广州2025年广东广州海珠区新港街道第一批雇员招聘5人笔试历年参考题库附带答案详解
- 2024年湖南新华书店集团招聘笔试真题
- 儿童口腔保健知识宣教
- 2025届江苏省苏锡常镇四市高三下学期教学情况调(一)(一模)英语+答案
- 商业地产租赁及运营管理手册
- 2025年(广东省协会 )房屋安全检测鉴定技术培训-机考历年真题考前冲刺题
- 风电机组检修规程
- 2025年美丽中国第六届全国国家版图知识竞赛题库及答案(中小学组)
评论
0/150
提交评论