Разделяет ли каждый адрес Ethereum (теоретически) 2 ** 96 приватных ключей?

Резюме

Это расширенный вопрос о том, как генерируются адреса эфириума? .

В Ethereum закрытый ключ имеет длину 256 бит, а адрес — всего 160 бит. В соответствии с «принципом голубя» он гарантирует, что некоторые уникальные закрытые ключи сопоставляются с одним и тем же адресом. Теоретически 2 ** 96уникальные закрытые ключи в среднем сопоставляются с одним адресом.

Вопрос

Если 2 закрытых ключа сопоставляются с одним и тем же адресом, получают ли они оба доступ к одному и тому же адресу? Могут ли они оба использовать для передачи эфира с одного адреса на другой?

Подробности

Согласно ответу @tayvano , закрытый ключ имеет длину 256 бит, и любая 256-битная строка является допустимым закрытым ключом:

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

Следовательно, существуют 2 ** 256действительные закрытые ключи (пространство ключей равно 2 ** 256).

Открытый ключ имеет длину 512 бит. Однако, поскольку каждый из них является производным от своего собственного закрытого ключа, существует только 2 ** 256действительный открытый ключ, и, таким образом, пространство ключей равно 2 ** 256.

Затем открытый ключ подается в качестве входных данных Keccak-256алгоритма хэширования (предварительно стандартного SHA3). Результатом Keccak-256является 256-битная строка, поэтому ее можно рассматривать как взаимно однозначное отображение в ключевом пространстве. (Хеш-пространство равно 2 ** 256)

Однако адрес Ethereum получается из младших значащих 160-бит Keccak-256хэша. Это сокращает ключевое пространство до 2 ** 160.

В результате процесс генерации адреса из закрытого ключа представляет собой функцию преобразования 256-битного значения в 160-битное значение, что гарантирует наличие дубликатов.

Вам может быть интересно

Спасибо за ссылку! На самом деле я понял, насколько велико это число, еще до прочтения поста, но мне все же любопытно, 2 ** 96работают ли все ключи по одному и тому же адресу, или есть какой-то механизм, позволяющий отличить «настоящий» ключ от других.

Ответы (2)

Ваши расчеты верны, за исключением того, что закрытых ключей не ровно 2 ^ 256 — есть «FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141» (это число Nуказано в исходном коде ETH и является порядком генератора эллиптическая кривая secp256k1, из которой генерируются пары ключей Ethereum).

Отвечая на ваш вопрос, да, приватные ключи, сопоставленные с одним и тем же адресом, оба смогут тратить деньги по этому адресу в порядке живой очереди. Они создадут тот же открытый ключ, для которого выполняется алгоритм проверки ECDSA, поэтому подписи, сгенерированные любым закрытым ключом, будут проверяться по одному и тому же адресу!

В go-ethereum/accounts/key.go у нас есть закрытый ключ, сгенерированный из S256, который является кривой secp256k1, что означает, что они будут меньше, чем Nпо умолчанию.

func newKeyFromECDSA(privateKeyECDSA *ecdsa.PrivateKey) *Key {
    id := uuid.NewRandom()
    key := &Key{
        Id:         id,
        Address:    crypto.PubkeyToAddress(privateKeyECDSA.PublicKey),
        PrivateKey: privateKeyECDSA,
    }
    return key
}

func newKey(rand io.Reader) (*Key, error) {
    privateKeyECDSA, err := ecdsa.GenerateKey(secp256k1.S256(), rand)
    if err != nil {
        return nil, err
    }
    return newKeyFromECDSA(privateKeyECDSA), nil
}

go-ethereum/crypto/secp256k1/secp256 тоже генерирует пары ключей в соответствии с secp2656k1, хоть и немного другим способом :)

Классное иллюстративное объяснение, что на Nсамом деле и почему 2 ключа смогут тратить деньги с одного аккаунта

Представьте, что закрытые ключи — это мили, пройденные вашей машиной, а открытые ключи — это количество миль на одометре вашего автомобиля. Если одометр перейдет от 999 999 к 000 000, человек с пробегом = 1 000 001 будет иметь тот же «открытый ключ» и, следовательно, тот же адрес, что и человек с пробегом = 1 миля.

Групповая арифметика EC удивительно похожа на это, но вместо 999 999 у нас есть кажущееся произвольным число, указанное выше! Благодаря этому свойству, даже с вашими разными «закрытыми ключами», вы сможете создавать подписи, которые проверяются на одном и том же открытом ключе, и, следовательно, тратить ETH с одного и того же адреса!

Скучное математическое объяснение

Закрытые ключи представляют собой 256-битные числа, и для вычисления открытого ключа из закрытого ключа вы умножаете его на генератор gгруппы эллиптических кривых. Используемый генератор определяется в параметрах библиотек secp256k1, используемых в ETH. Сама она также является точкой эллиптической кривой, а поскольку эллиптические кривые цикличны, существует nтакое, что n.g = 1(это называется порядком генератора).

С помощью этого уравнения мы можем видеть, что если бы у нас был закрытый ключ kс k>n, у нас было бы k.g = (k-n).g = k'.g, потому k'что это, возможно, чей-то закрытый ключ! Таким образом, у нас есть ключи, сгенерированные случайным образом по модулю n, а не 2^256.

