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,记为 。