`

JavaMD5加密算法

    博客分类:
  • JAVA
阅读更多
package net.com.security;


import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;


public class MD5Test {




public String testMD5(String str){

String result = null;

try {

MessageDigest mdInst = MessageDigest.getInstance("MD5");

byte[] buffer = str.getBytes();

mdInst.update(buffer);

result = byteToHex(mdInst.digest());

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

return result;

}

private String byteToHex(byte[] buffer){

String temp = "";

String hex = "";

for(int i = 0; i if((temp = Integer.toHexString(buffer[i]&0xff)).length() == 1){

hex += "0"+temp;

}else{

hex += temp;

}

}

return hex;

}



public static void main(String[] args){

MD5Test md5Test = new MD5Test();



String str = "123456";

String result = md5Test.testMD5(str);

System.out.println("result="+result);

}



}

在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,他的高24位里面都是随机数字,低8位

才是实际的数据。java.lang.Integer.toHexString() 方法的参数是int(32位)类型,如果输入一个byte(8位)类型的数字,这个

方法会把这个数字的高24为也看作有效位,这就必然导致错误,使用& 0XFF操作,可以把高24位置0以避免这样错误


说明:

MD5算法说明

一、补位

二、补数据长度

三、初始化MD5参数

四、处理位操作函数

五、主要变换过程

六、输出结果

补位:

MD5算法先对输入的数据进行补位,使得数据位长度LEN对512求余的结果是448。即数据扩展至K*512+448位。即K*64+56个字节,K为整数。

具体补位操作:补一个1,然后补0至满足上述要求。

补数据长度:

用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数

据就被填补成长度为512位的倍数。

初始化MD5参数:

四个32位整数 (A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表

示的数字

A=0X01234567

B=0X89abcdef

C=0Xfedcba98

D=0X76543210 处理位操作函数:

X,Y,Z为32位整数。

F(X,Y,Z) = X&Y|NOT(X)&Z

G(X,Y,Z) = X&Z|Y?(Z)

H(X,Y,Z) = X xor Y xor Z

I(X,Y,Z) = Y xor (X|not(Z)) 主要变换过程:

使用常数组T[1 ... 64], T[i]为32位整数用16进制表示,数据用16个32位

的整数数组M[]表示。

具体过程如下: /* 处理数据原文 */

For i = 0 to N/16-1 do /*每一次,把数据原文存放在16个元素的数组X中. */

For j = 0 to 15 do

Set X[j] to M[i*16+j].

end /结束对J的循环 /* Save A as AA, B as BB, C as CC, and D as DD.

*/

AA = A

BB = B

CC = C

DD = D /* 第1轮*/

/* 以 [abcd k s i]表示如下操作

a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */

[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3

22 4]

[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7

22 8]

[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA

11 22 12]

[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15]

[BCDA 15 22 16] /* 第2轮* */

/* 以 [abcd k s i]表示如下操作

a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */

[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA

0 20 20]

[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23]

[BCDA 4 20 24]

[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA

8 20 28]

[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA

12 20 32] /* 第3轮*/

/* 以 [abcd k s i]表示如下操作

a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */

[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35]

[BCDA 14 23 36]

[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA

10 23 40]

[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43]

[BCDA 6 23 44]

[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47]

[BCDA 2 23 48] /* 第4轮*/

/* 以 [abcd k s i]表示如下操作

a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */

[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51]

[BCDA 5 21 52]

[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55]

[BCDA 1 21 56]

[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59]

[BCDA 13 21 60]

[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63]

[BCDA 9 21 64] /* 然后进行如下操作 */

A = A + AA

B = B + BB

C = C + CC

D = D + DD end /* 结束对I的循环*/ 输出结果。    RSA算法非常简单,概述如下:

找两素数p和q

取n=p*q

取t=(p-1)*(q-1)

取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)

取d*e%t==1

这样最终得到三个数: n d e

设消息为数M (M <n)

设c=(M**d)%n就得到了加密后的消息c

设m=(c**e)%n则 m == M,从而完成对c的解密。

注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:

n d两个数构成公钥,可以告诉别人;

n e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解

从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法

求得d。

RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,

最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用

RSA对刚才的加密密钥进行加密。

最后需要说明的是,当前小于1024位的N已经被证明是不安全的

自己使用中不要使用小于1024位的RSA,最好使用2048位的。
分享到:
评论

相关推荐

    javaMD5加密算法

    基于MD5的加密算法,包括如何使用的例子,很好的实例。

    三种语言md5加密算法

    项目中实际运用的md5加密算法,有javamd5加密算法、c++md5加密算法、pbmd5加密算法,并且有使用说明,可以直接使用

    MD5加密算法.java

    MD5加密算法.javaMD5加密算法.java

    java实现MD5加密解密算法

    java实现MD5加密解密算法,java源代码~

    java实现Md5加盐加密算法

    对接接口时用到的一种常用加密算法,常用于验证签名,使用shiro-all-1.4.1.jar,可自行下载

    java实现md5 加密解密

    java实现md5 加密解密(在网络中MD5是著名的不可逆算法,但是如果...则可以通过自己的加密算法对明文进行加密,对加密后的密文与字符串匹配; 匹配成功,表示找到明文;但是此程序的时间耗费较高!仅提供一个解密的方法!)

    javaMD5密码加密,不能解密

    javaMD5加密,通过算法,将密码加密成56位的密文,但不能解密。。。。。。。。。。。。。。。。。。。。。。。。。

    MD5加密+签名算法Sign生成 工具类

    MD5加密+签名算法Sign生成 工具类。 用于调式远程接口或者做用户加密登录等等。 亲自调试过,都是可以用的。 不用自己再自己去写算法轮子! 大家都搬起来!

    MD5加密源码,用java语言编写

    java的MD5加密算法的源码,均生成32位长度的加密后的字符串

    java工具类 MD5加密

    java开发工具类MD5加密算法-静态单例。

    javamd5.jar

    java实现的MD5加密算法class类文件,可与4GL串并改进用户密码加密算法!

    JAVA实现MD5加密

    java实现MD5加密算法。MD5加密算法工具类 */ public class MD5 { private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    MD5java加密算法

    里面详细讲解了如何对Java相关数据进行加密 加密后如何进行判断等

    JavaMd5_java_

    收藏一个Java环境的MD5字符串加密算法类代码,现在分享给大家

Global site tag (gtag.js) - Google Analytics