Реализация secp256k1 (ECDSA) в PHP (для биткойнов)

Для тех, кто против и/или ближе: если вы считаете, что это оффтоп для SO, любезно укажите мне на другой сайт StackExchange, где этот вопрос был бы более уместным.


Как реализовать кривую ECDSA secp256k1 в PHP?

А точнее: Есть ли решения - т.е. включаемые специализированные классы - уже сделано?

Я вижу, что существует множество библиотек с открытым исходным кодом, классов и прочего, доступного для других языков (JavaScript, Python и т. д.), но я только что провел целый день в поиске какого-либо/любого решения для PHP и... ничего!.

Это для моего биткойн-проекта, и мне нужен способ, как сгенерировать открытый ключ из закрытого ключа ... и затем я хочу сгенерировать окончательный биткойн-адрес.

Я знаю, как сгенерировать закрытый ключ (не беспокойтесь о том, случайный он или нет — здесь это не проблема), и у меня есть как 256-битная шестнадцатеричная, так и WIF-нотация. Но следующий шаг: придумать открытый ключ, а затем окончательный биткойн-адрес, для меня довольно проблематично, так как у меня буквально нулевой опыт работы с криптографией, и я знаю, что решение состоит в том, чтобы каким-то образом использовать secp256k1.

Это то, что у меня есть до сих пор:

// Random bytes
// $private_key = bin2hex(openssl_random_pseudo_bytes(32));
// But using brainwallet.org style to have easy comparison
$passphrase = "correct horse battery staple";
$private_key = hash('sha256', $passphrase);
var_dump ("PrivKey: $private_key");
// Bitcoin::privKeyToWIF from github.com/mikegogulski/bitcoin-php
$wif = Bitcoin::privKeyToWIF($private_key); 
var_dump ("WIF PrivKey: $wif");
// And now I don't know where to even start ...

tl;dr Как реализовать это в PHP? (..и преобразование privKey->pubKey перед этим)

http://i.stack.imgur.com/U2neg.png

Я знаю о...

  • http://github.com/mikegogulski/bitcoin-php .. Это довольно аккуратно и имеет существует множество полезных методов и способов управления bitcoind через RPC, но, к сожалению, чистый метод PHP, который мог бы обрабатывать механизм privKey->pubKey, отсутствует.
  • http://bitcoinphp.com/ .. Я не смог найти его там.
  • расширение openssl в PHP, но, к сожалению, единственный метод дайджеста, упоминаемый в документации OPENSSL-PHP, — это «ecdsa-with-SHA1», и поправьте меня, если я ошибаюсь, но мне нужен «ecdsa- with-SHA256' или что-то в этом роде (?)
  • Я даже пытался преобразовать алгоритм из bitcoinjs.js, но с моими крипто-знаниями я не смог извлечь суть из чего-либо. Я просто не понимаю этих кривых, их битовых операций и других жутких вещей.

Я ищу решение PURE PHP. Мне не нужно использовать оболочку, запускающую биткойн, а затем анализировать JSON для пар ключей, а затем...

Почему нет фрагмента кода, который мог бы полностью справиться с этим на PHP? ИЛИ ЕСТЬ?! :)


person Smuuf    schedule 04.12.2013    source источник
comment
И если это заслуживает отрицательного голоса, вы могли бы поделиться с остальными, почему именно.   -  person Smuuf    schedule 05.12.2013
comment
Я не отрицал это, но вы действительно просите решение на PHP, не показывая, что вы действительно пытались создать свое собственное решение, что иногда не одобряется.   -  person admdrew    schedule 05.12.2013
comment
... тем не менее, я думаю, что это интересный вопрос (на который я был бы не против узнать ответ самому себе). К сожалению, у меня нет голосов, поэтому я не могу +1 сделать это для вас.   -  person admdrew    schedule 05.12.2013
comment
О, хороший момент. Но опять же - я бы даже не знал, с чего начать реализацию этой магии. :)   -  person Smuuf    schedule 05.12.2013
comment
OpenSSL нуждается в хаке для поддержки ecdsa-with-SHA256: forum.openvpn.net/topic8404-15. html   -  person Vladislav Rastrusny    schedule 05.12.2013
comment
Конструктивно, спасибо.   -  person Smuuf    schedule 05.12.2013
comment
Я начал разработку PHP-библиотеки, которая позволит добиться именно этого. Для этого требуется php ›=5.4 и расширение php5-gmp. Вы можете посмотреть код здесь github.com/rgex/BitcoinECDSA.php Вы уже можете предоставить закрытый ключ (256 шестнадцатеричных строк), и он сгенерирует для вас WIF, открытый ключ и соответствующий несжатый биткойн-адрес. Но, пожалуйста, не используйте его в продакшене, там еще много чего не хватает.   -  person Jan Moritz    schedule 12.05.2014
comment
@JanMoritz, спасибо, отлично!   -  person Alan Deep    schedule 25.03.2018