2013-02-26 50 views
0



我想转换java到perl(md5)程序。 我怎样才能做到以下两个程序相同的输出MD5总和。转换java到perl(md5)

的Java

import java.security.MessageDigest; 
import java.math.BigInteger; 

public class Hash 
{ 
    public static void main(String[] args) throws Exception 
    { 
     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     String  plain = "abcd1234"; 
     BigInteger digest = new BigInteger(md5.digest(plain.getBytes("UTF-8"))); 
     System.out.println(digest.abs()); 
    } 
} 

的Perl

use Digest::MD5 'md5_hex'; 
use Math::BigInt; 

my $plain = "abcd1234"; 
my $digest = Math::BigInt::->from_hex(md5_hex $plain); 
print $digest, "\n"; 

我想,

的Java:

BigInteger digest = new BigInteger(md5.digest(plain.getBytes("UTF-8"))); 

的Perl:

my $digest = Math::BigInt::->from_hex(md5_hex $plain); 

这里是不同的输出MD5总和。 我想编辑perl源文件。

回答

0

您的BigInteger()调用需要一个包含数字的二进制补码二进制表示的字节数组。您需要使用的符号 - 幅度构造:

public BigInteger(int signum, byte[] magnitude) 

所以,你的Java代码应该是:

import java.security.MessageDigest; 
import java.math.BigInteger; 

public class Hash 
{ 
    public static void main(String[] args) throws Exception 
    { 
     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     String plain = "abcd1234"; 
     BigInteger digest = new BigInteger(1, md5.digest(plain.getBytes("UTF-8"))); 
     System.out.println(digest.abs()); 
    } 
} 

你的Perl代码也不太工作对我来说,无论是。我的Math::BigInt版本需要的十六进制值的字符串表示,像这样:

use Digest::MD5 'md5_hex'; 
use Math::BigInt; 

my $plain = "abcd1234"; 
my $digest = Math::BigInt::->from_hex('0x' . md5_hex($plain)); 
print $digest, "\n"; 

当我运行这两个命令,我得到显示出相同的摘要值。