我正在尝试将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源代码。
答案 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";
当我运行这两个命令时,我会显示相同的摘要值。