Я знаю о Оружейной, JavaScript библиотеки, ciyam или других веб-страниц для холодного хранения и подписания ... не цель здесь.
На основании какого-то старого сообщения Питера Wuille (29 сентября 2012 года, "почему OpenSSL?") Вот:
--> "Мы используем его для подписания ECDSA и проверки ..."
Я думал, что я хотел бы использовать OpenSSL, чтобы подписать и проверить свой код. (Это еще действующий подход?)
Я создал сырой TRX, следуя за первые 13 шагов здесь:
http://bitcoin.stackexchange.com/questions/3374/how-to-redeem-a-basic-tx
и, конечно, при поддержке
https://en.bitcoin.it/wiki/Protocol_specification#tx
Исследование с различными инструментами в автономном режиме показывает сырой TRX "выглядит хорошо", Необработанные TRX производит один и тот же хэш SHA256, как на веб-странице.
Тогда я хотел бы использовать "мои собственные ключи" построить сырой TRX, и получить его подписал с OpenSSL. Мой беззнаковое сырой TRX будет выглядеть следующим образом:
010000000167cc10a3b7c5c52435770b6a1cb34a6a783803f028c42e95f9364d21e64b43c301000 0001976A9147A8911A06EF9A75A6CB6AF47D72A99A9B6ECB77988ACffffffff01EC8A0100000000 001976A9140DE4457D577BB45DEE513BB695BDFDC3B34D467D88AC00000000
Для того, чтобы подписать его, OpenSSL требует ключ DER / PEM для этого в командной строке. Как их получить?
Я использовал (выбросить) бумажник, и сбрасывал Priv ключа. Я преобразовал WIF-с privkey с помощью преобразования base58 в шестнадцатеричный формат.
На открытом ключе:
в сценарии оболочки, я не хочу, чтобы заново создать математику ЕС, чтобы получить Публичные от privkey (возможно позже, используя Ьс и постоянный ток). Так что я посмотрел предыдущую TRX (5a62b8697e33b59255ddab10b8f66ece0d5efec91c72134d07d90e03db61e051), что шестнадцатеричный код для Публичного был ... Я приложил эту шестигранную строку со всеми ASN1 пухом, а затем создается с помощью преобразования base64 в формате OpenSSL PEM. Я проверил файл PEM с "OpenSSL asn1parse", И испытание "OpenSSL знак" с файлом примера sha256.txt. После подписания, я "OpenSSL проверить"«D это. Результат от OpenSSL является "Подпись проверена успешно", Так внутренне OpenSSL "работает" правильно, собств / паб матч пара ключей (см код ниже).
Когда я затем собрать TRX и подписать с OpenSSL, я получаю это:
010000000167cc10a3b7c5c52435770b6a1cb34a6a783803f028c42e95f9364d21e64b43c301000 0006A47304402206548cb4429b40f314711d46aa2e582b71041091f70064b276f2cbb800bb73d43 022011b6fe802a4f25dfe73a0c764add96011e43a02c41d2dd65164e2a4f0177ca8b01210293ccb 70fee4d33179c93bade0a9fefd62fde5ac53adc017649f513eec599509cffffffff01EC8A010000 0000001976A9140DE4457D577BB45DEE513BB695BDFDC3B34D467D88AC00000000
И когда я пытаюсь транслировать через blockchain.info/de/pushtx, я получаю сообщение "Сценарий привел к не-истинного стека: []",
Очевидно OP_EQUALVERIFY, а затем OP_CHECKSIG не получают ожидаемого результата.
Таким образом, я предполагаю, что мой ключ преобразования OpenSSL является "как-то" неправильно.
Я дважды проверил точно такой же неподписанный сырец TRX в Bitcoin-QT, и пытался подписать его вручную в Bitcoin-QT, и транслируются успешно:
signrawtransaction «010000000167cc10a3b7c5c52435770b6a1cb34a6a783803f028c42e95f9364d21e64b43c301000 0001976A9147A8911A06EF9A75A6CB6AF47D72A99A9B6ECB77988ACffffffff01EC8A0100000000 001976A9140DE4457D577BB45DEE513BB695BDFDC3B34D467D88AC00000000' «[{"TXID":"c3434be6214d36f9952ec428f00338786a4ab31c6a0b773524c5c5b7a310cc67","Vout": 1,"scriptPubKey":"76A9147A8911A06EF9A75A6CB6AF47D72A99A9B6ECB77988AC"}], [ „$ My_privkey“]
{
"наговор": "010000000167cc10a3b7c5c52435770b6a1cb34a6a783803f028c42e95f9364d21e64b43c301000 0006a47304402203d15e12271521adb6e42c3f6a5eb5020883dd2042f23783e11385fb895fa1890 02200a84ba8e8055123abb22400b5dd90dbe670a1fa1cbbc206d5da59e54f4cc9c3501210293ccb 70fee4d33179c93bade0a9fefd62fde5ac53adc017649f513eec599509cffffffff01ec8a010000 0000001976a9140de4457d577bb45dee513bb695bdfdc3b34d467d88ac00000000",
"полный": правда
}
Любая помощь приветствуется ...
Код я использую, чтобы собрать PEM ключ подписать с OpenSSL:
Код:
#! / Bin / ш
# Пример ключи от веб-страницы:
hex_privkey = 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
hex_pubkey = 0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6
sha256_string = 9302bda273a887cb40c13e02a50b4071a31fd3aae3ae04021b0b843dd61ad18e
# ASN1 структуры заправки:
pre_string = $ (эхо "30740201010420" )
mid_string = $ (эхо "a00706052b8104000aa144034200" )
эхо "использовать предварительно определенные строки ASN.1 для конкатенации PEM файл_ключа:"
эхо " pre_string: $ pre_string"
эхо " privkey: $ hex_privkey"
эхо " mid_string: $ mid_string"
результат = $ (эхо $ hex_pubkey | вырезать -b 1-66)
эхо " Публичных: $ результат"
результат = $ (эхо $ hex_pubkey | вырезать -b 67-)
эхо " $ результат"
# Собрать шестигранный ключ
результат = $ (эхо $ pre_string $ hex_privkey $ mid_string $ hex_pubkey | СЭД «s / [[: xdigit:]] \ {2 \} / \\ х&/г' )
Printf "$ результат" > tmpfile
эхо " "
эхо "и base64 этот файл. PEM также хотят ключевые файлы, некоторые интересные окрестности: "
Результат = $ (base64 tmpfile)
эхо "----- НАЧАТЬ EC PRIVATE KEY -----" > privkey.pem
Эхо $ результат | сократить -b 1-64 >> privkey.pem
Эхо $ результат | сократить -b 65-128 >> privkey.pem
Эхо $ результат | сократить -b 129- >> privkey.pem
эхо "----- END EC PRIVATE KEY -----" >> privkey.pem
кот privkey.pem
эхо " "
эхо "соответствующий pubkey.pem (OpenSSL ес -в privkey.pem -pubout отъезда pubkey.pem)"
OpenSSL ес -in privkey.pem -pubout отъезда pubkey.pem > / DEV / нуль 2>&1
кот pubkey.pem
эхо " "
эхо "проверки подписи процесса с данными испытаний (OpenSSL asn1parse -в privkey.pem)"
Эхо $ sha256_string > sha256.txt
OpenSSL asn1parse -в privkey.pem
эхо "->OpenSSL pkeyutl -знак -в sha256.txt -inkey privkey.pem -keyform PEM > privkey_pem.sig"
OpenSSL pkeyutl -знак -в sha256.txt -inkey privkey.pem -keyform PEM > privkey_pem.sig
эхо "->OpenSSL pkeyutl -verify -в sha256.txt -inkey privkey.pem -sigfile privkey_pem.sig"
OpenSSL pkeyutl -verify -в sha256.txt -inkey privkey.pem -sigfile privkey_pem.sig
эхо " "
# Пример ключи от веб-страницы:
hex_privkey = 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
hex_pubkey = 0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6
sha256_string = 9302bda273a887cb40c13e02a50b4071a31fd3aae3ae04021b0b843dd61ad18e
# ASN1 структуры заправки:
pre_string = $ (эхо "30740201010420" )
mid_string = $ (эхо "a00706052b8104000aa144034200" )
эхо "использовать предварительно определенные строки ASN.1 для конкатенации PEM файл_ключа:"
эхо " pre_string: $ pre_string"
эхо " privkey: $ hex_privkey"
эхо " mid_string: $ mid_string"
результат = $ (эхо $ hex_pubkey | вырезать -b 1-66)
эхо " Публичных: $ результат"
результат = $ (эхо $ hex_pubkey | вырезать -b 67-)
эхо " $ результат"
# Собрать шестигранный ключ
результат = $ (эхо $ pre_string $ hex_privkey $ mid_string $ hex_pubkey | СЭД «s / [[: xdigit:]] \ {2 \} / \\ х&/г' )
Printf "$ результат" > tmpfile
эхо " "
эхо "и base64 этот файл. PEM также хотят ключевые файлы, некоторые интересные окрестности: "
Результат = $ (base64 tmpfile)
эхо "----- НАЧАТЬ EC PRIVATE KEY -----" > privkey.pem
Эхо $ результат | сократить -b 1-64 >> privkey.pem
Эхо $ результат | сократить -b 65-128 >> privkey.pem
Эхо $ результат | сократить -b 129- >> privkey.pem
эхо "----- END EC PRIVATE KEY -----" >> privkey.pem
кот privkey.pem
эхо " "
эхо "соответствующий pubkey.pem (OpenSSL ес -в privkey.pem -pubout отъезда pubkey.pem)"
OpenSSL ес -in privkey.pem -pubout отъезда pubkey.pem > / DEV / нуль 2>&1
кот pubkey.pem
эхо " "
эхо "проверки подписи процесса с данными испытаний (OpenSSL asn1parse -в privkey.pem)"
Эхо $ sha256_string > sha256.txt
OpenSSL asn1parse -в privkey.pem
эхо "->OpenSSL pkeyutl -знак -в sha256.txt -inkey privkey.pem -keyform PEM > privkey_pem.sig"
OpenSSL pkeyutl -знак -в sha256.txt -inkey privkey.pem -keyform PEM > privkey_pem.sig
эхо "->OpenSSL pkeyutl -verify -в sha256.txt -inkey privkey.pem -sigfile privkey_pem.sig"
OpenSSL pkeyutl -verify -в sha256.txt -inkey privkey.pem -sigfile privkey_pem.sig
эхо " "