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

为了方便表述我们用255比特的大数 来表示位于复合域
上的元素
。它们的对应关系为:
2. 复合域
上的椭圆曲线
曲线方程为:
基点 在曲线上的验证示例。
3. 消息哈希算法
其中 为 SHA1 算法输出时的5个状态值;将这5个状态值按照大端字节序依次输出,即为的 SHA1 哈希值
。
WinRAR 在做完 SHA1 计算后,采用大数 作为 ECC 签名时消息的哈希:
4. ECC签名算法
5. WinRAR的私钥生成算法
-
-
-
计算 SHA1 值:
-
步骤4再重复14次。
-
6. WinRAR的公钥和私钥
7. 授权文件"rarreg.key"的生成
授权文件的生成需要两个参数:
-
用户名的 ANSI 字符串,不包括 null-terminator;记为
-
授权类型的 ANSI 字符串,不包括 null-terminator;记为
rarreg.key 的生成算法如下:
-
使用用户名
通过算法5计算出私钥
以及公钥
,并将公钥
按照 SM2 压缩公钥格式以 Hex 字符串(ASCII编码)的形式输出。得到的 Hex 字符串记为临时值
。
-
-
使用
通过算法5计算出私钥
以及公钥
,并将公钥
按照 SM2 压缩公钥格式以 Hex 字符串(ASCII编码)的形式输出。得到的 Hex 字符串记为
。
-
-
将
和
以16进制形式输出(无
"0x"前缀),分别记为和
。
若长度不满60,则在前面补字符
'0',直到长度为60。 -
-
-
将
和
以16进制形式输出(无
"0x"前缀),分别记为和
。
若长度不满60,则在前面补字符
'0',直到长度为60。 -
-
对
计算 CRC32 值,最终校验和为 CRC32 值的反。将校验和以10进制形式输出,若长度不满10,则在前面补字符 '0',直到长度为10,记为 。