【问题标题】:Perl SHA-256 algorithm generates output different from the equivalent JavaPerl SHA-256 算法生成与等效 Java 不同的输出
【发布时间】:2018-08-13 19:30:45
【问题描述】:

我有以下 Java 代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class MyClass {

    public static void main(String args[]) {

        byte[] salt = {
             84,  65,  -51,  83,   -4,  -17,  -32,  61,
            -26,  33, -106, -81,  -14,   70,  -30,  59,
             41, -19,   -1,  19, -104, -100,  -31,  31,
             57,  -6, -115, -99,    0,   38, -123, -11
        };

        byte[] password = { 100, 112, 107, 57, 52, 110, 50 };

        try {

            MessageDigest messageDigest;

            messageDigest = MessageDigest.getInstance("SHA-256");

            messageDigest.reset();
            messageDigest.update(salt);

            byte[] hash = messageDigest.digest(password);

            for (int i = 1; i < 1000; i++)
            {
                messageDigest.reset();
                hash = messageDigest.digest(hash);
            }

            StringBuffer stringBuffer = new StringBuffer(hash.length * 2);

            for (int i = 0; i < hash.length; i++)
            {
                stringBuffer.append(Character.forDigit(hash[i] >> 4 & 0xF, 16));
                stringBuffer.append(Character.forDigit(hash[i] & 0xF, 16));
            }

            System.out.println("HashArray: " + Arrays.toString(hash));
            System.out.println("HashString: " + stringBuffer.toString());
        }
        catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
        }
    }
}

输出是

HashArray: [-127, -38, -46, -2, 51, -2, -83, -42, 3, 83, -78, -72, -115, -28, 108, 58, -76, -35, -13, 33, 63, -96, 104, 101, -76, 23, 102, -28, -60, 4, 85, 82]

HashString: 81dad2fe33feadd60353b2b88de46c3ab4ddf3213fa06865b41766e4c4045552

我试图将 Java 代码翻译成 Perl,但我有一个理解问题。在 Java 中,我使用两个数组来生成哈希。如果我在 Perl 中使用相同的数组,我不会得到相同的结果。

这是我的 Perl 代码:

use strict;
use warnings;

use Digest::SHA 'sha256';

my @salt = (
     "84",  "65",  -"51",  "83",   "-4",  "-17",  "-32",  "61",
    "-26",  "33", "-106", "-81",  "-14",   "70",  "-30",  "59",
     "41", "-19",   "-1",  "19", "-104", "-100",  "-31",  "31",
     "57",  "-6", "-115", "-99",    "0",   "38", "-123", "-11"
);

my @password = ( "100", "112", "107", "57", "52", "110", "50" );

my $alg = 256;
my $sha = Digest::SHA->new($alg);

$sha->add(@salt);
$sha->add(@password);

for ( my $i = 1; $i < 1000; $i++ ) {
    $sha->add(@password)
}

my $output = $sha->hexdigest;
print "\nHash: $output\n";

输出是

Hash: 3883ae8f7438cc7e8fac86d25aa5789c4434294a70ea13d5e8f547fc7a8e45c2

谁能解释如何让 Perl 代码产生与 Java 相同的输出?

【问题讨论】:

  • -"51""-51" 类似吗?
  • 我不知道 perl 但盐的第三个元素的减号不在引号之间
  • 您正在以不同的方式散列完全不同的值(字节与字符串)。当然,两者会有所不同。
  • 如果你从数字中删除所有引号,它会得到相同的结果。
  • @RobAu "-51" 是正确的

标签: java perl sha256


【解决方案1】:

两个问题:

  1. Java 版本使用字节,Perl 版本使用数字字符串。使用pack 将字符串转换为其等效字节。

  2. 在 Java 版本中,您将散列应用于到目前为止计算的散列,在 Perl 代码中,您只是一次又一次地散列相同的值。

 

#!/usr/bin/perl
use warnings;
use strict;

use Digest::SHA 'sha256';

my @salt = (84, 65, -51, 83, -4, -17, -32, 61, -26, 33, -106, -81,
            -14, 70, -30, 59, 41, -19, -1, 19, -104, -100, -31, 31,
            57, -6, -115, -99, 0, 38, -123, -11);

my @password = (100, 112, 107, 57, 52, 110, 50);

my $alg = 256;
my $sha = Digest::SHA->new($alg);

$sha->add(pack 'c*', @salt);
$sha->add(pack 'c*', @password);

$sha->add($sha->digest) for 1 .. 999;

my $output = $sha->hexdigest;
print "\nHash: $output\n";

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2012-07-07
    • 2020-11-15
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多