BigInt/BigNum 해시를 시도하고 Android/iOS에서 다른 결과가 표시됩니다. 둘 다 앱이 SRP 프로토콜에 따라 작동하도록 동일한 해시 결과를 얻어야합니다. 정밀 검사에서 양수는 제대로 작동하지만 음수는 작동하지 않습니다 (첫 번째 니블이 7보다 큰 경우). 어떤 것이 맞는지, 어느 것이 다른 것과 조화를 이루도록 조정되어야하는지 확실하지 않습니다.SHA256 큰 번호의 경우 Android 및 iOS의 결과가 서로 다릅니다.
안드로이드 :
void hashBigInteger(String s) {
try {
BigInteger a = new BigInteger(s, 16);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] b = a.toByteArray();
sha.update(b, 0, b.length);
byte[] digest = sha.digest();
BigInteger d = new BigInteger(digest);
Log.d("HASH", "H = " + d.toString(16));
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedOperationException(e);
}
}
아이폰 OS :
void hashBigNum(unsigned char *c) {
BIGNUM *n = BN_new();
BN_hex2bn(&n, c);
unsigned char buff[ SHA256_DIGEST_LENGTH ];
int len = BN_num_bytes(n);
unsigned char * bin = (unsigned char *) malloc(len);
BN_bn2bin(n, bin);
hash(SRP_SHA256, bin, len, buff);
fprintf(stderr, "H: ");
for (int z = 0; z < SHA256_DIGEST_LENGTH; z++)
fprintf(stderr, "%2x", buff[z]);
fprintf(stderr, "\n");
free(bin);
}
결과 :
Source String = "6F"
Android Hash = 65c74c15a686187bb6bbf9958f494fc6b80068034a659a9ad44991b08c58f2d2
iOS Hash = 65c74c15a686187bb6bbf9958f494fc6b80068034a659a9ad44991b08c58f2d2
Source String = "FF"
Android Hash = 06eb7d6a69ee19e5fbdf749018d3d2abfa04bcbd1365db312eb86dc7169389b8
iOS Hash = a8100ae6aa1940d0b663bb31cd466142ebbdbd5187131b92d93818987832eb89
으로도
BigInteger d = new BigInteger(digest);
변경합니다. 해시는 스펙에서 말하는 것과 일치해야합니다. 나는 다른 사람의 구현을 사용하고 그들이 얻은 해시를 보는 것이 좋습니다. –@brianbeuning,이 비트를 제외한 모든 프로토콜을 구현했습니다. 이제는 0 번 문제에 대한 JAVA 코드를 수정 했으므로 이제는 훌륭한 크로스 플랫폼을 사용하고 있습니다. – Harish
예를 들어, OpenSSL은 SRP를 지원합니다. SRP 해시를 계산하는 방식이 OpenSSL이 SRP 해시를 계산하는 방식과 일치하지 않으면 코드가 OpenSSL과 통신 할 수 없습니다. –