Bitcoin Forum

Local => Новички => Topic started by: Andry777 on February 08, 2021, 09:07:52 PM



Title: Electrum и BIP39
Post by: Andry777 on February 08, 2021, 09:07:52 PM
По стандарту, BIP39 использует словарь со списком слов 2048. Но в electrum если выбрать опцию BIP39 - то можно любые слова вписывать в тч. - каких нет в словаре. Такой вопрос - как генерируется мастер ключ в таком случае, если я буду использовать seed из 12 слов, которые придумаю я сам, которых не будет в словаре? И какая совместимость с другими кошельками (которые используют BIP39)?
(или возможно я не совсем понял о BIP39?)


Title: Re: Electrum и BIP39
Post by: Andry777 on February 08, 2021, 10:12:46 PM

Для этого  выбрать I have SEED --> options  --> BIP 39 и ввевсти свою BIP 39 фразу.

Эту фразу можно например сгенерировать самому используя https://iancoleman.io/bip39/  но только не на онлайн компьютере.


я не совсем это имел ввиду. Дело в том, что в electrum можно фразу вписать из любых слов к примеру - "bb bb bb bb bb bb bb bb bb bb bb bb", и оно его с успехом сожрёт и сгенерит ключи. А вот с сервисом, который вы указали - уже такое не получится, выдаст ошибку "bb not in wordlist, did you mean baby?", что логично, ведь слова bb нет в словаре. Покопавшись в коде, я вроде понял, что из фразы вычисляется хэш
Code:
return hashlib.pbkdf2_hmac('sha512', mnemonic.encode('utf-8'), b'electrum' + passphrase.encode('utf-8'), iterations = PBKDF2_ROUNDS)
(но могу ошибаться)
Получается - можно использовать свои слова, аналог BrainWallet? Другие кошели тоже сожрут этот seed, или будут плеваться, как сервис? И по безопасности что?


Title: Re: Electrum и BIP39
Post by: A-Bolt on February 08, 2021, 10:31:07 PM
Дело в том, что в electrum можно фразу вписать из любых слов к примеру - "bb bb bb bb bb bb bb bb bb bb bb bb", и оно его с успехом сожрёт и сгенерит ключи.
При этом под этой фразой Electrum напишет BIP39(unknown wordlist), намекая на несовместимость такой фразы с другими BIP39-кошельками. Не могу ручаться за все кошельки, но думаю, что большинство из них не примет эту фразу.

И по безопасности что?
Последовательность, сгенерированная генератором с низкой энтропией, считается уязвимой к атаке перебором.


Title: Re: Electrum и BIP39
Post by: witcher_sense on February 09, 2021, 06:47:09 AM

Для этого  выбрать I have SEED --> options  --> BIP 39 и ввевсти свою BIP 39 фразу.

Эту фразу можно например сгенерировать самому используя https://iancoleman.io/bip39/  но только не на онлайн компьютере.


я не совсем это имел ввиду. Дело в том, что в electrum можно фразу вписать из любых слов к примеру - "bb bb bb bb bb bb bb bb bb bb bb bb", и оно его с успехом сожрёт и сгенерит ключи. А вот с сервисом, который вы указали - уже такое не получится, выдаст ошибку "bb not in wordlist, did you mean baby?", что логично, ведь слова bb нет в словаре. Покопавшись в коде, я вроде понял, что из фразы вычисляется хэш
Code:
return hashlib.pbkdf2_hmac('sha512', mnemonic.encode('utf-8'), b'electrum' + passphrase.encode('utf-8'), iterations = PBKDF2_ROUNDS)
(но могу ошибаться)
Получается - можно использовать свои слова, аналог BrainWallet? Другие кошели тоже сожрут этот seed, или будут плеваться, как сервис? И по безопасности что?
Слова сид фразы это не что иное как своеобразное представление энтропии+контрольной суммы, в общем и целом - это большое случайное число, которое чем случайней, тем безопасней. Когда вы вводите рандомные слова вместо предварительно сгенерированной сид фразы, вы по сути, как правильно заметили, делаете аналог brainwallet, безопасность которого обычно ниже, потому что случайность, сненерированная человеческим мозгом совсем не случайна. ПО кошелька Electrum берет ваше "рандомное" число и генерирует ключи по стандартной процедуре. Разумеется, вы не сможете добавить фразу, сгенерированный не по стандарту  BIP-39 в другие кошельки, потому что они не распознают ваши слова, но сгенерированные приватные ключи можно добавить, потому что они ничем не будут отличаться от других, сгенерированных по стандарту.


