Всем доброго времени суток. Начал понемногу разбираться в криптографии и для начала решил воспроизвести процесс получения биткоин-адреса из приватного ключа. Алгоритм взял
отсюда.
Ну и дальше так:
Код:
UnicodeString key = "18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725", chsum;
uint8_t private_key[32] = {0};
uint8_t eliptic_public_key[64] = {0};
uint8_t compressed_public_key[33] = {0};
//Заполняем private_key десятичными значениями
char h[2]={'0'};
int i=0;
while(key.Length()!=0)
{
h[0]=key[1];
h[1]=key[2];
key.Delete(1,2);
private_key[i] = xtodec(h);
i++;
}
//вычисляем публичный ключ через ECDSA
const uECC_Curve_t * curve;
curve = uECC_secp256k1();
uECC_compute_public_key(private_key, eliptic_public_key, curve);
key = "";
for(i=0; i<64; i++)
key += dectox(eliptic_public_key[i]);
//преобразуем в сжатый формат публичного ключа
uECC_compress(eliptic_public_key, compressed_public_key, curve);
key="";
for(i=0; i<33; i++)
key += dectox(compressed_public_key[i]);
А на следующем шаге застрял
Код:
//шифрование публичного ключа
key = THashSHA2::GetHashString(key);
RIPEMD_160 hash;
std::string stdLine(AnsiString(key).c_str());
hash.message = stdLine;
stdLine = hash.ripemd_160();
key = stdLine.c_str();
SHA2 выдаёт результат не совпадающий со схемой на сайте. Проверил через сайт с онлайн-хэшами - результат как у меня. Но биткоиновцы походу получают его как-то по другому.
Где-то наткнулся на то, что надо хэшировать не шестнадцатеричную строку, а байтовый массив сжатого ключа. Вот только как его хэшировать так и не понял.
Сделал так
Код:
key = THashSHA2::GetHashString(*compressed_public_key);
, но результат опять не тот.
Вот здесь при запросе Binary Hash получаю то, что нужно.
Может кто сталкивался, подскажите.