众所周知,WireGuard 的公私钥是 base64 编码后的 X25519 密钥对,每个 peer 唯一对应一组密钥。为了更方便识别客户端,很多人都会想生成“好看”的公钥地址,也就是在中间包含特定的字符串或者前缀。 很明显这是一种类似于挖矿的暴力搜索,除了反复生成密钥之外别无他法。
几年前,我在 GitHub 上翻到了 wireguard-vanity-address 这个项目:它用 Rust 实现了简单的地址生成器,并且支持 Rayon 做单机并行。
虽然功能非常简单,但也确实非常好用。在它和 7742 服务器的帮助下,我这几年生成了不少个人使用的密钥对(公钥基本都以 harry 开头)。
然而,在想要搜索更长的前缀时,单机就不够用了;此外,GPU 显然也很擅长这种尴尬并行的计算任务,但项目并不支持。我原本想给作者提交一些 PR,但发现项目已经有五年多没有活动了。 于是我就 fork 了一份,再加上一些并不复杂的许愿,在 crates 上发布了一个新的包:wg-vanity。
wg-vanity 相比于原来的版本,升级了 Rust 语言和各种依赖到最新的版本,并增加了可选的 CUDA、MPI 的支持(二者可独立启用),也有简单的 CI 测试。 于是,我现在就可以:
$ srun -n 12 -N 12 --gres=gpu:8 wg-vanity-cuda harrych
expected work: about 8.590e9 candidates (case-insensitive estimate) to find one match
using 8 CUDA device(s) per MPI rank (12)
measured 9.011e8 keys/s; estimated time to a match: 9.5 s
private dK6VdXSO2Y0Nc/yjbavbvA9g//fmUVVWosUkGcsGKhc= public harRYCh9czEQgKxrRjT3V/PJZT9Ow+mfubF3xcZ+/ic=
MPI: 12 ranks, 4069523456 candidates in 4.431s (9.185e8 keys/s)
我还打算增加更多的功能,比如正则 pattern、支持更多的 key 类型等。也欢迎帮我许愿,然后提出 PR!