为了账号安全,请及时绑定邮箱和手机立即绑定

Perl SHA-256 算法生成的输出与等效的 Java 不同

Perl SHA-256 算法生成的输出与等效的 Java 不同

猛跑小猪 2021-07-13 13:10:52
我有以下 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 中使用相同的数组,则不会得到相同的结果。
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

两个问题:

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


查看完整回答
反对 回复 2021-07-14
  • 1 回答
  • 0 关注
  • 224 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信