Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SHA1 Java和Python是不一样的_Java_Python_Cryptography_Sha1 - Fatal编程技术网

SHA1 Java和Python是不一样的

SHA1 Java和Python是不一样的,java,python,cryptography,sha1,Java,Python,Cryptography,Sha1,我需要将一段python翻译成Java,但是当我进行SHA哈希时,我得到的结果与python不同,有一个字符串: $&).6CXzPHw=2N_+isZK2908069825 //Java代码 private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException { MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");

我需要将一段python翻译成Java,但是当我进行SHA哈希时,我得到的结果与python不同,有一个字符串:

$&).6CXzPHw=2N_+isZK2908069825
//Java代码

private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
    MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
    msdDigest.reset();
    msdDigest.update(input, 0, input.length);
    System.out.println(DatatypeConverter.printHexBinary((msdDigest.digest())));
    return msdDigest.digest();
}
//Python代码

print(sha1(prefix + str(num4).encode('ascii')).digest())
可能是字节类型之间的差异?? 有什么想法吗?
谢谢

问题由埃尔文·博维特在a中回答:

删除
print
语句。
调用
digest
是破坏性的,您调用它两次-从方法返回的值不正确

除此之外:

  • 没有必要去拜访一位新的律师

  • 打电话代替

  • 调用而不是+

综合以上所有内容,您的代码应该是:

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

输出

[-96、-1、78、94、-67、-96、-113、12、-31、93、-10、-55、-5、72、-2、-57、52、-84、-117、40]
除了打印为有符号字节与无符号字节外,与相同:

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

Java加密体系结构表示算法类型的对象,如
MessageDigest
,以及
Cipher
Mac
都实现了一种方案,使得对大量数据执行逐段操作成为可能。他们通过使用更新内部状态和最终操作(如签名/验证)的方法来实现这一点,或者对于
MessageDigest
,使用一个名为
digest
的单一操作,使用各种重载

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

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

从:

计算消息摘要后,消息摘要对象将自动重置,并准备接收新数据并计算其摘要。所有以前的状态(即,提供给更新调用的数据)都将丢失

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


引述如下:

它与有符号字节相同,即您在注释中输入的值


打印的正确哈希确实是

 A0FF4E5EBDA08F0CE15DF6C9FB48FEC734AC8B28
大写十六进制或

[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=msdigest.digest(input)
,然后可以首先打印出
digest
,然后返回包含字节数组的变量



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

您使用的是什么代码?你得到了什么结果?你期望得到什么结果?David说的,让我们看看Python和Java代码,输入和输出。对不起,我现在把代码放在问题中,前缀是什么?删除print语句。调用摘要是破坏性的,您需要调用它两次-您从方法返回的值是不正确的,因为我不同意Erwin Bolwidt或Andreas的措辞。
MessageDigest
对象的(状态)未被破坏,它被重置为已知的有效状态。
[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]
[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]