这段Md5是怎么加密的?高分

来源:百度知道 编辑:UC知道 时间:2024/05/22 19:45:32
package com.lenovo.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.log4j.Logger;

public class MD5
{
public static Logger log = Logger.getLogger(MD5.class);
private static final char[] ENCODE_TABLE = { '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

public static final String convert(String s)
{
MessageDigest alg;
try
{
alg = MessageDigest.getInstance("MD5");
alg.update(s.getBytes());
byte[] digesta = alg.digest();
return toHexString(digesta);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}

public static String toHexString(

这里加密
result.append(ENCODE_TABLE[(c >> 4 & 0xF)]);
result.append(ENCODE_TABLE[(c & 0xF)]);

先右移4位,再和0xF(换成二进制)按位与,最后的值取表中的字母。再用原始值反复一次凑成8位。一直循环完整个字符串。

这个程序可以运行吗?

按你举例的程序,它的思想就是把8位的值变成两个4位的.是这样的:
1.先用取1的二进制码,比如是00000001(具体多少我不查了,没关系吧?)
2.右移4位变成00010000.
3.和0xF的二进制按位与,比如是00001111.结果是00010000。后4位不变,前4位置0。.取出其中的4位来用table里面的字母来取代。比如前面低4位的都是0000,高4位都是1111,取的是高4位的0000,变成10进制是0,取table〔0〕。
5.不移位,直接用000000001与00001111按位与,得00000001,取高4位0001,变成10进制是1,取table[1].
6.result就成了12.
7另外举一个,比如11110001,结果就是1F.

算法

alg = MessageDigest.getInstance("MD5");//得到MD5算法的实现器
alg.update(s.getBytes());//用这个实现器处理一个byte树组,这个数组是s的unidode编码数组
byte[] digesta = alg.digest();//得到处理结果的数组

toHexString(digesta);//把得到的数组转为16位字符串返回