WireGuard 个性化密钥生成器:WireGuard-vanity-keygen

axllent/wireguard-vanity-keygen

用于 WireGuard 的命令行个性化(公共)密钥生成器。 默认情况下,它仅匹配生成的公钥的前缀,而不考虑搜索是否与公钥中的任何位置匹配。 这个概念基于 wireguard-vanity-address,但我想要更精简的东西。

功能特性

使用选项

Usage: wireguard-vanity-keygen [OPTIONS] <SEARCH> [<SEARCH>...]
Options:
 -c, --case-sensitive  大小写敏感匹配 (默认 false)
 -t, --threads int   线程数 (默认为所有可用核心数减 1)
 -l, --limit int    限制结果为 n (达到后退出) (默认 1)

示例

$ wireguard-vanity-keygen -l 3 test pc1/ "^pc7[+/]"
Calculating speed: 49,950 calculations per second using 4 CPU cores
Case-insensitive search, exiting after 4 results
Probability for "test": 1 in 2,085,136 (approx 41 seconds per match)
Probability for "pc1/": 1 in 5,914,624 (approx 1 minute per match)
Cannot calculate probability for the regular expression "^pc7[/+]"
Press Ctrl-c to cancel
private OFVUjUoTNQp94fNPB9GCLzxiJPTbN03rcDPrVd12uFc=  public tEstMXL/3ZzAd2TnVlr1BNs/+eOnKzSHpGUnjspk3kc=
private gInIEDmENYbyuaWR1W/KLfximExwbcCg45W2WOmEc0I=  public TestKmA/XVagDW/JsHBXk5mhYJ6E1N1lAWeIeCttgRs=
private yDQLNiQlfnMGhUBsbLQjoBbuNezyHug31Qa1Ht6cgkw=  public PC1/3oUId241TLYImJLUObR8NNxz4HXzG4z+EazfWxY=
private QIbJgxy83+F/1kdogcF+T04trs+1N9gAr1t5th2tLXM=  public Pc7+h172sx0TfIMikjgszM/B8i8/ghi7qJVOwWQtx0w=
private +CUqn4jcKoL8pw53pD4IzfMKW/IMceDWKcM2W5Dxtn4=  public teStmGXZwiJl9HmfnTSmk83girtiIH8oZEa6PFJ8F1Y=
private EMaUfQvAEABpQV/21ALJP5YtyGerRXAn8u67j2AQzVs=  public pC1/t2x5V99Y1SBqNgPZDPsa6r+L5y3BJ4XUCJMar3g=
private wNuHOKCfoH1emfvijXNBoc/7KjrEXUeof7tSdGWvRFo=  public PC1/jXQosaBad2HePOm/w1KjCZ82eT3qNbfzNDZiwTs=
private gJtn0woDChGvyN2eSdc7mTpAFA/nA6jykJeK5bYYfFA=  public Pc7+UEJSHiWsQ9zkO2q+guqDK4sc3VMDMgJu+h/bOFI=
private IMyPmYm/v0SPmB62hC8l6kfxT3/Lfp7dMioo+SM6T2c=  public Pc7/uVfD/ZftxWBHwYbaudEywUS61biBcpj5Tw830Q4=

安装

下载适用于您系统的 最新二进制版本,或从源代码构建 go install github.com/axllent/wireguard-vanity-keygen@latest

耗时

为了让您大致了解生成密钥所需的时间,下表列出了在一个系统上查找匹配密钥的估计时间,该系统在启动时报告"Calculating speed: 230,000 calculations per second using 19 CPU cores":

| 长度 | 大小写不敏感 | 大小写敏感 | | ------- | -------- | -------- | | 3 个字符 | 0 秒 | 1 秒 | | 4 个字符 | 9 秒 | 1 分钟 | | 5 个字符 | 5 分钟 | 1.25 小时 | | 6 个字符 | 4 小时 | 3.5 天 | | 7 个字符 | 6 天 | 7 个月 | | 8 个字符 | 7 个月 | 38 年 | | 9 个字符 | 22 年 | 175 年 |

请注意,以上时间是针对单个搜索词查找匹配密钥的时间。 传递多个搜索词不会显着增加查找任何单个词条的时间,但是查找所有搜索词的时间是所有估计时间的总和。 此外,将限制增加到两个 (--limit 2) 会使估计时间加倍,三个将使时间加三倍,依此类推。

如果任何搜索词包含数字,则时间将介于大小写不敏感和大写小写敏感列之间。

当然,您的结果会有所不同,具体取决于您的 CPU 核心的数量和速度。

正则表达式

由于搜索词中每增加一个字母都会呈指数级增加搜索时间,因此使用正则表达式进行搜索可能会大大缩短时间。 以下是一些示例:

  1. .*word.* - 在密钥中的任何位置查找单词(word.*.*word 也有效)
  2. ^.{0,10}word - 在密钥的前 10 个字母中的任何位置查找单词
  3. word1.*word2 - 查找两个单词,在密钥中的任何位置
  4. ^[s5][o0][ll]ar - 在密钥开头查找“solar”,或视觉上相似的“s01ar”
  5. ^(best|next)[/+] - 在密钥开头查找“best”,或“next” best,并以 /+ 作为分隔符

有关 Go 的正则表达式语法的良好指南,请访问 https://pkg.go.dev/regexp/syntax

要在正则表达式中包含字面 +,请在其前面加上反斜杠:^ex\+

注意:如果您的搜索词包含 shell 元字符,例如 |^,则需要将其引用起来。 在 Windows 上,必须使用双引号。 例如:"^(a|b)"

注意:复杂的正则表达式,例如那些使用转义序列、标志或字符类的表达式,可能永远无法匹配密钥。 为避免这种情况,请考虑使用 此工具 在 The Go Playground 上或 goplay.tools 上的相同工具测试您的正则表达式。

常见问题解答

我可以搜索哪些字符?

有效字符包括 A-Za-z0-9/+。 哈希中没有其他字符。

您还可以使用正则表达式进行搜索。

为什么 testtes1 显示不同的概率,尽管它们每个都有 4 个字符?

对于不区分大小写的搜索(默认),a-z 有机会匹配大写和小写。 搜索“cat”可以匹配 CatcAT 等。

估计时间有多准确?

它们不准确(也无法准确)。 密钥是完全随机生成的,并且估计基于平均法则。 例如,您可能会在第一次尝试中找到十亿分之一的机会的匹配项,或者可能需要尝试 50 亿次。 但是,它会根据您的 CPU 速度、字数统计、大小写敏感性以及数字或字符的使用情况为您提供指示。

我为什么需要这个?

你不需要。 我编写它是为了因为我运行一个 WireGuard 服务器,该服务器没有提供任何关于密钥属于谁的参考(服务器上的 wg)。 使用个性化密钥,我至少可以识别连接。 我也想更多地了解 Golang 中的多核处理。