# 前言

最近在折腾 PGP(OpenPGP)密钥,发现原来 PGP 也有所谓的 “靓号”,于是在网上查了些资料,最后整理一下做个笔记。

# 原理

为方便描述,下文的 “位” 均按十六进制计算而非二进制。

PGP 所谓的 “靓号” 其实就是指密钥的十六位的 ID,对应密钥指纹的后十六位。

例如我的 PGP 密钥指纹为 7B49 3862 FEFB 5A10 B875 4458 391C C423 AEFF 3B06 ,那么它的密钥 ID 则为 391C C423 AEFF 3B06

其实部分场景还会以后八位为 ID,但在当今算力下,八位 ID 还是太容易碰撞了,因此现在一般以后十六位为密钥 ID。

而我们的 “靓号” 本质上也是通过碰撞来获得的。

经过博主测试,博主的 NVIDIA GeForce RTX 3060 laptop 140W 在满载情况下,八位 ID 仅需不到 1s 即可碰撞成功,十二位全重复(十二个相同的数字)ID 耗时三小时仅碰撞成功一次。

所以,能否获得自己喜欢的靓号还是要拼(mai)财(xian)力(ka)(doge)。

# 开始

因为本篇博文仅作为笔记,因此笔记环境仅按照博主当前环境配置,其他环境请自行摸索。

# 环境

显卡使用 NVIDIA 显卡,AMD 显卡请自行寻找教程。

系统环境使用 WSL2 下的 Ubuntu22.04。

Tips:不要使用 msys2,会变得不幸。

安装或者更新 NVIDIA 显卡驱动至最新版。

Tips:此步骤不是必须,但需要保证后面 CUDA toolkit 支持当前版本驱动,否则可能会出现驱动过老或过新导致的无法正常使用。

在 WSL2 内安装 CUDA Toolkit,具体教程 NVIDIA 官方已出,请参考 https://docs.nvidia.com/cuda/wsl-user-guide/index.html

根据官方教程安装完 CUDA Toolkit 后输入 nvcc -V 检查是否能够正常使用,如果无法正常出现版本信息请添加环境变量。

# 拉取程序

本次使用 gpg-fingerprint-filter-gpu 这个项目进行靓号生成。

1
2
3
4
5
6
7
apt install libgcrypt20-dev

git clone https://github.com/cuihaoleo/gpg-fingerprint-filter-gpu

cd gpg-fingerprint-filter-gpu

make

如果出现缺少包情况补全相关依赖包即可。

# 生成靓号

这里我推荐使用 gpg-fingerprint-filter-gpu 下的 batch_generate_keys.sh shell 脚本来生成。(因为原项目生成一个靓号后就会自动停止,使用脚本可以生成自定义数目的靓号)

1
wget https://raw.githubusercontent.com/comicchang/gpg-fingerprint-filter-gpu/master/batch_generate_keys.sh

将脚本下载到和原项目同一文件夹下后编辑脚本

在其中找到正则表达式部分,将自己想要的正则表达式代替填入,例如想要八个八就可以填 8{8} ,既想要八个八也想要 114514 就可以填 8{8}|114514 。更多玩法可以参考项目介绍。

tips:密钥 ID 是十六进制,因此不可能出现大于 F 的字母。

改完脚本后运行脚本(可能还需要增加可执行权限)

1
./batch_generate_keys.sh 0 100 ed25519 ~/output
  • 0:GPU_INDEX
  • 100:KEY_COUNT
  • ed25519:算法
  • ~/output:私钥输出路径

运行脚本后即开始碰撞想要的密钥 ID。

# 导入密钥

因为生成的 key 都是空的 UID,因此导入时需要加上 --allow-non-selfsigned-uid

1
gpg --allow-non-selfsigned-uid --import xxx.gpg

或者,你甚至可以尝试 “卖号”?(不知道有没有人买 doge)

# 后记

本来生成了几个靓号,但是自己的 PGP 密钥早已在使用中,懒得更换了,所以这次折腾也就图个乐子。

# 参考