Vanity adress – matoken's blog https://matoken.org/blog Is there no plan B? Tue, 18 Apr 2023 09:34:42 +0000 ja hourly 1 https://wordpress.org/?v=7.0.1 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg Vanity adress – matoken's blog https://matoken.org/blog 32 32 OpenSSH ED25519 の Vanity Adress を探してみる https://matoken.org/blog/2023/04/18/openssh-ed25519-vanity-adress/ https://matoken.org/blog/2023/04/18/openssh-ed25519-vanity-adress/#respond Mon, 17 Apr 2023 21:33:00 +0000 https://matoken.org/blog/?p=3891

以前何種類かのVanity Adress を掘ってみました.

ふとSSH鍵のVanity Adress はどうだろうと試してみました.

鍵はEd25519 .鍵ペアの公開鍵がいい感じだと良さそうな気がします.

OpenSSH ssh-keygen

まずはOpenSSH の ssh-keysign で作ってみます.大文字小文字いずれかの mat0 が見つかるまで作成しています.

$ umask 277; no=0; tmp=`mktemp -d -p ~/tmp/`; chmod 700 ${tmp}; while true;do no=$(($no + 1)); ssh-keygen -t ed25519 -f ${tmp}/${no} -N '' -C '' > /dev/null; grep -i -E m[a@]t[o0] ${tmp}/${no}.pub && echo ${tmp}/${no} && break; done
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOt6L8+9eF3T8o/M4BnDVZ5F7SVdPmat0hlM8s/8zV/r
/home/matoken/tmp/tmp.rGb5eSpEaJ/26016

26016鍵ペアを生成したところで186秒ほど,大体140.6keys/sec くらい.遅い感じ?vmstat やtop を見てもcpu はあまり使えていない感じです.
-a 1 (default:16) にすると160.8/keys/sec と少し早くなりましたが鍵を盗まれた場合の強度が下がると思うのでやめたほうが良さそうです.

ssh-keygen-ed25519-vanity

tool を探してみます.

clone&build
$ git clone https://github.com/ionathanch/ssh-keygen-ed25519-vanity
$ cd ssh-keygen-ed25519-vanity
$ make
run
$ ./vanity mato
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEHmibZNyKuT/GO9rloS8qmatoFOZ4N7fJcRSOPCwsky
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZWQyNTUxOQAAACBB5om2Tcirk/xjva5aEvKpmraBTmeDe3yXEUjjwsLJMgAAAIjwyswa8MrMGgAAAAtzc2gtZWQyNTUxOQAAACBB5om2Tcirk/xjva5aEvKpmraBTmeDe3yXEUjjwsLJMgA
AAEBro42f/ycDTNvMw3JHIGD5dzg+VVgshQw+RWIhN/I2WEHmibZNyKuT/GO9rloS8qmatoFOZ4N7fJcRSOPCwskyAAAAAAECAwQF
-----END OPENSSH PRIVATE KEY-----

shell でssh-keygen を回すより速そうです.更にREADME にはmoreutils のparallel を使って並列実行する方法も書かれていました.

$ time parallel -n 0 ./vanity vanity -- 1 2 3 4

以下はREADME にあった文字数によりどのくらい時間がかかるかの目安です.

Rough performance stats
Obviously since it’s brute force the times are probabilistic, but this gives you an idea of how feasible it would be to find your desired number of characters.

Substring Time (s)

a

0.002

ar

0.015

ars

0.501

arso

3.753

arson

abandon all hope ye who seek five sequential characters

大分速いような気がしますがアドレスの指定が固定なようで大文字小文字どっちでもとか代替記号でもいいなどといったことが出来なそうです.

vanity-keygen

また別のものも試してみます.

clone&build
$ go install github.com/pcarrier/vanity-keygen@latest
$ vanity-keygen -h
Usage of vanity-keygen:
  -cpuprofile string
        write cpu profile to file
  -threads int
        number of threads to run (default 4)
