-
-
Save miguelmota/3793b160992b4ea0b616497b8e5aee2f to your computer and use it in GitHub Desktop.
# Generate the private and public keys | |
openssl ecparam -name secp256k1 -genkey -noout | openssl ec -text -noout > key | |
# Extract the public key and remove the EC prefix 0x04 | |
cat key | grep pub -A 5 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^04//' > pub | |
# Extract the private key and remove the leading zero byte | |
cat key | grep priv -A 3 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^00//' > priv | |
# Generate the hash and take the address part | |
cat pub | keccak-256sum -x -l | tr -d ' -' | tail -c 41 > address | |
# (Optional) import the private key to geth | |
geth account import priv |
How to convert from existing key to publicKey.pem. The pem format.
How to format public key to "secp256 compressed form - 66 characters" form?
@Cheny-chen not sure how to do it with OpenSSL; here's an example using Node:
const KeyEncoder = require('key-encoder').default
const keyEncoder = new KeyEncoder('secp256k1')
const pubKey = Buffer.from('04997d9778d772bee04e01522c00d7d52371bd1a27cd87f6cf6f9c828d3a6d0d0da661b58f035aef01db4d7ad1c837ac28f3dec50f54bd351d090db6cb85069cc7', 'hex')
const pem = keyEncoder.encodePublic(pubKey.toString('hex'), 'raw' ,'pem').toString()
console.log(pem)
/*
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmX2XeNdyvuBOAVIsANfVI3G9GifNh/bP
b5yCjTptDQ2mYbWPA1rvAdtNetHIN6wo897FD1S9NR0JDbbLhQacxw==
-----END PUBLIC KEY-----
*/
const raw = keyEncoder.encodePublic(pem, 'pem' ,'raw').toString('hex')
console.log(raw)
// 04997d9778d772bee04e01522c00d7d52371bd1a27cd87f6cf6f9c828d3a6d0d0da661b58f035aef01db4d7ad1c837ac28f3dec50f54bd351d090db6cb85069cc7
The letters in public address in this script is all lower cased. Can you make it right? (I know lower case key still works)
Hi
Hello, How to create eth private key from eth wallet address or public key?
@navdissenyo it's not possible to reconstruct a private key from the public key or address because they are generated using a one-way function.
you can replace keccak-256sum -x -l with the commonly builtin sha256sum
you can replace keccak-256sum -x -l with the commonly builtin sha256sum
@lau-bin you cannot really substitute one for another. Because of the slight differences in how each digest algorithm works, this results in a different hash.
Ubuntu:
cat pub | keccak-256sum -x -l | tr -d ' -' | tail -c 41 > address
keccak-256sum: command not found
@miguelmota Thanks for putting this together. I implemented this for people to use in 1 line if they have NixOS or the Nix package manager installed:
nix run \
github:realfolk/nix?dir=lib/packages/generate-ethereum-account \
PATH_TO_STORE_PUBLIC_KEY \
PATH_TO_STORE_PRIVATE_KEY
Create address with checksum (EIP 55): 0xcf8e7afab9576f3bd85885065aecd479d35f4d70
-> 0xCf8e7aFAB9576F3Bd85885065aeCD479D35F4d70
address=$(cat address)
hash=$(echo -n "$address" | keccak-256sum | tr -d ' -')
checksum_address=""
for i in $(seq 0 39); do
char="${address:$i:1}"
hash_char="${hash:$i:1}"
if [[ "$char" =~ [0-9] ]]; then
checksum_address+="$char"
elif (( 0x$hash_char >= 8 )); then
checksum_address+="${char^^}"
else
checksum_address+="$char"
fi
done
Lost my Trc20 private key how to recover it ??
@ciscolxh https://github.com/maandree/sha3sum
on OSX, you can do
brew install sha3sum
to get thekeccak-256sum
command.