`
ygsilence
  • 浏览: 332684 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MD5 码 校 验

    博客分类:
  • java
阅读更多
package com.trs.tool;

import java.io.PrintStream;
import java.lang.reflect.Array;

public class MD5
{
  static final int S11 = 7;
  static final int S12 = 12;
  static final int S13 = 17;
  static final int S14 = 22;
  static final int S21 = 5;
  static final int S22 = 9;
  static final int S23 = 14;
  static final int S24 = 20;
  static final int S31 = 4;
  static final int S32 = 11;
  static final int S33 = 16;
  static final int S34 = 23;
  static final int S41 = 6;
  static final int S42 = 10;
  static final int S43 = 15;
  static final int S44 = 21;
  static final byte[] PADDING = { -128 };

  private long[] state = new long[4];
  private long[] count = new long[2];
  private byte[] buffer = new byte[64];
  public String digestHexStr;
  private byte[] digest = new byte[16];

  public String getMD5ofStr(String inbuf)
  {
    md5Init();
    md5Update(inbuf.getBytes(), inbuf.length());
    md5Final();
    this.digestHexStr = "";
    for (int i = 0; i < 16; i++) {
      this.digestHexStr += byteHEX(this.digest[i]);
    }
    return this.digestHexStr;
  }

  public MD5()
  {
    md5Init();
  }

  private void md5Init()
  {
    this.count[0] = 0L;
    this.count[1] = 0L;

    this.state[0] = 1732584193L;
    this.state[1] = 4023233417L;
    this.state[2] = 2562383102L;
    this.state[3] = 271733878L;
  }

  private long F(long x, long y, long z)
  {
    return x & y | (x ^ 0xFFFFFFFF) & z;
  }

  private long G(long x, long y, long z) {
    return x & z | y & (z ^ 0xFFFFFFFF);
  }

  private long H(long x, long y, long z) {
    return x ^ y ^ z;
  }

  private long I(long x, long y, long z) {
    return y ^ (x | z ^ 0xFFFFFFFF);
  }

  private long FF(long a, long b, long c, long d, long x, long s, long ac)
  {
    a += F(b, c, d) + x + ac;
    a = (int)a << (int)s | (int)a >>> (int)(32L - s);
    a += b;
    return a;
  }

  private long GG(long a, long b, long c, long d, long x, long s, long ac)
  {
    a += G(b, c, d) + x + ac;
    a = (int)a << (int)s | (int)a >>> (int)(32L - s);
    a += b;
    return a;
  }

  private long HH(long a, long b, long c, long d, long x, long s, long ac) {
    a += H(b, c, d) + x + ac;
    a = (int)a << (int)s | (int)a >>> (int)(32L - s);
    a += b;
    return a;
  }

  private long II(long a, long b, long c, long d, long x, long s, long ac) {
    a += I(b, c, d) + x + ac;
    a = (int)a << (int)s | (int)a >>> (int)(32L - s);
    a += b;
    return a;
  }

  private void md5Update(byte[] inbuf, int inputLen)
  {
    byte[] block = new byte[64];
    int index = (int)(this.count[0] >>> 3) & 0x3F;

    if (this.count[0] += (inputLen << 3) < inputLen << 3)
      this.count[1] += 1L;
    this.count[1] += (inputLen >>> 29);

    int partLen = 64 - index;
    int i;
    if (inputLen >= partLen) {
      md5Memcpy(this.buffer, inbuf, index, 0, partLen);
      md5Transform(this.buffer);

      for (int i = partLen; i + 63 < inputLen; i += 64)
      {
        md5Memcpy(block, inbuf, 0, i, 64);
        md5Transform(block);
      }
      index = 0;
    }
    else
    {
      i = 0;
    }

    md5Memcpy(this.buffer, inbuf, index, i, inputLen - i);
  }

  private void md5Final()
  {
    byte[] bits = new byte[8];

    Encode(bits, this.count, 8);

    int index = (int)(this.count[0] >>> 3) & 0x3F;
    int padLen = index < 56 ? 56 - index : 120 - index;
    md5Update(PADDING, padLen);

    md5Update(bits, 8);

    Encode(this.digest, this.state, 16);
  }

  private void md5Memcpy(byte[] output, byte[] input, int outpos, int inpos, int len)
  {
    for (int i = 0; i < len; i++)
      output[(outpos + i)] = input[(inpos + i)];
  }

  private void md5Transform(byte[] block)
  {
    long a = this.state[0]; long b = this.state[1]; long c = this.state[2]; long d = this.state[3];
    long[] x = new long[16];

    Decode(x, block, 64);

    a = FF(a, b, c, d, x[0], 7L, 3614090360L);
    d = FF(d, a, b, c, x[1], 12L, 3905402710L);
    c = FF(c, d, a, b, x[2], 17L, 606105819L);
    b = FF(b, c, d, a, x[3], 22L, 3250441966L);
    a = FF(a, b, c, d, x[4], 7L, 4118548399L);
    d = FF(d, a, b, c, x[5], 12L, 1200080426L);
    c = FF(c, d, a, b, x[6], 17L, 2821735955L);
    b = FF(b, c, d, a, x[7], 22L, 4249261313L);
    a = FF(a, b, c, d, x[8], 7L, 1770035416L);
    d = FF(d, a, b, c, x[9], 12L, 2336552879L);
    c = FF(c, d, a, b, x[10], 17L, 4294925233L);
    b = FF(b, c, d, a, x[11], 22L, 2304563134L);
    a = FF(a, b, c, d, x[12], 7L, 1804603682L);
    d = FF(d, a, b, c, x[13], 12L, 4254626195L);
    c = FF(c, d, a, b, x[14], 17L, 2792965006L);
    b = FF(b, c, d, a, x[15], 22L, 1236535329L);

    a = GG(a, b, c, d, x[1], 5L, 4129170786L);
    d = GG(d, a, b, c, x[6], 9L, 3225465664L);
    c = GG(c, d, a, b, x[11], 14L, 643717713L);
    b = GG(b, c, d, a, x[0], 20L, 3921069994L);
    a = GG(a, b, c, d, x[5], 5L, 3593408605L);
    d = GG(d, a, b, c, x[10], 9L, 38016083L);
    c = GG(c, d, a, b, x[15], 14L, 3634488961L);
    b = GG(b, c, d, a, x[4], 20L, 3889429448L);
    a = GG(a, b, c, d, x[9], 5L, 568446438L);
    d = GG(d, a, b, c, x[14], 9L, 3275163606L);
    c = GG(c, d, a, b, x[3], 14L, 4107603335L);
    b = GG(b, c, d, a, x[8], 20L, 1163531501L);
    a = GG(a, b, c, d, x[13], 5L, 2850285829L);
    d = GG(d, a, b, c, x[2], 9L, 4243563512L);
    c = GG(c, d, a, b, x[7], 14L, 1735328473L);
    b = GG(b, c, d, a, x[12], 20L, 2368359562L);

    a = HH(a, b, c, d, x[5], 4L, 4294588738L);
    d = HH(d, a, b, c, x[8], 11L, 2272392833L);
    c = HH(c, d, a, b, x[11], 16L, 1839030562L);
    b = HH(b, c, d, a, x[14], 23L, 4259657740L);
    a = HH(a, b, c, d, x[1], 4L, 2763975236L);
    d = HH(d, a, b, c, x[4], 11L, 1272893353L);
    c = HH(c, d, a, b, x[7], 16L, 4139469664L);
    b = HH(b, c, d, a, x[10], 23L, 3200236656L);
    a = HH(a, b, c, d, x[13], 4L, 681279174L);
    d = HH(d, a, b, c, x[0], 11L, 3936430074L);
    c = HH(c, d, a, b, x[3], 16L, 3572445317L);
    b = HH(b, c, d, a, x[6], 23L, 76029189L);
    a = HH(a, b, c, d, x[9], 4L, 3654602809L);
    d = HH(d, a, b, c, x[12], 11L, 3873151461L);
    c = HH(c, d, a, b, x[15], 16L, 530742520L);
    b = HH(b, c, d, a, x[2], 23L, 3299628645L);

    a = II(a, b, c, d, x[0], 6L, 4096336452L);
    d = II(d, a, b, c, x[7], 10L, 1126891415L);
    c = II(c, d, a, b, x[14], 15L, 2878612391L);
    b = II(b, c, d, a, x[5], 21L, 4237533241L);
    a = II(a, b, c, d, x[12], 6L, 1700485571L);
    d = II(d, a, b, c, x[3], 10L, 2399980690L);
    c = II(c, d, a, b, x[10], 15L, 4293915773L);
    b = II(b, c, d, a, x[1], 21L, 2240044497L);
    a = II(a, b, c, d, x[8], 6L, 1873313359L);
    d = II(d, a, b, c, x[15], 10L, 4264355552L);
    c = II(c, d, a, b, x[6], 15L, 2734768916L);
    b = II(b, c, d, a, x[13], 21L, 1309151649L);
    a = II(a, b, c, d, x[4], 6L, 4149444226L);
    d = II(d, a, b, c, x[11], 10L, 3174756917L);
    c = II(c, d, a, b, x[2], 15L, 718787259L);
    b = II(b, c, d, a, x[9], 21L, 3951481745L);

    this.state[0] += a;
    this.state[1] += b;
    this.state[2] += c;
    this.state[3] += d;
  }

  private void Encode(byte[] output, long[] input, int len)
  {
    int i = 0; for (int j = 0; j < len; j += 4) {
      output[j] = (byte)(int)(input[i] & 0xFF);
      output[(j + 1)] = (byte)(int)(input[i] >>> 8 & 0xFF);
      output[(j + 2)] = (byte)(int)(input[i] >>> 16 & 0xFF);
      output[(j + 3)] = (byte)(int)(input[i] >>> 24 & 0xFF);

      i++;
    }
  }

  private void Decode(long[] output, byte[] input, int len)
  {
    int i = 0; for (int j = 0; j < len; j += 4) {
      output[i] = (b2iu(input[j]) | 
        b2iu(input[(j + 1)]) << 8 | 
        b2iu(input[(j + 2)]) << 16 | 
        b2iu(input[(j + 3)]) << 24);

      i++;
    }
  }

  public static long b2iu(byte b)
  {
    return b < 0 ? b & 0xFF : b;
  }

  public static String byteHEX(byte ib)
  {
    char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
      'A', 'B', 'C', 'D', 'E', 'F' };
    char[] ob = new char[2];
    ob[0] = Digit[(ib >>> 4 & 0xF)];
    ob[1] = Digit[(ib & 0xF)];
    String s = new String(ob);
    return s;
  }

  public static void main(String[] args)
  {
    MD5 m = new MD5();
    if (Array.getLength(args) == 0)
    {
      System.out.println("MD5 Test suite:");
      System.out.println("MD5(\"\"):" + m.getMD5ofStr(""));
      System.out.println("MD5(\"a\"):" + m.getMD5ofStr("a"));
      System.out.println("MD5(\"abc\"):" + m.getMD5ofStr("abc"));
      System.out.println("MD5(\"message digest\"):" + m.getMD5ofStr("message digest"));
      System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):" + 
        m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
      System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"):" + 
        m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
    }
    else {
      System.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));
    }
  }
}
分享到:
评论
1 楼 iceage1980 2015-02-05  
博主你好 我用了你这个代码  为什么总是在 if (this.count[0] += (inputLen << 3) < inputLen << 3)  这个地方报错呢。
还请指教啊。谢谢。

相关推荐

    md5校检工具

    验证系统文件等的md5码工具(hash) 无需安装直接使用 有毒司马

    25175asp.net学校学生档案.报名综合管理系统v1.0.5源码版

    报名内容{用户名,密码,确认密码,EMail,QQ号码 ,真实姓名 ,性别,年龄,家庭住址,...验证码:进行登陆学生 /admin/index.asp 后台admin aaa进行登陆管理,密码是加MD5加密,分页技术,用户群删, 后台: 类别管理(年届管理,系所

    基于 Java Swing + 人脸识别 实现的学校考试系统

    5. 利用 Spire 类库实现校园卡上的条形码识别 6. 利用 JFreeChart 将学生成绩等导出为图表 7. 利用阿里巴巴的 easyExcel 组件实现了试题导出,导入 Excel 表格 8. 基本的 CRUD 操作 9. 借助 JFromDesigner 辅助设置...

    高考学校录取查询系统 v12.8.rar

    6.数据库管理人员密码均采用MD5-16位加密,即使数据库被下载也不会导致管理密码泄露。 7.可以自由修改管理密码,添加删除管理员,方便多个管理员输入录取信息,提高录入效率。 8.后台自由发布公告。 9.后台控制...

    多多校园论坛,很经典很强大

    4 特别说明,留言本使用MD5加密,如果密码丢失请下载数据库后打开,将admin的MD5码(21232f297a57a5a743894a0e4a801fc3)(不包括号)复制到密码栏,就可以用admin作为密码登录了。 5 在安装过程中,很多用户会在...

    基于JAVA的校园商铺平台的设计与实现(1).docx

    2 2.4.1 Java 2 2.4.2 MySQL 2 2.4.3 Redis 3 2.4.4 JDBC 3 2.4.5 MD5 3 2.5 系统使用的平台和运行的环境 3 2.5.1 系统使用的平台 3 2.5.2 运行的环境 3 第三章 需求分析 3 3.1 系统功能模块概述和分析 3 3.2 系统...

    25175报名管理系统(ASP.net2.0) v1.0.3 beta.rar

    /admin/index.asp 后台admin aaa进行登陆管理,密码是加MD5加密,分页技术,用户群删, 后台: 类别管理(年届管理,系所管理,专业管理,班级管理) 学生管理(学生档案,档案信息导入,核审学生信息) 添加学生档案(姓名,...

    25175 报名管理系统 1.0.5 Beta.rar

    后台路径Admin/Login.aspx 管理员admin 密码aaa 密码是加MD5加密,分页技术,用户群删 25175 报名管理系统(ASP.net2.0) 后台: 类别管理(年届管理,系所管理,专业管理,班级管理) 学生管理(学生档案,档案信息导入...

    计算机毕业设计Java高校学生工作管理系统的设计与开发

    信息技术和经济的发展,使计算机和网络的应用变得越来越普遍,随着政府 ...止暴力破解,在数据库中的密码运用 MD5 加密算法,以增加安全性。系统语言 为 Html 和 Java,移植性好,每块代码都分包存放,易于维护。

    25175学生档案报名管理系统(asp.net2.0) v1.0.5 beta.rar

    /admin/index.asp 后台admin aaa进行登陆管理,密码是加MD5加密,分页技术,用户群删, 后台: 类别管理(年届管理,系所管理,专业管理,班级管理) 学生管理(学生档案,档案信息导入,核审学生信息) 添加学生档案(姓名,...

    asp.net校园信息论坛交流照片分享网站+源代码+文档说明+数据库.zip

    asp.net校园信息论坛交流照片分享网站 程序开发软件: Visual Studio 2010以上 数据库:sqlserver2005以上,大概11个表 ...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    学生档案及报名系统.7z

    报名内容{用户名,密码,确认密码,EMail,QQ号码 ,真实姓名 ,性别,...所有报名内容都要经过验证,互联网上细节做的到位的25175报名类软件 .../Admin/Index.Asp 后台Admin Aaa进行登陆管理,密码是加MD5加密,分页技术,用户群删,

    高考学校录取查询系统 2012.8

    6.数据库管理人员密码均采用MD5-16位加密,即使数据库被下载也不会导致管理密码泄露。 7.可以自由修改管理密码,添加删除管理员,方便多个管理员输入录取信息,提高录入效率。 8.后台自由发布公告。 9.后台控制...

    ThinkPHP在线校园论坛网站+源代码+文档说明+数据库.zip

    ThinkPHP在线校园论坛网站毕业源码案例设计 开发软件: VSCode或DW等 数据库:mysql 程序后台技术框架:ThinkPHP(一个MVC框架) ...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    文件与记录管制程序.doc

    "财 务 "FM "资材课 "WM "工程课 "RD "注塑课 "ID " "业 务 "BM "品管课 "QD "模具课 "MD "喷涂课 "SD " "采 购 "PM "文控中心 "PC "生管课 "PD " " " 5.3.8文件类型代码: "文件类型 "代 码 "文件类型 "代 码 " ...

    connect-4:使用Python和SQL的学校项目

    PO连接4 该项目的某些代码以及整个网站使用荷兰语(提交消息,文档等)。... API文档的过时版本仍在Google Docs上,但是我正在将其更新和更新为api / readme.md。 设置 要设置该项目,您需要安装n

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版

    1.2.3 mkdir(md)——新建目录 40 1.2.4 rmdir(rd)——删除文件夹 41 1.2.5 tree——目录结构 43 1.2.6 type——浏览文本 44 1.2.7 verify——校验 45 1.2.8 verifier——驱动程序检验 46 1.2.9 where——位置 47...

Global site tag (gtag.js) - Google Analytics