menu Thinking Null
生成好看的GPG shortID
2020-11-15   信息安全   暂无评论   2728 次阅读

很久以前就想搞一个自定义的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/4096nistp256/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 找到完整的相关信息。

None

本篇文章采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可协议进行许可。

转载或引用本文时请遵守许可协议,注明出处。

发表评论
暂无评论
textsms
account_circle
email
link