Как проверить закрытый ключ?

Я не смог найти ни одной библиотеки, которая, учитывая шестнадцатеричное значение, возвращает true, если данная строка является действительным закрытым ключом эфира.

Любые подсказки?

Ответы (3)

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

Он должен быть действителен для кривой secp256k1, что означает два условия:

  • не может быть нулем
  • должен быть меньше порядка кривой (называется nи имеет значение ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141)

В Javascript вы можете использовать ethereumjs-wallet для этой проверки: Wallet.fromPrivateKey(<yourkey>)будет выдано исключение при недопустимом вводе.

В качестве альтернативы вы также можете использовать privateKeyVerify()метод из базовой библиотеки secp256k1или сделать это вручную с помощью библиотеки больших чисел по вашему выбору.

важно : этот ответ относится к общедоступному адресу, а не к закрытому ключу, см. комментарии.

Каждая шестнадцатеричная строка является действительным адресом Ethereum.

В настоящее время контрольные суммы адресов не реализованы, поэтому все 0x<40 hex digits here>они действительны. Мы рассматриваем возможность добавления базового ICAP в Geth 1.4.1 или Geth 1.5, чтобы разрешить вставку дополнительной информации в адрес, который предотвратит их опечатку, но до тех пор, пока он состоит из 40 шестнадцатеричных символов, он действителен.

Судя по вашему ответу, вы говорите об общедоступных адресах. Закрытые ключи имеют длину 64. Я неправильно понимаю?
Ах, действительно, вы правы, я пропустил приватную часть. Тем не менее, ответ более или менее тот же. Необработанный закрытый ключ представляет собой простой 256-битный случайный двоичный объект. Поэтому, если вы хотите проверить необработанные ключи, все допустимо. Однако пересылка необработанных ключей чрезвычайно опасна, поэтому люди склонны создавать файлы ключей и использовать их для передачи зашифрованных ключей. Спецификация для этого находится на github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition . Однако для полной проверки содержимого файла вам понадобится пароль для его расшифровки + клиент, который сможет его обработать. Каков ваш вариант использования?
Оки, может быть, отредактируй свой ответ, чтобы я мог проголосовать. Мой пример использования: отсканируйте QR, верните true, если это действительный закрытый ключ для эфириума. Для незашифрованных ключей я достиг этого с помощью `var patt = new RegExp(/^[a-f0-9]{64}$/i); var res = patt.test(privateKey);` Для зашифрованных ключей все зависит от того, как они зашифрованы. Я спросил также у ребят из myetherwallet.com. Что ты предлагаешь? Есть ли регулярное выражение для его обнаружения?

Вы также можете использовать эфиры для проверки. Как это:

const ethers = require('ethers')

var pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cf'
let w = new ethers.Wallet(pk)

// Shorter than 32 bytes
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16'
w = new ethers.Wallet(pk)

// Incorrect hexidecimal string. Change last f to g. G is not hex 
pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cg'
w = new ethers.Wallet(pk)

Первый случай в порядке и будет успешным.

Второй выдаст ошибку

  reason: 'exactly 32 bytes required',
  code: 'INVALID_ARGUMENT',

Третий тоже выдаст ошибку:

  reason: 'invalid hexidecimal string',
  code: 'INVALID_ARGUMENT',

Вы можете поймать эту ошибку, чтобы проверить свой privateKey

pk = '0xcaed41dd92c1548cf7536c290e6a1871757fb5fea5721dea3a08c6d4abcd16cg'
try {
    w = new ethers.Wallet(pk)
}
catch (e) {
    console.log('Invalid private key.')
}