输出perl摘要:: MD5 md5($ data)和java MessageDigest.getInstance(" MD5")。摘要($ data)是不同的

时间:2015-10-14 07:06:07

标签: java perl security encryption

我有一个perl脚本,它使用Digest :: MD5 md5($ data)来获取16字节摘要(它是不可读的形式 - 二进制),这个摘要用于加密数据。 现在我必须在java中反转上述过程,首先我需要使用MessageDigest.getInstance(" MD5")。摘要($ data)获取16字节摘要并解密消息。

  

现在我不确定perl Digest :: MD5 md5($ data)和java摘要的输出摘要MessageDigest.getInstance(" MD5")。摘要($ data)是否相同怎么做我验证了这种情况。

1 个答案:

答案 0 :(得分:1)

1)从byte to hex

转换Perl md5

2)将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

  • Perl输出:

Md5摘要是.S&lt;ë_»X³ëE&amp;â€

摘要的十六进制表示形式为:012e533c9aeb5f96bb58b3eb4526e2ae

  • Java输出:

RES:012e533c9aeb5f96bb58b3eb4526e2ae

祝你好运