很久以前就想搞一个自定义的gpg key,网上的教程大多是教如何生成随机的,而没有自定义的。
正好在github上看到一个项目
https://github.com/cuihaoleo/gpg-fingerprint-filter-gpu
Generate an OpenPGP key whose fingerprint matches a specific pattern
哪个男孩不想要一个好看的,接近自定义的gpg short ID 呢?这就去搞一个114514结尾的gpg key,但项目没有提供编译好的程序,只能自己编译。
先安装nvcc工具包
sudo apt-get install nvidia-cuda-*
然后make
发现找不到libdevice路径nvcc fatal : Path to libdevice library not specified
,需要自己指定
nvcc -cuda key_test_sha1.cu -ldir /usr/lib/nvidia-cuda-toolkit/libdevice/ --dont-use-profile
发现sh: 1: cicc: not found
,需要自己安装并设置环境变量。
export PATH=/usr/local/cuda-10.1/bin:/usr/local/cuda-10.1/NsightCompute-2019.1${PATH:+:${PATH}}
export PATH=/usr/lib/nvidia-cuda-toolkit/bin:$PATH
再make
大功告成!
可惜事情并没有这么简单。还是提示找不到gpu,从而无法运行程序。
让Azure来帮忙!
Azure数据科学计算虚拟机,不到1$/小时!价格优惠配置高!(不是广告,azure没有aff返利),内存和cpu都够用,gpu是NVIDIA Tesla K80,显存11G。
拿到虚拟机之后,很快就解决了编译问题,一运行才发现帮助文档给的说明太少了,甚至连可用的算法都没有说。错误信息没有提示,并且不能通过常规方式结束程序。只好去翻Github上的源代码,终于找到了可选的启动参数。
GPGKey::GPGKey(const std::string &algorithm) {
std::string s_expr;
std::vector<uint8_t> curve_oid;
if (algorithm == "rsa") {
s_expr = "(genkey(rsa(nbits 4:2048)))";
pk_algo = PK_RSA;
} else if (algorithm == "rsa2048") {
s_expr = "(genkey(rsa(nbits 4:2048)))";
pk_algo = PK_RSA;
} else if (algorithm == "rsa3072") {
s_expr = "(genkey(rsa(nbits 4:3072)))";
pk_algo = PK_RSA;
} else if (algorithm == "rsa4096") {
s_expr = "(genkey(rsa(nbits 4:4096)))";
pk_algo = PK_RSA;
} else if (algorithm == "nistp256") {
s_expr = "(genkey(ecc(curve nistp256)(flags nocomp)))";
curve_oid = { 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07 };
pk_algo = PK_ECDSA;
} else if (algorithm == "nistp384") {
s_expr = "(genkey(ecc(curve nistp384)(flags nocomp)))";
curve_oid = { 5, 0x2B, 0x81, 0x04, 0x00, 0x22 };
pk_algo = PK_ECDSA;
} else if (algorithm == "nistp521") {
s_expr = "(genkey(ecc(curve nistp521)(flags nocomp)))";
curve_oid = { 5, 0x2B, 0x81, 0x04, 0x00, 0x23 };
pk_algo = PK_ECDSA;
} else if (algorithm == "ed25519") {
s_expr = "(genkey(ecc(curve Ed25519)(flags eddsa comp)))";
curve_oid = { 9, 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01 };
pk_algo = PK_EDDSA;
} else {
throw std::runtime_error("unsupported algorithm: " + algorithm);
}
可见可选的算法有rsa 2048/3072/4096
和 nistp256/384/521
以及我选用的ed25519
。rsa太慢,nist多少沾点不安全,那就ed25519吧。
其实只有ed25519
能正常生成,其他算法都长期无响应,不知是什么问题。
生成速度很快,不到2小时,自定义的8位gpg short id就到手了。114514
为后6位的key只花了一秒钟,但0xeeeeeeee
要2个小时。
最后,公布一下我的 GPG key 0xeeeeeeee
无论何时,你都能在 https://awsl.blog/certs.html 找到完整的相关信息。
本篇文章采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可协议进行许可。
转载或引用本文时请遵守许可协议,注明出处。