Ваша аналогия с часами была полезной.
@eth О, извините, хороший крик, я отредактирую, чтобы включить аналогии!
Спасибо за ваше объяснение! Это ясно и легко понять! Расширенный вопрос, если вы не возражаете: вы знаете, почему изобретатели решили «урезать» открытый ключ до 160-битного, чтобы он стал адресом? Не лучше ли использовать исходный 256-битный открытый ключ в качестве адреса? Спасибо!
@SiuChingPong-AsukaKenji- Я думаю, что Эфириум в основном сделал это для отражения биткойнов, но в нижней части этого Виталик говорит, что это потому, что другие части Эфириума имеют только 128-битную безопасность, поэтому более длинный хэш был бы бессмысленным, потому что это уже не самое слабое звено в система :)
@bekah Спасибо, но теперь я еще больше запутался. Означает ли это, что только 128 бит из 160-битного адреса фактически эффективны? Если нет, то где применяются упомянутые вами 128-битные? Спасибо!
@SiuChingPong-AsukaKenji - это просто способ просмотреть безопасность Ethereum - то, как генерируются подписи, означает, что они предлагают только 128-битную безопасность из-за используемой групповой / эллиптической кривой (secp256k1), поэтому я думаю, что причина в том, что hash может быть 256-битным, 160-битным или 129-битным, но эллиптическая кривая все равно будет атакована/сломана первой. С хэшем > 128 бит потребуется больше времени для грубой силы хэша, чем для эллиптической кривой, но если бы у нас была хеш-функция, например, 112 бит, то побитовая безопасность системы была бы 112, и первым выбором людей для атаки был бы хэш-функция.
Я думаю, что вопрос не в том, как разные закрытые ключи могут создавать один и тот же открытый ключ (что верно), а в том, как разные закрытые ключи могут создавать один и тот же адрес. Получение одного и того же открытого ключа из разных закрытых ключей — один из способов получить это, но я думаю, что вопрос больше в том, как разные открытые ключи могут привести к одному и тому же адресу, поскольку адрес — это усеченный открытый ключ.
+1 за предоставление как «интересных», так и «скучных» объяснений для разных аудиторий.
разве это не так: один и тот же закрытый ключ создает один и тот же адрес, что считается плохой вещью и может практически сделать сеть ethereum нефункциональной?

Мой пересмотренный ответ на основной вопрос заголовка заключается в том, что неизбежно существует 2 ^ 96 ключей, которые будут создавать коллизии адресов, потому что ограничение на адресное пространство составляет 2 ^ 160, а пространство ключей составляет почти 2 ^ 256. Таким образом, несмотря на то, что каждый отдельный открытый ключ и получающийся в результате хеш-дайджест Keccak однозначно сопоставляются только с одним закрытым ключом, учитывая использование Keccak на этапах форматирования адреса, применяется принцип «ячейки» и создается возможность коллизии 160-битных замыкающих битов для двух разных ключей. хеш-дайджесты, которые разделяют последние 160 бит, подробнее об этих предположениях ниже:

Для любого действительного отдельного закрытого ключа (от 1 до n-1, где n = '0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'согласно кривой secp256k1 будет сгенерирован «отличный» открытый ключ (после применения точки Генератора для обертывания вокруг кривой) и, таким образом, нет возможности для коллизий, поскольку никакие два разных закрытые ключи могут сопоставляться с одним и тем же открытым ключом.

В официальном репозитории ethereum на Github есть библиотека eth-keys для Python, которая генерирует закрытые ключи и имеет проверку на наличие ошибок, чтобы убедиться, что секретный показатель меньше n.

Что касается конфликтов адресов:

Если первое вышеприведенное предположение верно, то вероятность того, что два разных открытых ключа создадут дайджест Keccak_256 с идентичными 160 битами в конце, будет сравнима (хотя и менее вероятна) с попыткой найти любые две случайные строки с помощью поиска методом грубой силы, который производят идентичные 160 завершающих битов в своих соответствующих хеш-дайджестах.

Такие частичные коллизии хеш-дайджеста Keccak_256, безусловно, должны существовать, несмотря на непрактичные шансы найти такой длинный, сравнимый с генератором тщеславных адресов Эфириума, пытающимся сгенерировать все 40 символов в соответствии с конкретным требованием (например, 40 единиц или следующий совершенно действительный адрес, который никто не знает). вероятно, когда-либо будет сгенерирован ключ для без достаточно сильного квантового компьютера ' 0xFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED ')) который будет иметь сложность 1461501637330902918203684832716283019655932542976 равно 2^160 или 16^40 (т. тщеславный адрес).

Хотя по-прежнему невозможно (моя оценка составляет 2 ** 160) найти два шестнадцатеричных дайджеста Keccak_256, которые имеют одинаковые конечные 40 шестнадцатеричных символов для любых двух случайных прообразов, в этом случае потребуется найти два разных открытых ключа ethereum (как pre-images), которые хешируются в два разных дайджеста Keccak_256, которые имеют одни и те же 40 завершающих шестнадцатеричных символов.

Следовательно, принцип сортировки применим, но не к самой кривой, поскольку существуют nпотенциальные закрытые ключи, которые четко отображаются на nоткрытые ключи (пространство ключей равно 2 ^ 256-432420386565659656852420866390673177326, за вычетом некоторых недействительных, таких как все 0), без каких-либо одиночных коллизий. , но вместо этого неизбежно возникают коллизии на производных адресах (поскольку отдельное адресное пространство составляет 2 ^ 160, я теоретически не уверен, сколько таких частичных коллизий может существовать в дайджестах Keccak_256 (поэтому я размещаю эту часть на crypto.stackexchange для более глубокого погружения ).

Идея : один из способов решить эту проблему — использовать весь Keccak Digest в качестве адреса эфириума, хотя компромисс может заключаться в том, что будут последствия для затрат на газ и другие потери эффективности, такие как потребность в большем объеме хранения данных, поскольку блокчейн получит раздутый для каждого адреса на 96 бит и всех связанных транзакций аккаунта (и такое увеличение быстро составило бы килобайты, гигабайты, терабайты разницы).