run
$ time vanity-keygen -threads `nproc` [mM][aA@][tT][oO0]
2023/04/05 08:30:06 Looking for a public key matching [mM][aA@][tT][oO0]
2023/04/05 08:30:06 Public key:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA2rzJZSoqwrVF/Pf2FzKgfL/eMATOI/V7bjdmqkGV5B
2023/04/05 08:30:06 Private key:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtz
c2gtZWQyNTUxOQAAACANq8yWUqKsK1Rfz39hcyoHy/3jAEziP1e243ZqpBleQQAA
AIiaywRCmssEQgAAAAtzc2gtZWQyNTUxOQAAACANq8yWUqKsK1Rfz39hcyoHy/3j
AEziP1e243ZqpBleQQAAAEDBsKpzquKe0/QTheaoVSChK8gF6d38u5mwrtqihfMY
6A2rzJZSoqwrVF/Pf2FzKgfL/eMATOI/V7bjdmqkGV5BAAAAAAECAwQF
-----END OPENSSH PRIVATE KEY-----

real    0m0.331s
user    0m0.652s
sys     0m0.048s

このツールはスレッド数も指定できるし,アドレスの指定も柔軟なので良さそうです.

$ vanity-keygen aaaaa
2023/04/05 08:30:12 Looking for a public key matching aaaaa
2023/04/05 08:30:13 Generated 71,000 keypairs (69,788 Hz)
2023/04/05 08:30:14 Generated 141,000 keypairs (70,310 Hz)
2023/04/05 08:30:15 Generated 212,000 keypairs (70,454 Hz)
2023/04/05 08:30:16 Generated 284,000 keypairs (70,792 Hz)
2023/04/05 08:30:17 Generated 356,000 keypairs (71,040 Hz)

探索中にどのくらいの鍵を生成したかも表示されます.

良さそうなのでTor のときのように少電力なSBCのRaspberry Pi 3 modelB でも試してみました.

Raspberry Pi OS armhf 向けにamd64 環境でクロスビルド
$ GOARCH=arm GOARM=7 go build .
$ file ./vanity-keygen
./vanity-keygen: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, Go BuildID=Z_Cr4XM48GAIHSA-MQng/2wFeSpgr5k0WPASNS4ho/3FEwAtva33LS2ByXLcjP/0WSk_fEc6xXCDZEo89yH, with debug_info, not stripped
Pi3Bで実行
$ ./vanity-keygen -threads 4 aaaa
2023/04/05 08:22:58 Looking for a public key matching aaaa
2023/04/05 08:22:59 Generated 0 keypairs (0 Hz)
2023/04/05 08:23:00 Generated 4,000 keypairs (1,991 Hz)
2023/04/05 08:23:01 Generated 4,000 keypairs (1,332 Hz)
2023/04/05 08:23:02 Generated 8,000 keypairs (1,990 Hz)
2023/04/05 08:23:03 Generated 8,000 keypairs (1,598 Hz)
^C
$ cat /proc/device-tree/model && echo
Raspberry Pi 3 Model B Rev 1.2

……大分遅くなりました.PCで実行したほうが良さそうです.

まとめ

気に入った鍵が出来たらパスフレーズを設定したり,

$ ssh-keygen -p -f ./key
Key has comment ''
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

コメントを書き換えたりしましょう.

$ ssh-keygen -c -f ./key
Enter passphrase:
Old comment:
New comment: vanity
Comment 'vanity' applied

Tor のVanity adoress なんかに比べるとあまり目立たないですが,hostkey やGitHub/Lab などで一般公開している鍵に使うのはありではと思います.

環境

$ cpu-info
Packages:
        0: Intel Core i5-7300U
Microarchitectures:
        2x Sky Lake
Cores:
        0: 2 processors (0-1), Intel Sky Lake
        1: 2 processors (2-3), Intel Sky Lake
