Skip to content

Instantly share code, notes, and snippets.

@miguelmota
Last active March 12, 2024 11:45
Show Gist options
  • Star 43 You must be signed in to star a gist
  • Fork 23 You must be signed in to fork a gist
  • Save miguelmota/3793b160992b4ea0b616497b8e5aee2f to your computer and use it in GitHub Desktop.
Save miguelmota/3793b160992b4ea0b616497b8e5aee2f to your computer and use it in GitHub Desktop.
Generate Ethereum Private key, Public key, and Address using Bash and OpenSSL
# 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
@ciscolxh
Copy link

How to get keccak-256sum command in mac os?

@miguelmota
Copy link
Author

miguelmota commented May 12, 2018

@ciscolxh https://github.com/maandree/sha3sum

on OSX, you can do brew install sha3sum to get the keccak-256sum command.

@Cheny-chen
Copy link

How to convert from existing key to publicKey.pem. The pem format.

@KasraAhmadi
Copy link

How to format public key to "secp256 compressed form - 66 characters" form?

@miguelmota
Copy link
Author

@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

@avhacker
Copy link

avhacker commented Nov 7, 2019

The letters in public address in this script is all lower cased. Can you make it right? (I know lower case key still works)

@Afsha79
Copy link

Afsha79 commented Jun 26, 2021

Hi

@navdissenyo
Copy link

Hello, How to create eth private key from eth wallet address or public key?

@miguelmota
Copy link
Author

miguelmota commented Jul 6, 2021

@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.

@lau-bin
Copy link

lau-bin commented Jan 24, 2022

you can replace keccak-256sum -x -l with the commonly builtin sha256sum

@lau-bin
Copy link

lau-bin commented Jan 24, 2022

you can replace keccak-256sum -x -l with the commonly builtin sha256sum

@nicexe
Copy link

nicexe commented Mar 9, 2022

@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.

@hell0men
Copy link

Ubuntu:

cat pub | keccak-256sum -x -l | tr -d ' -' | tail -c 41 > address
keccak-256sum: command not found

@dhruvio
Copy link

dhruvio commented Aug 9, 2023

@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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment