Я использую кошелек Mist .
Я бы хотел знать:
Вы можете использовать функцию MyEtherWallet или MyCrypto (форк MyEtherWallet) автономного кошелька «просмотреть сведения о кошельке» для извлечения закрытого ключа из json-файла кошелька. Не стесняйтесь использовать его автономную версию на компьютере с воздушным зазором, чтобы защитить свой закрытый ключ.
Редактировать: MyCrypto теперь предоставляет эту функцию только в автономной версии кошелька из-за очевидных проблем безопасности, связанных с получением закрытого ключа с интернет-сайта на подключенном компьютере. Итак, вас предупредили, что вы должны делать это только на компьютере с воздушным зазором.
Если у вас есть node.js, вы можете сделать это в узле
var keyth=require('keythereum')
//установить keythereum, запустив "npm install keythereum"
var keyobj=keyth.importFromFile('0x...ваш..эфирный..адрес..','./Appdata/roaming/ethereum')
«./Appdata/roaming/ethereum» — это папка, содержащая «хранилище ключей». importFile ищет «хранилище ключей» в этой папке.
var privateKey=keyth.recover('your_password',keyobj) // это занимает несколько секунд
privateKey.toString('шестнадцатеричный')
aes-128-ctr is not available
: github.com/ethereumjs/keythereum/issues/73Я постараюсь предоставить альтернативное решение, более «практическое», чем использование конкретного приложения или JavaScript. Мне кажется, что отсутствие «практических» деталей может быть одной из причин, по которой похожие вопросы продолжают появляться (и в конечном итоге за них проголосовали и перенаправили сюда - см. список связанных вопросов).
Шаги здесь сильно зависят от ответов на этот вопрос .
Данный
выход:
со ступеньками
В основном мы будем использовать оболочку unix/linux и python3 (>3.6 для поддержки scrypt) для упрощения Keccak и scrypt.
Чтобы упростить воспроизведение шагов, мы создаем тестовый закрытый ключ со значением «1» (не делайте этого в рабочей среде).
# create a temp work directory
cd $(mktemp -d)
echo "0000000000000000000000000000000000000000000000000000000000000001" > plain_key.txt
geth --datadir . account import plain_key.txt
Geth запросит новый пароль. Введите простую букву «а» (не используйте в рабочей среде), которая будет использоваться позже при расшифровке.
Geth должен вывести
Address: {7e5f4552091a69125d5dfcb7b8c2659029395bdf}
на который, что интересно, часто поступают средства . Geth также должен был создать файл в папке ./keystore/UTC-<< timestamp >>-7e5f4552091a69125d5dfcb7b8c2659029395bdf:
$ cat keystore/UTC*
{
"address":"7e5f4552091a69125d5dfcb7b8c2659029395bdf",
"crypto":{
"cipher":"aes-128-ctr",
"ciphertext":"f97975cb858242372a7c910de23976be4f545ad6b4d6ddb86e54b7d9b3b1c6a1",
"cipherparams":{
"iv":"7fa01f1d0d6a7117382632028cb0c323"
},
"kdf":"scrypt",
"kdfparams":{
"dklen":32,
"n":262144,
"p":1,
"r":8,
"salt":"859c5d345ee58dfca293950c540016af3a889d0dacb00b8eff2ac2b150f0b07e"
},
"mac":"31ccb67e48aba5d64bf727a5c6589fd5857021540d25d12df31323f10ae2bf97"
},
"id":"dc74bc44-784b-4293-b1c7-b91e9fd7d6cc",
"version":3
}
(примечание: приведенный выше вывод был отформатирован для лучшего отображения) На этом настройка теста завершена. Далее расшифровываем приватный ключ известным паролем «а», и сравниваем результат с ожидаемым значением «1».
Как объяснено в ответах на этот вопрос здесь ,
В нашем примере функция получения ключа — scrypt. Мы используем Python3 для расшифровки.
python3
>>> import hashlib
>>> dec_key = hashlib.scrypt(bytes('a', 'utf-8'), salt=bytes.fromhex('859c5d345ee58dfca293950c540016af3a889d0dacb00b8eff2ac2b150f0b07e'), n=262144, r=8, p=1, maxmem=2000000000, dklen=32)
Обратите внимание, что мы взяли вводимый пользователем пароль «a» вместе с параметрами «salt», «n», «r», «p», «dklen», значения которых взяты из файла хранилища ключей. Результат должен быть
>>> print(dec_key)
b'\xaeC\xdd\x02\xf98$h\x0b\x00\xfb\x83\x0c\xb9?\x04\xdd5\x91p\xfaM\xd4\xb7Ks\x9f0\xd3\xb1\xec\xd4'
Поле «mac» файла хранилища ключей можно использовать для проверки результата последнего шага, который должен быть 32-байтовым массивом. Согласно документации , первые 16 байт предназначены для следующего шага (расшифровки необработанного ключа), вторые 16 байт, объединенные с шифротекстом, после прохождения хеширования Keccak результат должен соответствовать «mac».
>>> validate = dec_key[16:] + bytes.fromhex('f97975cb858242372a7c910de23976be4f545ad6b4d6ddb86e54b7d9b3b1c6a1')
>>> from Crypto.Hash import keccak
>>> keccak_hash=keccak.new(digest_bits=256)
>>> keccak_hash.update(validate)
>>> print(keccak_hash.hexdigest())
31ccb67e48aba5d64bf727a5c6589fd5857021540d25d12df31323f10ae2bf97
Вывод соответствует «mac», что подтверждает правильность введенного пользователем пароля.
Этот шаг представляет собой простую расшифровку AES. Можно использовать множество инструментов, например openssl. Здесь для простоты мы продолжаем с Python3.
>>> from Crypto.Cipher import AES
>>> from Crypto.Util import Counter
Теперь введите значение «начальный вектор» из файла хранилища ключей:
>>> iv_int=int('7fa01f1d0d6a7117382632028cb0c323', 16)
>>> ctr = Counter.new(AES.block_size * 8, initial_value=iv_int)
>>> dec_suite = AES.new(key, AES.MODE_CTR, counter=ctr)
Наконец, введите зашифрованный текст и первые 16 байт ключа деривации:
>>> plain_key = dec_suite.decrypt(bytes.fromhex('f97975cb858242372a7c910de23976be4f545ad6b4d6ddb86e54b7d9b3b1c6a1'))
>>> print(plain_key)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
Это соответствует известному «секретному» значению 1.
dec_suite = AES.new(dec_key,...
. Также мне пришлось использоватьplain_key.hex()
dec_suite
не дает мне правильного результата. Переменная mac
соответствует, так что до этого момента она верна.Я предполагаю, что ваш туманный клиент запускает узел geth в фоновом режиме.
Экспорт незашифрованного ключа намеренно не поддерживается, учитывая риск для конечных пользователей. #1054
К сожалению, не представляется возможным извлечь незашифрованный закрытый ключ.
Если вы получили файл ключа в хранилище ключей, то это ваш закрытый ключ, зашифрованный паролем (плюс другие метаданные). На самом деле нет необходимости экспортировать ваш фактический закрытый ключ ec (если вы не хотите делать с ним математику или я не знаю). Однако вам нужно знать свой пароль. Вы можете скопировать ключ на другой клиент или машину. Если вы разблокируете учетную запись, вы можете использовать этот адрес для подписи транзакций, ... r/cvckff5
Если вы хотите копнуть глубже, вы можете попробовать:
Вы можете использовать инструмент web3 CLI , чтобы сделать это легко:
web3 account extract --keyfile ~/Downloads/keystore-file --password password
ethkey
Инструмент ethereum/go-ethereum может сделать это:
> ethkey inspect --private --passwordfile kottipass.txt UTC--2019-01-30T14-49-18.711193885Z--e5dfD67E3d46De4e2C918d894FdC591793492E53
Address: 0xe5dfD67E3d46De4e2C918d894FdC591793492E53
Public key: 046ab6d31f00e43df04226fbf8b16c62eed80eec200ac5d7f247fc3d15f3d1a27f7e9f74a214e7ddcef8a3618853622fd37354080959b17fe36d82a46a8c0aa41e
Private key: 0e459e429c4e36769e0ba7fad5acd3ac8627b9404a1f96f0a003fb22206c2d1d
Вы также можете использовать функции кошелька на EthTools.com.
Этот инструмент загружает сведения о вашем адресе из файла ключей и отображает их в удобной для использования форме.
Выберите (или введите) ваш ключевой файл
Нажмите «Дополнительно», чтобы просмотреть свой закрытый ключ.
Использование этого инструмента также объясняется здесь в формате видео.
Из этого поста: Экспорт закрытого ключа Parity . Эта программа go на github https://github.com/afterether/eacct очень помогла получить закрытый ключ для моей учетной записи Kovan. Большинство других упомянутых ссылок больше не поддерживают получение закрытых ключей, а дают мне только хранилища ключей.
Вы также можете получить список учетных записей с их закрытыми ключами, используя следующий скрипт:
Install keythereum: npm install keythereum
Создайте файл getPrivateKey.js и добавьте в него следующие строки.
const keythereum = require('keythereum');
const async = require('async');
const datadir = 'path/to/datadir/where/keystore/is/located';
const accounts = [ ]; // add the account addresses whose private key has to be extracted
let keyObject, privateKey, count = 0;
let result = [];
async.forEach(accounts, (element, cb) => {
keyObject = keythereum.importFromFile(element, datadir);
privateKey = keythereum.recover('accountPassword', keyObject);
result.push({
address: element,
privateKey: privateKey.toString('hex')
});
console.log('result: \n', result[count]);
count++;
cb();
},() => {
console.log('inside final callback of async.forEach: ');
console.log('result array: ', result);
});
Сценарий использует keythereum , пожалуйста, просмотрите его для более подробной информации.
Execute the script using: node getPrivateKey.js
Пол Разван Берг
Николя Массар
Николя Массар
Пол Разван Берг