0



Java を perl (md5) プログラムに変換しようとしています。次の 2 つのプログラムで同じ出力 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() ); 
   } 
} 

パール

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()には、数値の 2 の補数バイナリ表現を含むバイト配列が必要です。符号の大きさのコンストラクターを使用する必要があります。

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では、次のように 16 進値の文字列表現が必要です。

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

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

これら 2 つのコマンドを実行すると、同じダイジェスト値が表示されます。

于 2013-02-26T04:06:12.923 に答える