mirror of
https://github.com/bitcookies/winrar-keygen.git
synced 2026-03-11 17:45:31 +00:00
330 lines
20 KiB
Markdown
330 lines
20 KiB
Markdown
# "rarreg.key"是如何生成的?
|
||
|
||
WinRAR 使用了基于 ECC 的签名算法来生成 `rarreg.key` 文件,其使用的签名算法是中国 SM2 数字签名算法的变体。与各种标准 ECDSA 不同的是,WinRAR 使用的椭圆曲线是一个基于复合域   上的曲线。
|
||
|
||
## 1. 复合域  
|
||
|
||
基域  采用标准基(多项式基)来表达,采用的不可约多项式为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/1-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/1-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
各项系数全部位于 。设基域的标准基为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/2-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/2-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
则位于基域  上的元素  可以用如下方式表达:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/3-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/3-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
---
|
||
|
||
复合域   的不可约多项式为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/4-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/4-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
各项系数全部位于 。设复合域的标准基为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/5-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/5-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
则位于复合域   上的元素  可以用如下方式表达:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/6-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/6-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
---
|
||
|
||
为了方便表述我们用255比特的大数  来表示位于复合域   上的元素 。它们的对应关系为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/7-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/7-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
## 2. 复合域   上的椭圆曲线
|
||
|
||
曲线方程为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/8-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/8-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
基点  为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/9-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/9-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
基点  的阶  为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/10-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/10-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
## 3. 消息哈希算法
|
||
|
||
设长度为  的消息为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/11-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/11-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
则消息  的 SHA1 值为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/12-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/12-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
其中  为 SHA1 算法输出时的5个状态值;将这5个状态值按照大端字节序依次输出,即为的 SHA1 哈希值 。
|
||
|
||
WinRAR 在做完 SHA1 计算后,采用大数  作为 ECC 签名时消息的哈希:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/15-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/15-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
## 4. ECC签名算法
|
||
|
||
设私钥为 ,公钥为 ,即:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/16-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/16-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
消息哈希为 ,则签名  为:
|
||
|
||
1. 生成随机数 ,满足 。
|
||
|
||
2. 计算 
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/19-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/19-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
|
||
其中  表示取  的 X 坐标,同时将 X 坐标从   转换为大数。
|
||
|
||
若  或者  则回到步骤1。
|
||
|
||
3. 计算 
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/24-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/24-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
|
||
若  则回到步骤1。
|
||
|
||
4. 输出 。
|
||
|
||
## 5. WinRAR的私钥生成算法
|
||
|
||
该算法会利用长度为  的数据
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/26-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/26-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
来生成私钥 。
|
||
|
||
1. 设6个32位整数为 ,则有
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/28-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/28-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
2. 令 。
|
||
|
||
3. 如果  则计算  的 SHA1 值,并将状态值  赋值给 :
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/33-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/33-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
|
||
否则,即  时,令:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/35-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/35-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
4. 把  作为计数器,自增1。
|
||
|
||
计算 SHA1 值:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/37-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/37-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
|
||
取  的低16位并记为 。
|
||
|
||
5. 步骤4再重复14次。
|
||
|
||
6. 重复执行完后会得到 ,则输出私钥
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/41-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/41-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
## 6. WinRAR的公钥和私钥
|
||
|
||
WinRAR 的私钥  为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/42-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/42-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
该私钥是通过算法5生成的,其中数据  的长度为0。
|
||
|
||
公钥  为:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/43-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/43-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
## 7. 授权文件"rarreg.key"的生成
|
||
|
||
授权文件的生成需要两个参数:
|
||
|
||
1. 用户名的 ANSI 字符串,不包括 null-terminator;记为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/44-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/44-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
2. 授权类型的 ANSI 字符串,不包括 null-terminator;记为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/45-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/45-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
`rarreg.key` 的生成算法如下:
|
||
|
||
1. 使用用户名  通过算法5计算出私钥  以及公钥 ,并将公钥  按照 SM2 压缩公钥格式以 Hex 字符串(ASCII编码)的形式输出。得到的 Hex 字符串记为临时值 。
|
||
|
||
 的长度应该为64;若长度不足,则在前面补字符 `'0'`,直到长度为64。
|
||
|
||
2. 令字符串  为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/48-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/48-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
3. 使用  通过算法5计算出私钥  以及公钥 ,并将公钥  按照 SM2 压缩公钥格式以 Hex 字符串(ASCII编码)的形式输出。得到的 Hex 字符串记为 。
|
||
|
||
 的长度应该为64;若长度不足,则在前面补字符 `'0'`,直到长度为64。
|
||
|
||
4. 令字符串  为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/51-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/51-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
5. 对授权类型  使用算法4得到签名 ,其中私钥见第6节。
|
||
|
||
要求  和  的长度都不得超过240比特,否则重复该步骤。
|
||
|
||
6. 将  和  以16进制形式输出(无 `"0x"` 前缀),分别记为  和 。
|
||
|
||
若长度不满60,则在前面补字符 `'0'`,直到长度为60。
|
||
|
||
7. 令字符串  为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/57-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/57-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
8. 令字符串  为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/58-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/58-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
|
||
对  使用算法4得到签名 ,其中私钥见第6节。
|
||
|
||
要求  和  的长度都不得超过240比特,否则重复该步骤。
|
||
|
||
9. 将  和  以16进制形式输出(无 `"0x"` 前缀),分别记为  和 。
|
||
|
||
若长度不满60,则在前面补字符 `'0'`,直到长度为60。
|
||
|
||
10. 令字符串  为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/64-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/64-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
11. 对
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/65-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/65-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
计算 CRC32 值,最终校验和为 CRC32 值的反。将校验和以10进制形式输出,若长度不满10,则在前面补字符 `'0'`,直到长度为10,记为 。
|
||
|
||
12. 令字符串  为
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/67-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/67-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
13. 格式化输出。
|
||
|
||
* 固定文件头 `"RAR registration data"`,占一行。
|
||
|
||
* 用户名,占一行。
|
||
|
||
* 授权类型,占一行。
|
||
|
||
* UID,占一行:
|
||
|
||
<p align="center">
|
||
<img src="assets/formula/68-light.svg#gh-light-mode-only">
|
||
<img src="assets/formula/68-dark.svg#gh-dark-mode-only">
|
||
</p>
|
||
|
||
* 将  按照每行54个字符输出。
|