Logical processors (System ID):
        0 (0): APIC ID 0x00000000
        1 (2): APIC ID 0x00000001
        2 (1): APIC ID 0x00000002
        3 (3): APIC ID 0x00000003
$ lsb_release -dr
No LSB modules are available.
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
$ arch
x86_64
]]>
https://matoken.org/blog/2023/04/18/openssh-ed25519-vanity-adress/feed/ 0
Nostr の Vanity address を掘る https://matoken.org/blog/2023/03/01/nostr-vanity-adress/ https://matoken.org/blog/2023/03/01/nostr-vanity-adress/#comments Wed, 01 Mar 2023 13:42:34 +0000 https://matoken.org/blog/?p=3864

Nostr という分散型SNSのプロトコルがあって最近良く見かけます.

このSNSの個人認識に秘密鍵と公開鍵のペアを作成してそれを利用します.鍵ペアは初回に自動生成されるのですが,公開鍵の文字列をたくさん計算して好みのアドレスが含まれたアドレスを掘るプログラムがあったので試してみました.

このプログラムはbech32で表現される公開鍵の npub1 の後ろの文字列を任意の文字列から始まるものにしたいというvanity アドレスを彫りたい人向けのものです.

導入

cargo insrtall で導入できるはずですが,手元のDebian bookworm testing amd64 環境ではrustc が 1.63 に対してrana は 1.64.0 以上が必要だということで古くて失敗しました.

$ cargo install rana
    Updating crates.io index
  Installing rana v0.5.1
  Downloaded is-terminal v0.4.4
  Downloaded clap_lex v0.3.2
  Downloaded syn v1.0.109
  Downloaded bip39 v1.2.0
  Downloaded 4 crates (346.5 KB) in 2.86s
error: failed to compile `rana v0.5.1`, intermediate artifacts can be found at `/tmp/cargo-installvCF9z2`

Caused by:
  package `clap_derive v4.1.0` cannot be built because it requires rustc 1.64.0 or newer, while the currently active rustc version is 1.63.0
  Try re-running cargo install with `--locked`
$ dpkg-query -W rustc
rustc   1.63.0+dfsg1-2

Rust Forge で新しいStable(1.67.1)を貰ってきて使おうかとも思いましたが,インストーラーを叩く形で環境が汚れそうで少し面倒そう.

Docker を使うことにします.

公式イメージだけあって最新の 1.67.1 です.rana もさくっと動きました.

$ script ./nostr_vanity.log
$ docker run --rm -it rust
# rustc --version
rustc 1.67.1 (d5a82bbd2 2023-02-07)
# adduser matoken
# su - matoken
$ export PATH=/usr/local/cargo/bin:$PATH
$ rustup default stable
$ cargo install rana
$ rana --help
Rana 🐸

      o  o
     ( -- )
  /\( ,   ,)/\
^^   ^^  ^^   ^^

A simple CLI to generate nostr vanity addresses

Francisco Calderón <negrunch@grunch.dev>

Usage: rana [OPTIONS]

Options:
  -d, --difficulty <DIFFICULTY>
          Enter the number of starting bits that should be 0. [default: 0]
  -v, --vanity <VANITY_PREFIX>
          Enter the prefix your public key should have when expressed
          as hexadecimal. [default: ]
  -n, --vanity-n-prefix <VANITY_NPUB_PREFIXES_RAW_INPUT>
          Enter the prefix your public key should have when expressed
          in npub format (Bech32 encoding). Specify multiple vanity
          targets as a comma-separated list. [default: ]
  -s, --vanity-n-suffix <VANITY_NPUB_SUFFIXES_RAW_INPUT>
          Enter the suffix your public key should have when expressed
          in npub format (Bech32 encoding). Specify multiple vanity
          targets as a comma-separated list. [default: ]
  -c, --cores <NUM_CORES>
          Number of processor cores to use [default: 4]
  -r, --restore <MNEMONIC>
          Restore from mnemonic to public private key [default: ]
  -g, --generate <WORD_COUNT>
          Generate mnemonic using wordcount. Should be 12,18 or 24 [default: 0]
  -p, --passphrase <MNEMONIC_PASSPHRASE>
          Passphrase used for restoring mnemonic to keypair [default: ]
  -q, --qr
          Print QR code of the private key
  -h, --help
          Print help
  -V, --version
          Print version

