В принципе, мне нужно сделать кучу математики вычислений в C ++ (с использованием Qt), и я застрял с извлечением ключа ребенка BIP32. У меня есть справедливый бит сделать хотя. Я могу ввести секретный ключ BIP32, возьмите его на части, получить открытый ключ, используя ECDSA (сжатый или несжатый), я могу кодировать адрес из ключа, и так далее.
Тем не менее, я застрял на выводе ключа ребенка. Я могу сделать математику просто отлично с библиотекой ГМПА PHP, но я не могу получить результаты из PHP и C ++ кода, чтобы совпасть. Они должны идеально совпадают, так как это просто математика. Я пробовал оба, QCA (http://delta.affinix.com/docs/qca/) И только с помощью BIGNUM типа данных не дали никаких результатов. Так вот проблема:
Сжатый Public Key: 023E4740D0BA639E28963F3476157B7CF2FB7C6FDF4254F97099CF8670B505EA59
Private Key: 5c22f8937210130ad1bbc50678a7c0a119a483d47928c323bf0baa3a57fa547d
Цепь Код: 180c998615636cd875aa70c71cfa6b7bf570187a56d8c6d054e60b644d13e9d3
Индекс ключа: 35 (00000023)
Вот небольшой фрагмент кода я в настоящее время.
Код:
QByteArray Публичных = "023E4740D0BA639E28963F3476157B7CF2FB7C6FDF4254F97099CF8670B505EA5900000023";
QByteArray privkey = "5c22f8937210130ad1bbc50678a7c0a119a483d47928c323bf0baa3a57fa547d";
QByteArray chain_code = "180c998615636cd875aa70c71cfa6b7bf570187a56d8c6d054e60b644d13e9d3";
// HMAC SHA512 Хэш
ККА :: MessageAuthenticationCode HMAC ("HMAC (SHA512)", ККА :: SecureArray ());
ККА :: SecureArray Карр (chain_code);
ККА :: SymmetricKey ск (Карр);
hmac.setup (ки);
hmac.update (ККА :: hexToArray (Публичная));
// Анализировать полученный хэш
QByteArray результат = hmac.final () toByteArray ().
ККА :: SecureArray arr_left (result.left (32));
ККА :: SecureArray arr_key (privkey);
// Получить большие целые числа
ККА :: BigInteger BNL (arr_left);
ККА :: BigInteger БНК (arr_key);
ККА :: BigInteger БНО ("115792089237316195423570985008687907852837564279074904382605163141518161494337");
// Делай математику
BNL + = БНК;
BNL% = БНО;
// Вернуть
QByteArray new_key = bnl.toArray () toByteArray () toHex ()..;
вернуться new_key;
QByteArray privkey = "5c22f8937210130ad1bbc50678a7c0a119a483d47928c323bf0baa3a57fa547d";
QByteArray chain_code = "180c998615636cd875aa70c71cfa6b7bf570187a56d8c6d054e60b644d13e9d3";
// HMAC SHA512 Хэш
ККА :: MessageAuthenticationCode HMAC ("HMAC (SHA512)", ККА :: SecureArray ());
ККА :: SecureArray Карр (chain_code);
ККА :: SymmetricKey ск (Карр);
hmac.setup (ки);
hmac.update (ККА :: hexToArray (Публичная));
// Анализировать полученный хэш
QByteArray результат = hmac.final () toByteArray ().
ККА :: SecureArray arr_left (result.left (32));
ККА :: SecureArray arr_key (privkey);
// Получить большие целые числа
ККА :: BigInteger BNL (arr_left);
ККА :: BigInteger БНК (arr_key);
ККА :: BigInteger БНО ("115792089237316195423570985008687907852837564279074904382605163141518161494337");
// Делай математику
BNL + = БНК;
BNL% = БНО;
// Вернуть
QByteArray new_key = bnl.toArray () toByteArray () toHex ()..;
вернуться new_key;
Хэш HMAC SHA512 прекрасно, и я получаю правильный результат от обоих, PHP и C ++, который является: fa634546bbddad6f51e8a7ff05976e0d8813aafb656bf0c7cacb53a200e9e3e624e199e9e83fa03 eedd5056ac2de8482be17fcb6d85ebf15faa1976e5df957aa
Тем не менее, вот где она заканчивается. В принципе, мне нужно остаток ((BNL + БНК) / БНО). Проблема, кажется, начинается только после того, как результаты, которые я получаю, просто немного иначе:
PHP: 56863dda2dedc07a23a46d057e3f2eaea1b82ecfde94b3eb89d6fddc58e43863
C ++ 156863dda2dedc07a23a46d057e3f2eaea1b82ecfde94b3eb89d6fddc58e43863
По какой-то причине, C ++ вариант бросает дополнительный «1» на начало. Если я пытаюсь преобразовать любого из целых чисел в строки, они полностью от того, что из PHP дает мне как строки для чисел. Во всяком случае, вот текущие результаты, которые я получаю для нового секретного ключа:
PHP: 56863dda2dedc07a23a46d057e3f2eafe70951e92f4c13afca049f4f88adf722
C ++: 56863dda2dedc07a23a46d057e3f2eaea1b82ecfde94b3eb89d6fddc58e43863
Мне нужно решение в C ++ (с использованием QCA, BIGNUM, что угодно, - хотя я предпочел бы QCA), что делает правильную математику, и дает мне тот же результат, я получаю в PHP. Если вы знаете, как, пожалуйста, напишите Ваше решение здесь вместе с BTC адрес, и я пришлю 0,3 BTC сразу. Благодаря!