Java 后端MD5加密

Md5Utils

public class Md5Utils {private static final int NUM_3=3;private static final int NUM_4=4;private static final int NUM_16=16;private static final int NUM_63=63;private static final int NUM_64=64;/*** 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的,* 这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多个* Instance间共享**/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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/*** 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中* 被定义到MD5_CTX结构中**/private long[] state = new long[4]; private long[] count = new long[2]; private byte[] buffer = new byte[64]; /*** digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的* 16进制ASCII表示.**/public String digestHexStr;/***  digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.**/private byte[] digest = new byte[16];/*** getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串*  返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.**/public String getMd5ofStr(String inbuf){md5Init();md5Update(inbuf.getBytes(), inbuf.length());md5Final();digestHexStr = "";for (int i = 0; i < NUM_16; i++){digestHexStr += byteHex(digest[i]);}return digestHexStr;}/*** 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数*/public Md5Utils(){md5Init();return;}/*** md5Init是一个初始化函数,初始化核心变量,装入标准的幻数*/private void md5Init(){count[0] = 0L;count[1] = 0L;///* Load magic initialization constants.state[0] = 0x67452301L;state[1] = 0xefcdab89L;state[2] = 0x98badcfeL;state[3] = 0x10325476L;return;}/*** F, G, H ,I 是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是* 简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们* 实现成了private方法,名字保持了原来C中的。**/private long f(long x, long y, long z){return (x & y) | ((~x) & z);}private long g(long x, long y, long z){return (x & z) | (y & (~z));}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));}/***  FF,GG,HH和II将调用F,G,H,I进行近一步变换*  FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.*  Rotation is separate from addition to prevent recomputation.**/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 << s) | ((int) a >>> (32 - 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 << s) | ((int) a >>> (32 - 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 << s) | ((int) a >>> (32 - 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 << s) | ((int) a >>> (32 - s));a += b;return a;}/*** md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个* 函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的**/private void md5Update(byte[] inbuf, int inputLen){int i, index, partLen;byte[] block = new byte[64];index = (int) (count[0] >>> 3) & 0x3F;// /* Update number of bits */if ((count[0] += (inputLen << NUM_3)) < (inputLen << NUM_3)){count[1]++;}count[1] += (inputLen >>> 29);partLen = 64 - index;// Transform as many times as possible.if (inputLen >= partLen){md5Memcpy(buffer, inbuf, index, 0, partLen);md5Transform(buffer);for (i = partLen; i + NUM_63 < inputLen; i += NUM_64){md5Memcpy(block, inbuf, 0, i, 64);md5Transform(block);}index = 0;}else{i = 0;}md5Memcpy(buffer, inbuf, index, i, inputLen - i);}/*** md5Final整理和填写输出结果**/private void md5Final(){byte[] bits = new byte[8];int index, padLen;///* Save number of bits */enCode(bits, count, 8);///* Pad out to 56 mod 64.index = (int) (count[0] >>> 3) & 0x3f;padLen = (index < 56) ? (56 - index) : (120 - index);md5Update(PADDING, padLen);///* Append length (before padding) */md5Update(bits, 8);///* Store state in digest */enCode(digest, state, 16);}/* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的字节拷贝到output的outpos位置开始*/private void md5Memcpy(byte[] output, byte[] input,int outpos, int inpos, int len){int i;for (i = 0; i < len; i++){output[outpos + i] = input[inpos + i];}}/*** md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节**/private void md5Transform(byte block[]){long a = state[0], b = state[1], c = state[2], d = state[3];long[] x = new long[16];deCode(x, block, 64);/* Round 1 */a = ff(a, b, c, d, x[0],  S11, 0xd76aa478L); d = ff(d, a, b, c, x[1],  S12, 0xe8c7b756L); c = ff(c, d, a, b, x[2],  S13, 0x242070dbL); b = ff(b, c, d, a, x[3],  S14, 0xc1bdceeeL); a = ff(a, b, c, d, x[4],  S11, 0xf57c0fafL); d = ff(d, a, b, c, x[5],  S12, 0x4787c62aL); c = ff(c, d, a, b, x[6],  S13, 0xa8304613L); b = ff(b, c, d, a, x[7],  S14, 0xfd469501L); a = ff(a, b, c, d, x[8],  S11, 0x698098d8L); d = ff(d, a, b, c, x[9],  S12, 0x8b44f7afL); c = ff(c, d, a, b, x[10], S13, 0xffff5bb1L); b = ff(b, c, d, a, x[11], S14, 0x895cd7beL); a = ff(a, b, c, d, x[12], S11, 0x6b901122L); d = ff(d, a, b, c, x[13], S12, 0xfd987193L); c = ff(c, d, a, b, x[14], S13, 0xa679438eL); b = ff(b, c, d, a, x[15], S14, 0x49b40821L); /* Round 2 */a = gg(a, b, c, d, x[1],  S21, 0xf61e2562L); d = gg(d, a, b, c, x[6],  S22, 0xc040b340L); c = gg(c, d, a, b, x[11], S23, 0x265e5a51L); b = gg(b, c, d, a, x[0],  S24, 0xe9b6c7aaL); a = gg(a, b, c, d, x[5],  S21, 0xd62f105dL); d = gg(d, a, b, c, x[10], S22, 0x2441453L); c = gg(c, d, a, b, x[15], S23, 0xd8a1e681L); b = gg(b, c, d, a, x[4],  S24, 0xe7d3fbc8L); a = gg(a, b, c, d, x[9],  S21, 0x21e1cde6L); d = gg(d, a, b, c, x[14], S22, 0xc33707d6L); c = gg(c, d, a, b, x[3],  S23, 0xf4d50d87L); b = gg(b, c, d, a, x[8],  S24, 0x455a14edL);a = gg(a, b, c, d, x[13], S21, 0xa9e3e905L); d = gg(d, a, b, c, x[2],  S22, 0xfcefa3f8L); c = gg(c, d, a, b, x[7],  S23, 0x676f02d9L); b = gg(b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* Round 3 */a = hh(a, b, c, d, x[5],  S31, 0xfffa3942L); d = hh(d, a, b, c, x[8],  S32, 0x8771f681L); c = hh(c, d, a, b, x[11], S33, 0x6d9d6122L); b = hh(b, c, d, a, x[14], S34, 0xfde5380cL); a = hh(a, b, c, d, x[1],  S31, 0xa4beea44L); d = hh(d, a, b, c, x[4],  S32, 0x4bdecfa9L); c = hh(c, d, a, b, x[7],  S33, 0xf6bb4b60L); b = hh(b, c, d, a, x[10], S34, 0xbebfbc70L); a = hh(a, b, c, d, x[13], S31, 0x289b7ec6L); d = hh(d, a, b, c, x[0],  S32, 0xeaa127faL); c = hh(c, d, a, b, x[3],  S33, 0xd4ef3085L); b = hh(b, c, d, a, x[6],  S34, 0x4881d05L); a = hh(a, b, c, d, x[9],  S31, 0xd9d4d039L); d = hh(d, a, b, c, x[12], S32, 0xe6db99e5L); c = hh(c, d, a, b, x[15], S33, 0x1fa27cf8L); b = hh(b, c, d, a, x[2],  S34, 0xc4ac5665L); /* Round 4 */a = ii(a, b, c, d, x[0],  S41, 0xf4292244L); d = ii(d, a, b, c, x[7],  S42, 0x432aff97L);c = ii(c, d, a, b, x[14], S43, 0xab9423a7L); b = ii(b, c, d, a, x[5],  S44, 0xfc93a039L); a = ii(a, b, c, d, x[12], S41, 0x655b59c3L); d = ii(d, a, b, c, x[3],  S42, 0x8f0ccc92L); c = ii(c, d, a, b, x[10], S43, 0xffeff47dL); b = ii(b, c, d, a, x[1],  S44, 0x85845dd1L); a = ii(a, b, c, d, x[8],  S41, 0x6fa87e4fL); d = ii(d, a, b, c, x[15], S42, 0xfe2ce6e0L); c = ii(c, d, a, b, x[6],  S43, 0xa3014314L); b = ii(b, c, d, a, x[13], S44, 0x4e0811a1L); a = ii(a, b, c, d, x[4],  S41, 0xf7537e82L); d = ii(d, a, b, c, x[11], S42, 0xbd3af235L); c = ii(c, d, a, b, x[2],  S43, 0x2ad7d2bbL); b = ii(b, c, d, a, x[9],  S44, 0xeb86d391L); state[0] += a;state[1] += b;state[2] += c;state[3] += d;}/*** Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的,* 只拆低32bit,以适应原始C实现的用途**/private void enCode(byte[] output, long[] input, int len){int i, j;for (i = 0, j = 0; j < len; i++, j += NUM_4){output[j] = (byte) (input[i] & 0xffL);output[j + 1] = (byte) ((input[i] >>> 8) & 0xffL);output[j + 2] = (byte) ((input[i] >>> 16) & 0xffL);output[j + 3] = (byte) ((input[i] >>> 24) & 0xffL);}}/*** Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的,* 只合成低32bit,高32bit清零,以适应原始C实现的用途**/private void deCode(long[] output, byte[] input, int len){int i, j;for (i = 0, j = 0; j < len; i++, j += NUM_4){output[i] = b2iu(input[j]) |(b2iu(input[j + 1]) << 8) |(b2iu(input[j + 2]) << 16) |(b2iu(input[j + 3]) << 24);}return;}/*** b2iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算**/public static long b2iu(byte b){return b < 0 ? b & 0x7F + 128 : b;}/*** byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示,* 因为java中的byte的toString无法实现这一点,我们又没有C语言中的* sprintf(outbuf,"%02X",ib)**/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) & 0X0F];ob[1] = diGit[ib & 0X0F];String s = new String(ob);return s;}
}

调用:

Md5Utils md5Util=new Md5Utils();
md5Util.getMd5ofStr(value);//value要加密的字符

Java 后端MD5加密相关推荐

