将java转换为perl(md5)

时间:2013-02-26 02:59:55

标签: md5



我正在尝试将java转换为perl(md5)程序。 如何执行以下两个程序相同的输出MD5总和。

爪哇

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源代码。

1 个答案:

答案 0 :(得分: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";

当我运行这两个命令时,我会显示相同的摘要值。