Я пытаюсь взломать BigInteger/BigNum, и у меня разные результаты в Android/iOS. Мне нужно получить тот же результат Hash, чтобы оба приложения работали в соответствии с протоколом SRP. При ближайшем рассмотрении он отлично работает для положительных чисел, но не работает для отрицательных чисел (первый полубайт больше 7). Не знаете, какой из них правильный, и какой из них нужно скорректировать, чтобы соответствовать другому.SHA256 Хэш-результаты разные в Android и iOS для больших номеров
Android:
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);
}
}
IOS:
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
Если вы хотите реализовать SRP, это не достаточно, чтобы иметь хэш-матч между Android и IOS. Хэш должен соответствовать тому, что говорит спекуляция. Я предлагаю использовать чужую реализацию и видеть, какие хэши они получают. –
@brianbeuning, мы внедрили весь протокол, кроме этого бита. Как только я исправил код JAVA для проблемы с ведущими 0s, теперь он работает над кросс-платформой. – Harish
Например, OpenSSL поддерживает SRP. Если способ вычисления SRS-хэшей не совпадает с тем, как OpenSSL вычисляет хеширование SRP, ваш код не сможет разговаривать с OpenSSL. –