#startup #config #hash #blocklist

app keygen

从种子创建可验证序列密钥的二进制文件

5 个稳定版本

使用旧的 Rust 2015

2.1.0 2018年2月10日
2.0.0 2018年2月2日
1.3.0 2018年1月31日
1.2.1 2018年1月15日
1.1.0 2017年8月15日

#997 in 密码学

MIT 许可证

2MB
324

包含 (Mach-o exe, 2MB) builds/osx/v1.3/keygen, (Mach-o exe, 2MB) builds/osx/v1.0/keygen, (Mach-o exe, 2MB) builds/osx/v1.1/keygen

密钥生成器

根据 这篇文章 创建从种子生成的序列密钥。

序列密钥可以通过校验和或验证密钥中的字节来检查其有效性。

安装

Cargo

cargo安装 keygen

其他

Windows/Linux:使用 Rust 编译源代码 - 目前没有二进制文件。

Mac: v1.1

用法

keygen create

从初始字符串值创建密钥。

-s--seed必需

用于创建字符串的初始值

keygen create-s myname@示例.com

-h--hash

与种子结合以创建密钥的字符串。如果您不提供哈希值,将生成并使用随机哈希值。

keygen create-s myname@示例.com-h aLongstringValueasaHash

-c--config

现有 JSON 配置文件的路径。在创建密钥时将读取此文件。

keygen create-s myname@示例.com-c config.json

-b--blacklist

要添加到黑名单的种子值。任何包含黑名单中种子值的密钥都将失败验证。

// key = 53A5-4C20-A43E-6490-052A
keygen create -s myname@examplecom -b 11111111 -b 53A54C20
keygen verify -k 53A5-4C20-A43E-6490-052A -c config.json // => Blacklisted

-l--length

创建密钥的字节数。更长的密钥应该更难破解,但用户更难输入。密钥由种子(8个字符长)、字节长度(每字节2个字符)然后是校验和(4个字符)组成。

keygen create -s myname@example.com -l 12 // => 53A5-4C20-7474-CC94-AF39-B63D-8B34-54A7-C1DA
keygen create -s myname@example.com -l 4 // => 53A5-4C20-A43E-6490-052A

-y--shifts

可选:创建密钥时使用的字节偏移量。如果未提供,则将生成这些值。必须是 i16 的三联组,即 12,242,45 或 16,80,52。

keygen create -y 74,252,42 178,245,197 1,201,98

-o--output

写入配置设置的路径。在创建密钥时,保存创建密钥时使用的配置非常重要,否则您将无法验证它。如果您提供输出值,则将创建一个具有该值名称的文件,并将配置保存为 JSON 格式。如果未提供此值,则 JSON 配置将打印到终端。

keygen create-s myname@示例.com-o config.json

-j--json

标志:如果存在,输出将作为 JSON 数据写入 stdout。如果设置此标志,则不会创建/写入配置文件。

keygen create -s myname@example.com -l 8 -h abc123 -j

// =>
{"config":{"blacklist":[],"byte_shifts":[[98,133,163],[26,206,205],[244,140,88],[149,39,147],[208,215,29],[161,77,140],[178,216,229],[216,29,79]],"hash":"Cc7MgAsUr43PyT4U2zW5dDkVIKK23hB","num_bytes":8},"key":"92E7-A4A6-265A-5425-99FC-3088-C404"}

keygen verify

检查一个密钥是否有效。返回 Keygen::Status

keygen verify -k 1234-5678-abcd-1234 -c config.json // => Status::Good, Status::Invalid, Status::Blacklisted, Status::Phony

-k--密钥必需

要检查的密钥。

-c --config REQUIRED(除非提供了位移和位置)

JSON配置文件的路径;必须是创建密钥时使用的配置。

-s --shifts REQUIRED(除非提供配置)

生成密钥时使用的字节位移,i16的三元组。这些必须与位置参数匹配,例如如果位置是[0, 1],则必须传递创建密钥时使用的第一个两个字节位移。

-p --positions(如果提供位移,则是必需的)

要检查的密钥中的字节,即对于密钥1234-5678-abcd-1234,位置[0, 1]将检查密钥中的前两个字节(abcd - 1234-5678是种子值)。

keygen verify -k 1234-5678-abcd-1234 -s 74,252,42 42,116,226 -p 0 1

keygen校验和

检查密钥的校验和是否正确(即密钥是否已被修改)。返回 bool。需要密钥的预期长度或配置文件的路径(其中读取预期的长度)。

keygen checksum -k 1234-5678-abcd-1234 -c config.json // => true
keygen checksum -k 1234-5678-abcd-1234 -l 2 // => true

-k--密钥必需

要检查的密钥。

-l --length REQUIRED(除非提供配置参数,否则是必需的)

要检查的密钥的预期长度。

-c --config REQUIRED(除非提供长度参数,否则是必需的)

JSON配置文件的路径;必须是创建密钥时使用的配置。

种子

种子是从输入和正在运行的哈希通过CRC32创建的 - 它们总是以十六进制格式八位长。

配置

一旦创建了一个密钥,配置就至关重要 - 如果您不保存配置,或尝试使用不同的配置来验证密钥,您将无法验证密钥!配置文件包含可用于生成密钥的信息,因此需要保密。您可以在创建密钥时使用相同的配置,通过使用-c参数来生成多个密钥。

示例配置

    "num_bytes": 8,             // length of key
    "byte_shifts": [            // array of arrays - these are used to check each byte
        [62, 252, 46],
        [57, 195, 131],
        [21, 251, 32],
        [129, 94, 254],
        [205, 24, 45],
        [161, 36, 17],
        [88, 109, 26],
        [105, 237, 248]
    ],
    "hash": "hash",             // the hash used in creating the string
    "blacklist": ["11111111"]   // blacklisted seeds
}

验证/校验和

《keygen checksum》方法是一种快速且相对不精确的方法,可以确定密钥是否无效 - 它只检查校验和是否与密钥的其余部分匹配,尽管可以更改密钥和校验和,但仍可能有效。验证函数检查校验和以及密钥中的几个字节,以确定密钥实际上是否有效 - 完整的推理见原始文章,但基本上这是为了您有一个快速且简陋的方法来检查密钥在启动时的有效性(checksum),然后在尝试使用更多功能如保存时进行完整检查。在启动时进行快速检查意味着逆向工程师不知道软件中何时进行完整检查,因此没有明显的入口点。

依赖关系

~6MB
~121K SLoC