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

Резюме

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

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

Вопрос

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

Подробнее

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

  

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

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

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

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

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

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

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

18 голосов | спросил Siu Ching Pong -Asuka Kenji- 16 32016vEurope/Moscow11bEurope/MoscowWed, 16 Nov 2016 09:37:53 +0300 2016, 09:37:53

1 ответ


17

Ваши вычисления правы, за исключением того, что не существует точно 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 человек, человек с миль = 1000,001 будет иметь один и тот же «открытый ключ» и, следовательно, тот же адрес, что и человек с милями = 1.

Арифметика группы EC удивительно похожа на это, но вместо 999999 мы имеем, казалось бы, произвольное число, указанное выше! Из-за этого свойства, даже с вашими «секретными ключами», вы сможете создавать сигнатуры, которые проверяются на один и тот же открытый ключ, и, следовательно, тратить ETH с одного и того же адреса.

Обоснование математического объяснения

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

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

ответил bekah 25 52016vEurope/Moscow11bEurope/MoscowFri, 25 Nov 2016 00:18:52 +0300 2016, 00:18:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132