我有一个perl脚本,它使用Digest :: MD5 md5($ data)来获取16字节摘要(它是不可读的形式 - 二进制),这个摘要用于加密数据。 现在我必须在java中反转上述过程,首先我需要使用MessageDigest.getInstance(" MD5")。摘要($ data)获取16字节摘要并解密消息。
现在我不确定perl Digest :: MD5 md5($ data)和java摘要的输出摘要MessageDigest.getInstance(" MD5")。摘要($ data)是否相同怎么做我验证了这种情况。
答案 0 :(得分:1)
1)从byte to hex
转换Perl md52)将Java md5从字节转换为十六进制(examples here)
3)比较输出
这是MD5的Java代码和十六进制的转换:
import java.security.MessageDigest;
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Start");
String res=MD5("35799510369");
System.out.print("res:"+res);
}
public static String MD5( String source ) {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
byte[] bytes = md.digest( source.getBytes("UTF-8") );
return getString( bytes );
} catch( Exception e ) {
e.printStackTrace();
return null;
}
}//end MD5()
private static String getString( byte[] bytes ) {
StringBuffer sb = new StringBuffer();
for( int i=0; i<bytes.length; i++ )
{
byte b = bytes[ i ];
String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length() == 1)
{
sb.append("0");
}
sb.append( hex );
}
return sb.toString();
}// end getString()
复制并粘贴[{3}}中的previus代码,然后按COMPILE AND EXECUTE;接下来将此输出与this online compiler输出进行比较。
输入= 35799510369
Md5摘要是.S&lt;ë_»X³ëE&amp;â€
摘要的十六进制表示形式为:012e533c9aeb5f96bb58b3eb4526e2ae
RES:012e533c9aeb5f96bb58b3eb4526e2ae
祝你好运