2013-02-26 46 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"; 

當我運行這兩個命令,我得到顯示出相同的摘要值。