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 使用的椭圆曲线是一个基于复合域 上的曲线。
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,记为。
-
-
格式化输出。