0



我正在尝试将 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"; 

我认为,

爪哇:

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

珀尔:

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

这是不同的输出 MD5 和。我想编辑 perl 源代码。

4

1 回答 1

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";

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

于 2013-02-26T04:06:12.923 回答