2017-10-09 1 views
0

Java 및 Swift에서 sha256을 계산할 때 일치하지 않습니다.Java sha256이 Swift와 일치하지 않습니다. sha256

자바 :

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]

그것은 동일한 값으로 시작하지만 그 때

,691,363 다를 시작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까지의 값만 나타낼 수 있습니다. 즉, 225 (제 3 바이트)를 나타낼 때 -31까지 오버플로합니다. 두 바이트의 실제 2 진 표현은 같음 1110 0001이됩니다.

+0

Java 코드를 수정하지 않고 어떻게 해결할 수 있습니까? 나는 지금 그것을 바꿀 수 없다. Swift에서 UInt8을 Int8로 변환하려고 시도했지만 CryptoSwift 라이브러리에서 허용되지 않습니다. –

+1

@JakubGruber, 당신은'Int8 (bitPattern :) '을 사용하여 결과'keyBytes'를'[Int8]'에 매핑 할 수 있습니다. – user28434

+0

라이브러리에서 [Int8]을 허용하지 않습니다. –

관련 문제