WinRAR 使用了基于 ECC 的签名算法来生成 rarreg.key
文件,其使用的签名算法是中国 SM2 数字签名算法的变体。与各种标准 ECDSA 不同的是,WinRAR 使用的椭圆曲线是一个基于复合域
上的曲线。
为了方便表述我们用255比特的大数 来表示位于复合域
上的元素
。它们的对应关系为:
曲线方程为:
其中 为 SHA1 算法输出时的5个状态值;将这5个状态值按照大端字节序依次输出,即为的 SHA1 哈希值
。
WinRAR 在做完 SHA1 计算后,采用大数 作为 ECC 签名时消息的哈希:
-
计算 SHA1 值:
-
步骤4再重复14次。
授权文件的生成需要两个参数:
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,记为 。