sha1java vs Python不是sam

2024-09-30 06:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要把一段python翻译成Java,但是当我做一个SHA散列时,我得到的结果与python不同,有一个字符串:

$&).6CXzPHw=2N_+isZK2908069825

//Java代码

^{2}$

//Python代码

print(sha1(prefix + str(num4).encode('ascii')).digest())

可能是字节类型的不同?? 有什么想法吗? 谢谢你


Tags: 字符串代码类型prefix字节asciijavasha1
2条回答

Erwin Bolwidt在comment中回答了这个问题:

Remove the print statement. Calling digest is destructive and you call it twice - the value that you return from the method is incorrect

除此之外:

以上所有这些都意味着你的代码应该是:

private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
    return MessageDigest.getInstance("SHA-1").digest(input);
}

测试

^{pr2}$

输出

[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]

它与Python output相同,但打印为有符号与无符号字节:

[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]

Java密码体系结构——表示算法类型的对象,如MessageDigest,以及Cipher和{}的对象都实现了一个方案,使得对大量数据执行逐段操作成为可能。它们通过使用方法来更新内部状态和最终操作,例如sign/verify或-for MessageDigest-一个名为digest的单个操作,这些操作具有各种重载。在

这些算法的共同点是,当调用“final”操作时,对象的状态是在初始化后直接重置为状态。此状态通常在调用init方法后达到。在

不过,像SHA-1这样的散列算法不需要显式初始化,所以它们在实例化之后直接返回到状态:它们还没有处理任何数据的状态。这样就可以重用哈希算法来散列另一个值。这比实例化一个新对象要稍微有效一些。在

JCA developers guide

After the message digest has been calculated, the message digest object is automatically reset and ready to receive new data and calculate its digest. All former state (i.e., the data supplied to update calls) is lost.

因此,在调用digest()之后,对象将重置为尚未接收到任何数据的状态。因此,第二个调用返回空八位字节字符串/字节数组的哈希值。在


引用from Wikipedia

SHA1("")
gives hexadecimal: da39a3ee5e6b4b0d3255bfef95601890afd80709

它与有符号字节[-38, 57, -93, -18, 94, 107, 75, 13, 50, 85, -65, -17, -107, 96, 24, -112, -81, -40, 7, 9]:在注释中输入的值。在


打印的正确哈希确实是

^{pr2}$

大写的十六进制或

[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]

在Python中是一个无符号字节数组。注意,Java使用的是有符号字节,而不是有符号字节,因此这等于

[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]

要计算这个值,只需调用MessageDigest#digest(byte[] input): byte[]就足够了,在您的例子中是byte[] digest = msdDigest.digest(input),之后您可以先打印出digest,然后返回保存字节数组的变量。在


注意,哈希仍然不应该在多个线程上并发使用;一次只能计算一个哈希;这些类不是线程安全的。在

相关问题 更多 >

    热门问题