2017-10-09 5 views
0

JavaとSwiftでsha256を計算すると、一致しません。Java sha256がSwiftと一致しませんsha256

のJava:

MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
digest.update(secretKey.getBytes("UTF-8")); 

byte[] secretKeyBytes = secretKey.getBytes("UTF-8"); 

byte[] keyBytes = new byte[16]; 
System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length); 

結果:[44, 112, -31, 43, 122, 6, 70, -7, 34, 121, -12, 39, -57, -77, -114, 115]

スウィフト:

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]) 

結果:[44, 112, 225, 43, 122, 6, 70, 249, 34, 121, 244, 39, 199, 179, 142, 115]

それは同じ値で始まるが、その後、それは

を異なっを開始210
+0

Javaコードがオーバーフローし、負の値が生成されます。 – the4kman

+0

[SHA256ハッシュの結果が重複してAndroidとiOSで異なる可能性があります](https://stackoverflow.com/questions/39018731/sha256-hash-results-different-across-android-ios-for-big-numbers) – pedrofb

答えて

5

Bytes in Java are signedのように-128〜127の値しか表現できないため、-31にオーバーフローした225(3番目のバイト)を表現しようとするときにその値を表すことができます。両方のバイトの実際のバイナリ表現は同じ1110 0001になります。

+0

Javaコードを変更せずに解決する方法はありますか?私は今それを変更することはできません。 SwiftのUInt8をInt8に変換しようとしましたが、CryptoSwiftライブラリでは受け付けていません。 –

+1

@JakubGruber、あなたは 'Int8(bitPattern:) 'を使って結果の' keyBytes'を '[Int8]'にマップすることができます – user28434

+0

ライブラリは[Int8]を受け入れません –

関連する問題