why can’t we use characters b, i, o, or 1?
the characters have to be in the bech32 character set.

— nostrogen
https://github.com/tonyinit/nostrogen#why-cant-we-use-characters-b-i-o-or-1

公開鍵は Bech32 形式で 023456789acdefghjklmnpqrstuvwxyz が利用できます.以下は Bech32 で使えない o を使って怒られた例です.

$ rana --vanity-n-prefix matok
thread 'main' panicked at 'The vanity npub prefix can only contain characters supported by Bech32: 023456789acdefghjklmnpqrstuvwxyz', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rana-0.5.1/src/cli.rs:146:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

oを0に置き換えて動かしてみます.

$ rana --vanity-n-prefix mat0k | tee rana.log
Started mining process for vanity bech32 prefix[es]: 'npub1["mat0k"]' (estimated pow: 20)
Benchmarking of cores disabled for vanity npub key upon proper calculation.
Mining using 4 cores...

さて,これで待っていれば鍵が掘れるのですが,以下のように新しいラップトップで以下のような速度で掘れるとのことです.あまり長くするとなかなか掘れないので気をつけましょう.

how fast will nostrogen find my addresses?
this depends entirely upon how fast your machine is, but here are some rough estimates for a modern laptop or mobile phone:

1 character = usually less than a 0.1 seconds
2 characters = usually less than a 1 second
3 characters = usually less than a 30 seconds
4 characters = usually less than a 10 minutes
5 characters = usually less than a 1 hour
6+ characters = keep fire extinguisher handy

— nostrogen
https://github.com/tonyinit/nostrogen#how-fast-will-nostrogen-find-my-addresses

以下のような感じで結果が表示されます.Npub public key の npub1の後ろが指定したmat0kから始まっています.

$ rana --vanity-n-prefix mat0k | tee rana.log
Started mining process for vanity bech32 prefix[es]: 'npub1["mat0k"]' (estimated pow: 20)
Benchmarking of cores disabled for vanity npub key upon proper calculation.
Mining using 4 cores...
<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
Vanity npub found:         mat0k
Found matching Nostr public key:
Hex public key:   df56fb6cce5a60eac0a55b09ff6d5fbb565b07da6f64a2578ae827d70a21873b
Hex private key:  7a1a088022c3110fabc445af28681c0d2c349a2123f38fe83fbc809d7c8ed6bb
Npub public key:  npub1mat0kmxwtfsw4s99tvyl7m2lhdt9kp76daj2y4u2aqnawz3psuass9qwnz
Nsec private key: nsec10gdq3qpzcvgsl27ygkhjs6qup5krfx3py0ecl6plhjqf6lyw66as4gyfat
26169409 iterations (about 2x10^7 hashes) in 3199 seconds. Avg rate 8180 hashes/second
Warning
公開されているこの鍵は利用しないでください

手元の,NotePCの Intel® Core™ i5-7300U CPU @ 2.60GHz と Oeracle Free Tier VPS Arm Ampere A1 共に8000〜8200 hashes/secod という感じでした.

3日ほど走らせて mak0 から始まるものたくさん,mat0ke から始まるものが2つ出てきました. cpu fan うるさいしmat0ken は諦めてこの辺にしとこうかな?

Npub public key: npub1mat0kejpylctwszs3h0jcaw24vsmzvx0h44hl2qf3ghuz2ggekjqkwyeq5

そういえば以前はTor の Vanity address も掘っていました…….

]]>
https://matoken.org/blog/2023/03/01/nostr-vanity-adress/feed/ 1