java - Perl SHA-256 算法生成的输出不同于等效的 Java
问题描述
我有以下 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 相同的输出吗?
解决方案
两个问题:
Java 版本使用字节,Perl 版本使用数字字符串。使用pack将字符串转换为其等效的字节。
在 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";
推荐阅读
- nginx - 带有静态 index.html 和反向代理的 Nginx
- python - 使用列表的算术运算
- javascript - 在 JavaScript 脚本标签中使用 jinja2 (with flask) 来渲染数据
- c++ - 分配指向成员函数的指针
- sql - SQL Count 基于另一个表中的值
- r - 如何将列与 R 中的年份相关联,并基于此将其转换为长格式?
- c++ - I keep getting the error invalid use of incomplete type 'struct familyFinace' how do I fix this?
- python - 在 Python 中实例化一个类
- mysql - 如何从 MySQL 表中的子查询更新目标表
- google-bigquery - ST_INTERSECTS 问题 BigQuery Waze