Title: Re: Electrum и BIP39
Post by: Andry777 on February 09, 2021, 09:25:45 AM
Когда вы вводите рандомные слова вместо предварительно сгенерированной сид фразы, вы по сути, как правильно заметили, делаете аналог brainwallet, безопасность которого обычно ниже, потому что случайность, сненерированная человеческим мозгом совсем не случайна.
это понятно. Если мы используем словарь, и пытаемся сгенерировать рандомную фразу - она может быть небезопасна, и надо использовать монету или подобное. Но если мы используем свои слова, слова - которые известны только нам, слова - в которых могут быть еще и знаки (#$!*+-), разный регистр - то безопасность повышается уже в разы, разве нет?
И если на выходе мы получаем хэш, то можно использовать любое кол-во слов (аналог BrainWallet), не понятно одно - почему такой функции нет в том же электруме? Он требует ввода минимум 12 слов, даже которых нет в словаре.



Title: Re: Electrum и BIP39
Post by: witcher_sense on February 09, 2021, 09:50:26 AM
это понятно. Если мы используем словарь, и пытаемся сгенерировать рандомную фразу - она может быть небезопасна, и надо использовать монету или подобное. Но если мы используем свои слова, слова - которые известны только нам, слова - в которых могут быть еще и знаки (#$!*+-) - то безопасность повышается уже в разы, разве нет?
И если на выходе мы получаем хэш, то можно использовать любое кол-во слов (аналог BrainWallet), не понятно одно - почему такой функции нет в том же электруме? Он требует ввода минимум 12 слов, даже которых нет в словаре.


Когда мы создаём сид-фразу, мы не генерируем рандомные слова из словаря и не используем символы, чтобы сделать её безопасней. Все что мы делаем, это берём хороший источник энтропии и получаем длинное бинарное число определенной длины. Например 128 бит, это набор нулей и единиц, что равносильно подбрасыванию монеты 128 раз. Далее мы вычисляем хэш этого длинного числа и берём первые несколько байт. Это будет контрольная сумма для нашей энтропии. Мы добавляем эту сумму в конец нашего 128 битного числа и получаем 128+4=132 бита нулей и единиц. Далее мы разделяем это число на сектора по 11 бит и получаем 12 секторов - это и будут наши слова из таблицы. Получилось абсолютно рандомное число, записанное словами, да ещё и с контрольной суммой для проверки правильности порядка. Такую фразу легко хранить, легко копировать и при необходимости легко запомнить. Проблема со сложными паролями вместо сид-фразы в том, что во-первых, они могут быть менее случайными, а следовательно и менее безопасными. Их практически невозможно запомнить, а следовательно смысл BrainWallet теряется. Очень легко допустить ошибку, делая резервную копию и невозможно проверить целостность вашего бэкапа ни для вас, ни для ПО, потому что контрольная сумма отсутствует.


Title: Re: Electrum и BIP39
Post by: Andry777 on February 09, 2021, 11:03:51 AM
Брейнволет (https://gist.github.com/gavinandresen/3840286) лучше выбросить из головы. На толке много тем, посвященных взломам таких кошельков.
Брейнволет (https://gist.github.com/gavinandresen/3840286) лучше выбросить из головы. На толке много тем, посвященных взломам таких кошельков.
да, если используешь слова, которые известны другим - солнце, небо, земля... но если в качестве слов используешь пароль, длинной минимум 10 символов, с доп. символами и разным регистром - взломаете? Разве что подбором. Что там сейчас по подбору пароля более 10 символов?


Когда мы создаём сид-фразу, мы не генерируем рандомные слова из словаря и не используем символы, чтобы сделать её безопасней. Все что мы делаем, это берём хороший источник энтропии и получаем длинное бинарное число определенной длины. Например 128 бит, это набор нулей и единиц, что равносильно подбрасыванию монеты 128 раз. Далее мы вычисляем хэш этого длинного числа и берём первые несколько байт. Это будет контрольная сумма для нашей энтропии. Мы добавляем эту сумму в конец нашего 128 битного числа и получаем 128+4=132 бита нулей и единиц. Далее мы разделяем это число на сектора по 11 бит и получаем 12 секторов - это и будут наши слова из таблицы. Получилось абсолютно рандомное число, записанное словами, да ещё и с контрольной суммой для проверки правильности порядка. Такую фразу легко хранить, легко копировать и при необходимости легко запомнить. Проблема со сложными паролями вместо сид-фразы в том, что во-первых, они могут быть менее случайными, а следовательно и менее безопасными. Их практически невозможно запомнить, а следовательно смысл BrainWallet теряется. Очень легко допустить ошибку, делая резервную копию и невозможно проверить целостность вашего бэкапа ни для вас, ни для ПО, потому что контрольная сумма отсутствует.
хорошо, а если seed дополняется своими словами, тогда какой алгоритм?


Title: Re: Electrum и BIP39
Post by: witcher_sense on February 09, 2021, 11:27:35 AM
хорошо, а если seed дополняется своими словами, тогда какой алгоритм?
Не знаю что вы имеете ввиду под "дополняется своими словами", но есть вариант использовать дополнительный пароль (passphrase) вместе со своей сид фразой. Дополнительная фраза может быть как набором слов, так и просто рандомным набором символов, это в общем-то неважно, главное чтобы вы смогли её правильно забэкапить без ошибок. По сути, дополнительная фраза конкатенируется с аргументом "mnemonic" в специальной функции для генерации root seed, и в итоге мы получаем абсолютно другой набор ключей. Если вы неправильно сохраните свой дополнительный пароль и введёте его в функцию, то вам не выдаст ошибок, а выдаст другой набор ключей и адресов.


Title: Re: Electrum и BIP39
Post by: Andry777 on February 09, 2021, 11:43:58 AM
Не знаю что вы имеете ввиду под "дополняется своими словами", но есть вариант использовать дополнительный пароль (passphrase) вместе со своей сид фразой. Дополнительная фраза может быть как набором слов, так и просто рандомным набором символов, это в общем-то неважно, главное чтобы вы смогли её правильно забэкапить без ошибок. По сути, дополнительная фраза конкатенируется с аргументом "mnemonic" в специальной функции для генерации root seed, и в итоге мы получаем абсолютно другой набор ключей. Если вы неправильно сохраните свой дополнительный пароль и введёте его в функцию, то вам не выдаст ошибок, а выдаст другой набор ключей и адресов.

да собственно почему я спрашиваю, туплю. Я ведь сам кидал исходник:
Code:
        return hashlib.pbkdf2_hmac('sha512', mnemonic.encode('utf-8'), b'electrum' + passphrase.encode('utf-8'), iterations = PBKDF2_ROUNDS)
passphrase да, в електруме называется - "расширить этот seed при помощи пользовательских слов". То-есть - даже при утере seed, без пароля не восстановить ключи, в этом доп. безопасность.
Я не оч. знаком с питоном, это он строку 'electrum' конкатенирует  с passphrase? Даже при отсутствии passphrase, по дефолту будет - electrum?

Quote
По сути, дополнительная фраза конкатенируется с аргументом "mnemonic" в специальной функции для генерации root seed, и в итоге мы получаем абсолютно другой набор ключей.
не совсем верно. Как видно по функции, мнемоника выступает в качестве пароля, а доп. фраза - как соль.


Title: Re: Electrum и BIP39
Post by: witcher_sense on February 09, 2021, 11:55:38 AM
не совсем верно. Как видно по функции, мнемоника выступает в качестве пароля, а доп. фраза - как соль.
Вот цитата из "Mastering Bitcoin":

Quote
The second parameter to the PBKDF2 key-stretching function is a salt. The salt is composed of the string constant "mnemonic" concatenated with an optional user-supplied passphrase string.

Надеюсь переводить не нужно, но смысл в том, что это для стандарта BiP-39, а электрум использует свои наработки. Вот в чем главный смысл всего этого обсуждения: вы можете придумывать свои стандарты или использовать общепризнанные, но в первом случае вам понадобиться и свое собственное ПО, которое будет понимать, что вы от него хотите. Со своим ПО вы можете делать, что угодно и генерировать ключи, как хотите. Главное, чтобы они были понятны протоколу Биткоина, а остальное совершенно неважно.

Ещё уточнение по поводу функции, соль в этой функции это буквально слово "mnemonic+passphrase", а не сама мнемоника (набор слов). То есть, пароль - это набор слов, а соль - mnemonic||passphrase.


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 04:18:53 PM
не совсем верно. Как видно по функции, мнемоника выступает в качестве пароля, а доп. фраза - как соль.

Из мнемоники обратным преобразованием получают случайное число к которому дополнительная фраза добавляет свою "случайность" и на выходе имеем новое случайное число.
Не понял про обратное преобразование, это что такое?
Quote
https://i.postimg.cc/L4xb9sB9/55432.png (https://postimages.org/)

На рисунке показана блок схема всего процесса. seed это ваше окончательное случайной число, entropy input - это затравка полученная из сид фразы, PERSONALIZATION STRING - это ваше дополнительное слово.
Это что-то не то, процесс генерации сида показан на этой картинке:

https://learnmeabitcoin.com/technical/images/mnemonic/mnemonic-seed.png

В Electrum сид генерируется примерно так же, только вместо слова "mnemonic" используется "electrum", и контрольная сумма по-другому считается. Ну и словарь там может быть произвольный, например, 9dk - вполне нормальная мнемоническая фраза для Электрума.


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 05:26:50 PM
Когда вы  вводите свою mnemonic phrase, например 12 слов, они сначала преобразуются в random_number
Это не так. Они поступают на вход PBKDF2 в виде текста.
Quote
На второй вход поступает Salt , на третий - обычный текст (25-е слово).
Никакого третьего входа нет, на второй подается текст ("mnemonic"||passphrase)


Title: Re: Electrum и BIP39
Post by: Andry777 on February 10, 2021, 05:34:57 PM


Когда вы  вводите свою mnemonic phrase, например 12 слов, они сначала преобразуются в random_number которое поступает на вход обозначенный "пассворд" у вас на картинке. На второй вход поступает Nonce , на третий - обычный текст (25-е слово). У меня в блоксхеме последние два входа разнесены, у вас объедены но это не важно. Дальше все это многократно  хешеруется функцией PBKDF2.  
функция принимает 4 параметра. Какие 3 входа? В качестве пароля выступает mnemonic, в качестве соли - "electrum" + passphrase, что можно видеть из кода:

Code:
return hashlib.pbkdf2_hmac('sha512', mnemonic.encode('utf-8'), b'electrum' + passphrase.encode('utf-8'), iterations = PBKDF2_ROUNDS)


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 05:40:37 PM
На картинке да, потому что так легче для человеческого мозга, но в железе нет . Ключи текст не воспринимают, они понимают только 0 (открытое состояние) или 1 (закрытое состояние).
Хорошо, текст в виде последовательности байт (или бит, если вам так угодно) кодировки UTF-8. Так вас устраивает? Где тут обратное преобразование в случайное число?


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 05:48:07 PM
На картинке да, потому что так легче для человеческого мозга, но в железе нет . Ключи текст не воспринимают, они понимают только 0 (открытое состояние) или 1 (закрытое состояние).
Хорошо, текст в виде последовательности байт (или бит, если вам так угодно) кодировки UTF-8. Так вас устраивает? Где тут обратное преобразование в случайное число?

Устроит для 25  го слова но не устроит для сид фразы.
Почему?

Quote
Ну я как то исходил из этого документа  https://csrc.nist.gov/CSRC/media/Publications/sp/800-90a/rev-1/final/documents/sp800-90a_r1_draft_november2014_ver.pdf
может NIST и не прав. Вам наверное виднее.
А что это за документ, а главное - почему вы на него опираетесь? У нас есть документ BIP39 (https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki), от него и отталкиваемся.


Title: Re: Electrum и BIP39
Post by: Andry777 on February 10, 2021, 05:54:20 PM

Устроит для 25  го слова но не устроит для сид фразы.
в исходнике сид кодируется в utf-8, перед добавлением в функцию, или это по вашему число кодируется? :)


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 06:02:57 PM
Да причем тут BIP 39. Документ регламентирует как должно работать железо, которое претендует на генерацию случайных чисел,  а не как получается мнемоническая фраза из случайного числа согласно алгоритму  BIP 39 .
А при чем тут обсуждение генерации случайных чисел, если речь шла об алгоритме получения сида из мнемонической фразы и пассфразы? ;D  

Почему?

А почему нет?
Хороший ответ на вопрос )). Потому что так написано в BIP39.


Title: Re: Electrum и BIP39
Post by: Andry777 on February 10, 2021, 06:07:27 PM
Не понимаю, зачем дискутировать, если есть исходник, и там черно-по белому написано, как оно работает. Числа в функцию PBKDF2 не передаются, передается текст. Смысл спора?


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 07:42:08 PM
Потому что так написано в BIP39.

 ;D Напомнило ответ студента, которого спросили почему небо голубое, и он ответил, что так было  написано в букваре.
Мне не важно, что он вам напомнил, ответ был содержательным в отличие от вашего "а почему нет?".
Quote
Нахер  было спрашивать,если устраивает то что написано? Вроде вам посты набивать себе незачем.
Мне ничего не надо, я ни о чем не спрашиваю, просто указываю на ваше заблуждение.
Quote
Когда эти выпускники  вводят ее в  леджер для востановления своих ключей, происходит обратное преобразование в то же самое случайное число, и это случайное число служит мастер ключом.
Еще раз вам говорю, это не так, вы заблуждаетесь, никакого обратного преобразования не происходит. Прочитайте BIP39, вот вам конкретная цитата (https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed) оттуда: "To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic sentence (in UTF-8 NFKD) used as the password and the string "mnemonic" + passphrase (again in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).

This seed can be later used to generate deterministic wallets using BIP-0032 or similar methods. "


Title: Re: Electrum и BIP39
Post by: igor72 on February 10, 2021, 09:06:56 PM
Я исхожу из этого документа для Леджер https://ledger.readthedocs.io/en/latest/background/master_seed.html   и того документа, который приведен в моих предыдущих сообщениях. Там нигде не говорится, что аппаратно реализованная PBKDF2 принимает в качестве аргумента мнемонику преобразованную  UTF-8 .
Там написано (https://ledger.readthedocs.io/en/latest/background/master_seed.html#generation-and-serialization): "Ledger uses a standard called BIP 39 for the generation and interpretation of the master seed on all of our devices", этого более чем достаточно.

К тому же, вы же не будете оспаривать факт, что мнемоника, сгенерированная в леджере, в любом BIP39-совместимом кошельке дает такие же ключи/адреса? Разве это было бы возможно, если бы они использовали разные входные переменные в PBKDF2?


Title: Re: Electrum и BIP39
Post by: A-Bolt on February 10, 2021, 09:18:03 PM
Если вы докажите мне, сославшись на официальную документацию Леджер, что там используется кодировка UTF для преобразования первоначальной  затравки, я с вами  соглашусь. А пока остаюсь при своем мнении.

Если вы не заметили, мы тут с самого первого сообщения, обсуждаем BIP39 и особенности его реализации в кошельке Electrum. Вы же припёрлись сюда с Леджером и требуете что-то вам доказать по этому кошельку, который тут вообще не обсуждался. С хрена ли?

С другой стороны, в документе на который вы кинули ссылку, указано следующее (https://ledger.readthedocs.io/en/latest/background/master_seed.html#generation-and-serialization):
Quote
Ledger uses a standard called BIP 39 (https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) for the generation and interpretation of the master seed on all of our devices. BIP 39 is an industry standard used by many other hierarchical deterministic wallets.
, где прямо в тексте размещена ссылка на описание стандарта BIP39. Какие ещё вам доказательства нужны?
 


Title: Re: Electrum и BIP39
Post by: igor72 on February 11, 2021, 05:17:21 AM
Тогда под обратным преобразованием будем понимать преобразование мнемоники (т.е одного случайного числа) в битовую строчку с использованием UTF-8 (а иными словами в другое случайное число). И в конечном итоге я прав.
Другими словами, будете называть прямое преобразование обратным. Чего не сделаешь, лишь бы остаться правым )? Не вижу смысла продолжать спор.


Title: Re: Electrum и BIP39
Post by: Andry777 on February 11, 2021, 10:12:13 AM
что за квадратиками ( и функциями) всегда стоят микросхемы, которые  умеют различать буквы, только после их преобразования в байты.
блин ну это понятно, вы бы еще листинг функции привели в машинных кодах. Да, процессор понимает биты, даже что вы пишете тут - воспринимается всё в виде единиц и нолей. Но как это относится к данной теме?