package cn.mldn.util.enctype;
public class MD5Code {
/*
* 下面这些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];// state (ABCD)
private long[] count = new long[2];// number of bits, modulo 2^64 (lsb
// first)
private byte[] buffer = new byte[64]; // input buffer
/*
* 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 < 16; i++) {
digestHexStr += byteHEX(digest[i]);
}
return digestHexStr;
}
// 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
public MD5Code() {
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 << 3)) < (inputLen << 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 + 63 < inputLen; i += 64) {
md5Memcpy(block, inbuf, 0, i, 64);
md5Transform(block);
}
index = 0;
} else
i = 0;
// /* Buffer remaining input */
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); /* 1 */
d = FF(d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
c = FF(c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
b = FF(b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
a = FF(a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
d = FF(d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
c = FF(c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
b = FF(b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
a = FF(a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
d = FF(d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
c = FF(c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
b = FF(b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
a = FF(a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
d = FF(d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
c = FF(c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
b = FF(b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */
/* Round 2 */
a = GG(a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
d = GG(d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
c = GG(c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
b = GG(b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
a = GG(a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
d = GG(d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
c = GG(c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
b = GG(b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
a = GG(a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
d = GG(d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
c = GG(c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
b = GG(b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
a = GG(a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
d = GG(d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
c = GG(c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
b = GG(b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */
/* Round 3
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Spring Boot 用法及其与各种框架、组件的结合使用 Spring Boot 是一个用于简化 Spring 应用开发的框架,提供了自动配置、独立运行、嵌入式服务器和生产级别的准备特性,使开发和部署变得更加简单和高效。以下是 Spring Boot 的一些主要用法及其与各种框架和组件的结合。 1. 启动类和注解 Spring Boot 应用通常有一个主要的启动类,该类使用 `@SpringBootApplication` 注解。这一注解结合了 `@Configuration`、`@EnableAutoConfiguration` 和 `@ComponentScan` 的功能,标识该类为配置类,并启用自动配置和组件扫描。 2. 自动配置 自动配置是 Spring Boot 的核心特性之一。它会根据类路径中的库和应用中的配置文件(如 `application.properties` 或 `application.yml`)自动配置 Spring 应用的许多方面。例如,添加 H2 数据库依赖后,Spring Boot 会自动配置 H2 数据源。
资源推荐
资源详情
资源评论
收起资源包目录
springboot用法和与各种框架、组件等结合使用,包括springboot的注解分析、路径分析、取得内置对象、项目打包、配置 (1206个子文件)
ShiroConfig.class 8KB
MD5Code.class 8KB
UploadController.class 5KB
MemberRealm.class 4KB
RedisCache.class 4KB
RedisTwoConfig.class 3KB
MemberController.class 3KB
MessageController.class 3KB
MemberController.class 3KB
RedisSessionDAO.class 3KB
HelloController.class 2KB
MyInterceptor.class 2KB
TestMemberController.class 2KB
Swagger2Config.class 2KB
MemberController.class 2KB
MemberConsumerController.class 2KB
DruidConfig.class 2KB
DruidConfig.class 2KB
ConsumerConfig.class 2KB
ProducerConfig.class 2KB
RedisCache$4.class 2KB
RedisObjectSerializer.class 2KB
RedisCache$3.class 2KB
Member.class 2KB
TestRedisTwo.class 2KB
TestRedis.class 2KB
RedisCacheManager.class 2KB
TestMemberRestful.class 2KB
RedisConfig.class 2KB
ErrorPageConfig$1.class 2KB
MemberServiceImpl.class 2KB
Member.class 2KB
Member.class 2KB
RedisObjectSerializer.class 2KB
ServiceAspect.class 2KB
HttpConnectorConfig$1.class 2KB
HttpConnectorConfig.class 2KB
RedisConfig.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
AbstractBaseController.class 2KB
GlobalExceptionHandler.class 2KB
GlobalExceptionHandler.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
Member.class 2KB
MyScheduler.class 2KB
MessageConsumerService.class 1KB
TestDeptService.class 1KB
TestMail.class 1KB
RedisCache$2.class 1KB
GlobalExceptionHandler$1ErrorInfo.class 1KB
GlobalExceptionHandler$1ErrorInfo.class 1KB
MemberController.class 1KB
MemberController.class 1KB
PasswordUtil.class 1KB
RedisCache$1.class 1KB
TestMemberService.class 1KB
MyWebApplicationConfig.class 1KB
StartSpringBootMain.class 1KB
TestActiveMQ.class 1KB
TestRabbitMQ.class 1KB
TestMessageService.class 1KB
CustomerCredentialsMatcher.class 1KB
TestLogger.class 1KB
MemberController.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Dept.class 1KB
Member.class 1KB
MemberController.class 1KB
MemberServiceProviderStartSpringBootMain.class 1KB
MessageController.class 1KB
MessageProducerServiceImpl.class 1KB
TestDataSource.class 1KB
ShiroWEBStartSpringBootMain.class 1KB
MessageController.class 1024B
StartSpringBootMain.class 1017B
StartSpringBootMain.class 1017B
StartSpringBootMain.class 1017B
共 1206 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13
资源评论
编程资源宝库
- 粉丝: 2935
- 资源: 152
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 卡尔曼滤波(Kalman Filter)是一种有效的递归滤波器,用于线性动态系统的状态估计 它通过考虑先前的估计和当前的观测来提
- 卡尔曼滤波(Kalman Filter)是一种有效的递归滤波器,用于线性动态系统的状态估计 它通过考虑先前的估计和当前的观测来提
- 卡尔曼滤波(Kalman Filter)是一种有效的递归滤波器,用于线性动态系统的状态估计 它通过考虑先前的估计和当前的观测来提
- python 卡尔曼滤波算法
- python 卡尔曼滤波算法
- python 卡尔曼滤波算法
- MFC工控项目实例之一主菜单制作
- 基于HTML的旅游网页制作源码设计.zip
- 基于HTML的旅游网页制作源码设计.zip
- 大数据揭秘京沪程序员的爱情代码 WIFIPIX(PDF格式).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功