[开源小工具] gpg 靓号生成脚本 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
err1y
V2EX    开源软件

[开源小工具] gpg 靓号生成脚本

  •  1
     
  •   err1y 2021-05-29 16:18:00 +08:00 4045 次点击
    这是一个创建于 1648 天前的主题,其中的信息可能已经有所发展或是发生改变。

    仓库地址:gpg_awesome_keyid

    我的 keyid:0x699a698e77777777

    原理

    根据 rfc4880 的 pgp keyid 的计算方式我们可以得知,修改 key 的创建时间我们即可以达到快速修改 keyid 的目的。

    12.2. Key IDs and Fingerprints ... a.3) low-order length octet of (b)-(e) (1 octet) b) version number = 4 (1 octet); c) timestamp of key creation (4 octets); ... 

    使用如下代码进行快速计算 key

    // src/actions.js@do_generate let prikey = null; let start = new Date(); for(let index = 0; ; index++) { if(0 === index % 10000) { // 每 1 万次之后重新生成 key,防止创建时间过于小 prikey = await gen_basic_key(); // ... } // 修改 key 的创建时间并重新计算指纹(时间精度为秒) // ! 需要注意的是,此时的 key 的 subkey 和 uid 的签名都是需要修正的,是原始指纹的 key 的签名 prikey.keyPacket.created = new Date(prikey.keyPacket.created.getTime() - 1000); let r = { // 因为修改了创建时间但是并未重新计算 private key 的指纹,但获取公钥时会重新计算公钥指纹,达到计算指纹的目的 fpr: prikey.toPublic().getFingerprint(), // key 需要修正,加密子钥和 uid 的签名都是使用的旧 id 进行签名的,import 过程通过 openpgp.reformat 修正 key: prikey.armor() }; // ... } 

    计算速度

    测试环境

    • os: gentoo linux
    • kernel: 5.4.97
    • cpu: Intel i5-5200U (4) @ 2.700GHz
    • node: v14.16.1
    • npm: 6.14.12

    计算速度

    > node . start ... [.../gpg_awesome_keyid/dbs/key2.db] 耗时 57.582 秒,已计算 key250000 个,数据库中已保存 6 个 key [.../gpg_awesome_keyid/dbs/key3.db] 耗时 58.054 秒,已计算 key250000 个,数据库中已保存 6 个 key [.../gpg_awesome_keyid/dbs/key1.db] 耗时 58.213 秒,已计算 key250000 个,数据库中已保存 8 个 key [.../gpg_awesome_keyid/dbs/key0.db] 耗时 58.85 秒,已计算 key250000 个,数据库中已保存 5 个 key 

    预计 8 连 keyid 时间

    每分钟 100w 数据

    任意 8 连概率大约 0xFFFFFFFF/16 ( 16 种可能)

    通过计算:0xFFFFFFFF / 16 / 1000000 / 60 ≈ 4.47 小时

    使用

    安装

    git clone https://github.com/erriy/gpg_awesome_keyid.git \ && cd gpg_awesome_keyid \ && npm i 

    自定义靓号规则

    // src/rule.js 文件中 // notify 和 save 函数任意一个返回 true 则保存,否则直接丢弃 /** * 返回 true 则保存数据库后并发送通知 */ function notify (fingerprint) { // 默认提醒后八位相同的 key return 1 === new Set(fingerprint.slice(32)).size; } /** * 返回 true 则保存到数据库 */ function save (fingerprint) { const special_list = [ '01234567', '76543210', 'abcdef', '01020304', '11223344', ]; if( new Set(fingerprint.slice(35)).size === 1 || new Set(fingerprint.slice(32)).size <= 2 || new Set(fingerprint.slice(24)).size <= 3 || new Set(fingerprint).size <= 4 ) { return true; } for(let s of special_list) { if(fingerprint.endsWith(s)){ return true; } } return false; } 

    修改 gpg 使用的算法

    // src/action.js@gen_basic_key // 推荐使用 ecc 算法,生成的公钥更小且计算速度更快 async function gen_basic_key () { const { privateKeyArmored } = await openpgp.generateKey({ // 如果要修改算法,请自己去 https://github.com/openpgpjs/openpgpjs#performance 里面找 type : 'ecc', curve : 'curve25519', userIDs: [{name: 't'}] // userid 在导入时会重新生成,此处修改没有意义 }); return await openpgp.readKey({ armoredKey: privateKeyArmored }); } 

    开始算号

    # 直接开始算号 node . start # 开始算号,发现帐号后发送 bark 通知 node . start --barkid xxxxxx 

    查找保存的数据

    # 列出所有数据 node . list # 列出指定后缀的数据 # node . list [suffix] # 比如列出以 fffff 结尾的 key node . list fffff 

    保存结果

    注意:导入的 key 并未设置密码,请自行使用命令设置密码,数据库中存在明文 key,记得删除,防止泄漏

    # 保存以 fffff 结尾的 key node . import fffff # 保存以 fffff 结尾的 key 并指定 uid.name 和 uid.email node . import fffff -n name -email [email protected] 

    其他更快速的方法

    • scallion : 速度很快,但是只支持 rsa 算法,后 9 位 9 连大概在一分钟以内就能挖出,挖出的 key 无 uid,可以通过 openpgp.reformat 增加 uid 后再给 gpg 使用

    相关资料

    8 条回复    2022-05-22 15:34:20 +08:00
    d5
        1
    d5  
       2021-05-29 16:58:28 +08:00
    酷,有意思,谢谢楼主开源
    dallaslu
        2
    dallaslu  
       2021-05-30 09:52:49 +08:00 via iPhone   1
    err1y
        3
    err1y  
    OP
       2021-05-30 13:05:05 +08:00 via iPhone
    @dallaslu 其实用 opencl/cuda 等库调用 gpu 很快,我这个太慢了,回头学学 opencl

    这个快,调 gpu 的
    https://github.com/lachesis/scallion
    chinni
        4
    chinni  
       2021-12-06 22:44:39 +08:00
    @err1y openpgp.reformat 增加 uid 后再给 gpg 使用 这个有什么详细的操作方法么 ?
    我找了下 没特别明白
    err1y
        5
    err1y  
    OP
       2021-12-08 11:24:06 +08:00
    @chinni
    https://github.com/openpgpjs/openpgpjs/blob/main/src/openpgp.js#L100-L121
    不一定是最优方法,你可以去看看 scallion ,之前我在测试的时候并没有找到指定 uid 的参数,使用 scallion 生成出来的 key 是没有 uid 的,然后导致 gpg 无法导入,我选择使用 openpgpjs 的 reformatKey 方法增加的 uid

    大概需要使用 node 去这么做,你可以研究下(未测试,之前写这帖子的时候是测试成功的)

    ``` Javascript
    const openpgp = require('openpgp');

    const key = `
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    ... 此处是 scallion 生成的 key
    -----END PGP PRIVATE KEY BLOCK-----
    `;


    (async()=>{
    const {key: new_key, privateKeyArmored: prikey_armord} = await openpgp.reformatKey({
    privateKey: await openpgp.readKey({armoredKey: key}),
    // 这里填写你要给 key 增加的 uid
    userIDs: [{name: 'test', email: '[email protected]', comment: ''}]
    });
    console.log(prikey_armord, new_key.getUserIDs());
    })();
    ```
    chinni
        6
    chinni  
       2021-12-08 11:33:23 +08:00
    @err1y 好的多谢大佬 后面我找到了一个 gpg import 导入的参数 --allow-non-selfsigned-uid 可以直接导入 不合法的(就是 email 格式不正确的 UID 的 key 。然后 导入了。 可以解决这个问题
    wc7086
        7
    wc7086  
       2022-05-22 15:10:57 +08:00
    这可不兴靓号啊,这样搞别人不是随随便便就能把自己的密钥给穷举出来了。
    wc7086
        8
    wc7086  
       2022-05-22 15:34:20 +08:00
    > 这可不兴靓号啊,这样搞别人不是随随便便就能把自己的密钥给穷举出来了。
    一时糊涂搞错了,不过靓号放在公共密钥服务器上还挺容易被攻击的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1163 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 23:40 PVG 07:40 LAX 15:40 JFK 18:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86