0 原理
bitcookies edited this page 2022-02-10 15:14:20 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"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位整数为 ,则有

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

    否则,即 时,令:

  3. 作为计数器自增1。

    计算SHA1值

    的低16位并记为

  4. 步骤4再重复14次。

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

6. WinRAR的公钥和私钥

WinRAR的私钥 k-inlined 为:

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

公钥 P-inlined 为:

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

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

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

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

rarreg.key 的生成算法如下:

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

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

  2. 令字符串 Data3-inlined

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

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

  4. 令字符串 UID-inlined

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

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

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

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

  7. 令字符串 Data1-inlined

  8. 令字符串 Temp-inlined

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

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

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

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

  10. 令字符串 Data2-inlined

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

  12. 令字符串 Data-inlined

  13. 格式化输出。

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

    • 用户名,占一行。

    • 授权类型,占一行。

    • UID占一行

    • Data-inlined 按照每行54个字符输出。