  1. Java实现MD5加密解密类

    Java实现MD5加密以及解密类,附带测试类,具体见代码. MD5加密解密类--MyMD5Util,代码如下: [java] view plaincopy package com.zyg.securi ...

  2. Java实现MD5加密及解密的代码实例分享

    如果对安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享: 基础:M ...

  3. md5视频加密 java代码,Java实现MD5加密及解密的代码实例分享

    基础:MessageDigest类的使用 其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣: /** * 对字符串md5加密 * * @param st ...

  4. Java实现MD5加密以及解密

    MD5的介绍 从本质上来说,MD5并不是一种加密算法,其全称是Message Digest Algorithm MD5(中文名:信息摘要算法第五版),为计算机安全领域广泛使用的一种散列函数,主要用于确 ...

  5. Java实现MD5加密和文件校验

    MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...

  6. java使用MD5加密

    一.主要使用MessageDigest类(java.security包下) 1.首先,先看下官方文档 此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法. ...

  7. java中md5加密和解密_如何在java中实现md5加密和解密

    如何在java中实现md5加密和解密 关注:273  答案:1  mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...

  8. md5 ios java代码_IOS端與Java端MD5加密方法

    關於NSString的MD5加密,這不難,在網上可以搜到很多算法,主要是跟后台的統一會出問題,對同一段字符串,ios和java加密后的結果可能不一樣,很坑爹.現在貼一下ios端和后台java的代碼. ...

  9. JAVA中MD5加密实现

    MD5加密实现  结 package com.pb;import java.io.UnsupportedEncodingException; import java.security.MessageD ...

  10. IOS端与Java端MD5加密方法

    关于NSString的MD5加密,这不难,在网上可以搜到很多算法,主要是跟后台的统一会出问题,对同一段字符串,ios和java加密后的结果可能不一样.现在贴一下ios端和后台java的代码. java ...

最新文章

  1. 模板 - 最小斯坦纳树
  2. 《C++应用程序性能优化::第五章动态内存管理》学习和理解
  3. rsynv+inotify触发试实时同步
  4. [C#参考]锁定lock
  5. 两台笔记本通过无线连接共享上网
  6. egg风格 什么意思_小小的“egg”,有你想象不到的秘密……
  7. 开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !...
  8. 如何查看linux CPU总占用率?
  9. 关于stack 和heap
  10. Linux如何修改makefile文件,linux中Makefile的使用
  11. word中的特殊文本符号
  12. 微信小程序视频自定义进度条
  13. 获得百词斩实体书的单词次序(咸鱼的编程初体验!)
  14. 双引号后面要加句号吗_省略号后面可以加句号吗
  15. 【报告分享】抖店百宝书-抖音电商(附下载)
  16. 到全国各省市关于公务员考试的信息
  17. 金蝶云星空和钉钉接口打通对接实战
  18. USB设备仿真框架设计指南——11.在托管代码中开发DSF应用程序
  19. HIVE 计算指定日期本周的第一天和最后一天
  20. 七夕节·烈火英雄·观后感

热门文章

  1. 【TSP】基于matlab自重启伪遗传改良算法求解旅行商问题【含Matlab源码 1510期】
  2. 【车间调度】基于matlab鸟群算法求解车间调度问题【含Matlab源码 1395期】
  3. 【车牌识别】基于matlab投影模板匹配车牌识别【含Matlab源码 1359期】
  4. 【数学建模】基于matlab无线可充电传感器网络充电路线规划【含Matlab源码 750期】
  5. 【细胞分割】基于matlab GUI阙值+边缘+形态学+种子点图像分割【含Matlab源码 615期】
  6. 数学中有关c语言的知识点总结,七年级数学基本函数的基本知识点归纳
  7. python itchat模块登录失败_itchat模块的不明错误
  8. vue-cli mock
  9. Java 传统IO概要
  10. 生产环境sql语句调优实战第三篇