“rarreg.key”是如何生成的?

来源

WinRAR 使用了基于 ECC 的签名算法来生成 rarreg.key 文件,其使用的签名算法是中国 SM2 数字签名算法的变体。与各种标准 ECDSA 不同的是,WinRAR 使用的椭圆曲线是一个基于复合域 GF2p15p17-inlined 上的曲线。

1. 复合域 GF2p15p17-inlined

基域 GF2p15-inlined 采用标准基(多项式基)来表达,采用的不可约多项式为:

各项系数全部位于 GF2-inlined。设基域的标准基为:

则位于基域 GF2p15-inlined 上的元素 A-inlined 可以用如下方式表达:


复合域 GF2p15p17-inlined 的不可约多项式为:

各项系数全部位于 GF2p15-inlined。设复合域的标准基为:

则位于复合域 GF2p15p17-inlined 上的元素 B-inlined 可以用如下方式表达:


为了方便表述我们用 255 比特的大数 D-inlined 来表示位于复合域 GF2p15p17-inlined 上的元素 B-inlined。它们的对应关系为:

2. 复合域 GF2p15p17-inlined 上的椭圆曲线

曲线方程为:

基点 G-inlined 为:

基点 G-inlined 的阶 n-inlined 为:

3. 消息哈希算法

设长度为 l-inlined 的消息为:

则消息 M-inlined 的 SHA1 值为:

其中 为 SHA1 算法输出时的 5 个状态值;将这 5 个状态值按照大端字节序依次输出,即为的 SHA1 哈希值

WinRAR 在做完 SHA1 计算后,采用大数 h-inlined 作为 ECC 签名时消息的哈希:

4. ECC 签名算法

设私钥为 k-inlined,公钥为 P-inlined,即:

消息哈希为 h-inlined,则签名 为:

  1. 生成随机数 Rnd-inlined,满足

  2. 计算 r-inlined

    其中 表示取 的 X 坐标,同时将 X 坐标从 GF2p15p17-inlined 转换为大数。

    或者 则回到步骤 1。

  3. 计算 s-inlined

    则回到步骤 1。

  4. 输出

5. WinRAR 的私钥生成算法

该算法会利用长度为 l-inlined 的数据

来生成私钥 k-inlined

  1. 设 6 个 32 位整数为 ,则有

  1. 如果 则计算 T-inlined 的 SHA1 值,并将状态值 赋值给

    否则,即 时,令:

  2. 作为计数器,自增 1。

    计算 SHA1 值:

    的低 16 位并记为

  3. 步骤 4 再重复 14 次。

  4. 重复执行完后会得到 ,则输出私钥

6. WinRAR 的公钥和私钥

WinRAR 的私钥 k-inlined 为:

该私钥是通过算法 5 生成的,其中数据 T-inlined 的长度为 0。

公钥 P-inlined 为:

7. 授权文件"rarreg.key"的生成

授权文件的生成需要两个参数:

  1. 用户名的 ANSI 字符串,不包括 null-terminator;记为

  1. 授权类型的 ANSI 字符串,不包括 null-terminator;记为

rarreg.key 的生成算法如下:

  1. 使用用户名 UU-inlined 通过算法 5 计算出私钥 以及公钥 ,并将公钥 按照 SM2 压缩公钥格式以 Hex 字符串(ASCII 编码)的形式输出。得到的 Hex 字符串记为临时值 Temp-inlined

    Temp-inlined 的长度应该为 64;若长度不足,则在前面补字符'0',直到长度为 64。

  2. 令字符串 Data3-inlined

  1. 使用 Data3-inlined 通过算法 5 计算出私钥 以及公钥 ,并将公钥 按照 SM2 压缩公钥格式以 Hex 字符串(ASCII 编码)的形式输出。得到的 Hex 字符串记为 Data0-inlined

    Data0-inlined 的长度应该为 64;若长度不足,则在前面补字符'0',直到长度为 64。

  2. 令字符串 UID-inlined

  1. 对授权类型 LL-inlined 使用算法 4 得到签名 ,其中私钥见第 6 节。

    要求 的长度都不得超过 240 比特,否则重复该步骤。

  2. 以 16 进制形式输出(无"0x"前缀),分别记为

    若长度不满 60,则在前面补字符'0',直到长度为 60。

  3. 令字符串 Data1-inlined

  1. 令字符串 Temp-inlined

    Temp-inlined 使用算法 4 得到签名 ,其中私钥见第 6 节。

    要求 的长度都不得超过 240 比特,否则重复该步骤。

  2. 以 16 进制形式输出(无"0x"前缀),分别记为

    若长度不满 60,则在前面补字符'0',直到长度为 60。

  3. 令字符串 Data2-inlined

  4. 计算 CRC32 值,最终校验和为 CRC32 值的反。将校验和以 10 进制形式输出,若长度不满 10,则在前面补字符'0',直到长度为 10,记为

  5. 令字符串 Data-inlined

  6. 格式化输出。

    • 固定文件头"RAR registration data",占一行。

    • 用户名,占一行。

    • 授权类型,占一行。

    • UID,占一行:

      <p align="center">
        <img src="http://latex.codecogs.com/svg.latex?%5Ctexttt%7B%22UID%3D%22%7D%7C%7CUID">
      </p>
      
    • Data-inlined 按照每行 54 个字符输出。

拓展阅读

winrar-keygen

WinRAR-Extractor

提交: 7a5bc034 环境: production Hugo: 0.145.0 主题: 3.30.0-modified 时间: 1743559587944512
本博客内容仅供参考,作者不对其准确性、完整性或适用性作出任何明示或暗示的保证。因使用、引用或解读本博客内容所引发的任何直接或间接后果,作者概不承担任何责任。
本博客可能包含第三方转载内容,相关版权归原作者所有。转载内容仅为分享信息之目的,不代表作者观点。如涉及侵权,请联系删除。
使用 Hugo 构建
主题 StackJimmy 设计