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

则位于基域 上的元素 ![A-inlined] 可以用如下方式表达:
则位于复合域
上的元素 ![B-inlined] 可以用如下方式表达:
为了方便表述我们用255比特的大数 ![D-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],即:
5. WinRAR的私钥生成算法
该算法会利用长度为 ![l-inlined] 的数据
来生成私钥 ![k-inlined]。
6. WinRAR的公钥和私钥
WinRAR的私钥 ![k-inlined] 为:
该私钥是通过算法5生成的,其中数据 ![T-inlined] 的长度为0。
公钥 ![P-inlined] 为:
7. 授权文件"rarreg.key"的生成
授权文件的生成需要两个参数:
-
用户名的 ANSI 字符串,不包括 null-terminator;记为
-
授权类型的 ANSI 字符串,不包括 null-terminator;记为
rarreg.key 的生成算法如下:
-
使用用户名 ![UU-inlined] 通过算法5计算出私钥
以及公钥
,并将公钥
按照 SM2 压缩公钥格式以Hex字符串(ASCII编码)的形式输出。得到的 Hex 字符串记为临时值 ![Temp-inlined]。
![Temp-inlined] 的长度应该为64;若长度不足,则在前面补字符
'0',直到长度为64。 -
令字符串 ![Data3-inlined]为
-
使用 ![Data3-inlined] 通过算法5计算出私钥
以及公钥
,并将公钥
按照 SM2 压缩公钥格式以 Hex 字符串(ASCII编码)的形式输出。得到的Hex字符串记为 ![Data0-inlined]。
![Data0-inlined] 的长度应该为64;若长度不足,则在前面补字符
'0',直到长度为64。 -
令字符串 ![UID-inlined]为
-
将
和
以16进制形式输出(无
"0x"前缀),分别记为和
。
若长度不满60,则在前面补字符
'0',直到长度为60。 -
令字符串 ![Data1-inlined]为
-
令字符串 ![Temp-inlined]为
-
将
和
以16进制形式输出(无
"0x"前缀),分别记为和
。
若长度不满60,则在前面补字符
'0',直到长度为60。 -
令字符串 ![Data2-inlined]为
-
对
计算 CRC32 值,最终校验和为 CRC32 值的反。将校验和以10进制形式输出,若长度不满10,则在前面补字符
'0',直到长度为10,记为。
-
令字符串 ![Data-inlined]为
-
格式化输出。
-
固定文件头
"RAR registration data",占一行。 -
用户名,占一行。
-
授权类型,占一行。
-
UID,占一行:
-
将 ![Data-inlined] 按照每行54个字符输出。
-