Java sha256与Swift sha256不匹配

Java sha256与Swift sha256不匹配,java,swift,cryptography,sha256,Java,Swift,Cryptography,Sha256,在Java和Swift中计算sha256时,它不匹配 爪哇: 结果:[44112、-31、43122、6、70、-7、34121、-12、39、-57、-77、-114115] 斯威夫特: let secretKeyBytes = [UInt8](secretKey.utf8) var digest = SHA2(variant: SHA2.Variant.sha256) try digest.update(withBytes: secretKeyBytes) let keyDigest =

在Java和Swift中计算sha256时,它不匹配

爪哇:

结果:
[44112、-31、43122、6、70、-7、34121、-12、39、-57、-77、-114115]

斯威夫特:

let secretKeyBytes = [UInt8](secretKey.utf8)

var digest = SHA2(variant: SHA2.Variant.sha256)
try digest.update(withBytes: secretKeyBytes)
let keyDigest = try digest.finish()

let keyBytes = Array(keyDigest[0...15])
结果:
[44112225,431226,70249,34121244,39199179142115]


它以相同的值开始,但随后开始不同,因此它们只能表示-128到127的值,当它试图表示溢出到-31的225(第三个字节)时也是如此。这两个字节的实际二进制表示形式将是相同的
1110 0001

,因此它们只能表示-128到127的值,当它试图表示溢出到-31的225(第三个字节)时也是如此。两个字节的实际二进制表示形式将是相同的
1110 0001

您的Java代码溢出并产生负值。可能重复的Java代码溢出并产生负值。可能重复的想法如何在不修改Java代码的情况下解决此问题?我现在不能改变这一点。试图将Swift中的
UInt8
转换为
Int8
,但CryptoSwift库不接受该转换。@JakubGruber,您可以使用
Int8(位模式:)
将生成的
keyBytes
映射为
[Int8]
,然后将其保存在
UInt8
中,这两个散列是相同的,因此数组的文本表示不同,但数组的内容(二进制值,由字节值表示)是相同的。只要确保直接比较二进制值,或者只要比较字节的相同表示形式,就应该是好的。知道如何在不修改Java代码的情况下解决这个问题吗?我现在不能改变这一点。试图将Swift中的
UInt8
转换为
Int8
,但CryptoSwift库不接受该转换。@JakubGruber,您可以使用
Int8(位模式:)
将生成的
keyBytes
映射为
[Int8]
,然后将其保存在
UInt8
中,这两个散列是相同的,因此数组的文本表示不同,但数组的内容(二进制值,由字节值表示)是相同的。只要确保直接比较二进制值,或者只要比较字节的相同表示形式,就应该是好的。
let secretKeyBytes = [UInt8](secretKey.utf8)

var digest = SHA2(variant: SHA2.Variant.sha256)
try digest.update(withBytes: secretKeyBytes)
let keyDigest = try digest.finish()

let keyBytes = Array(keyDigest[0...15])