---
categories: Repost
date: 2023-05-24T00:00:00Z
tags:
- WinRAR
- 信息技术
- 密码学
- 逆向工程
slug: winrar-keygen
title: “rarreg.key”是如何生成的?
---
[来源](https://github.com/bitcookies/winrar-keygen)
[GF2-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20%5Ctextrm%7BGF%7D%282%29
[GF2p15-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20%5Ctextrm%7BGF%7D%282%5E%7B15%7D%29
[GF2p15p17-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29
[A-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20A
[B-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20B
[D-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20D
[G-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20G
[M-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20M
[P-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20P
[h-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20h
[k-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20k
[l-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20l
[n-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20n
[r-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20r
[s-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20s
[T-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20T
[UU-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20U
[LL-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20L
[Rnd-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Rnd
[Temp-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Temp
[UID-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20UID
[Data-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Data
[Data0-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Data%5E0
[Data1-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Data%5E1
[Data2-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Data%5E2
[Data3-inlined]: http://latex.codecogs.com/svg.latex?%5Cinline%20Data%5E3
WinRAR 使用了基于 ECC 的签名算法来生成 `rarreg.key` 文件,其使用的签名算法是中国 SM2 数字签名算法的变体。与各种标准 ECDSA 不同的是,WinRAR 使用的椭圆曲线是一个基于复合域 ![GF2p15p17-inlined] 上的曲线。
## 1. 复合域 ![GF2p15p17-inlined]
基域 ![GF2p15-inlined] 采用标准基(多项式基)来表达,采用的不可约多项式为:
各项系数全部位于 ![GF2-inlined]。设基域的标准基为:
则位于基域 ![GF2p15-inlined] 上的元素 ![A-inlined] 可以用如下方式表达:
---
复合域 ![GF2p15p17-inlined] 的不可约多项式为:
各项系数全部位于 ![GF2p15-inlined]。设复合域的标准基为:
则位于复合域 ![GF2p15p17-inlined] 上的元素 ![B-inlined] 可以用如下方式表达:
---
为了方便表述我们用 255 比特的大数 ![D-inlined] 来表示位于复合域 ![GF2p15p17-inlined] 上的元素 ![B-inlined]。它们的对应关系为:
## 2. 复合域 ![GF2p15p17-inlined] 上的椭圆曲线
曲线方程为:
基点 ![G-inlined] 为:
基点 ![G-inlined] 的阶 ![n-inlined] 为:
## 3. 消息哈希算法
设长度为 ![l-inlined] 的消息为:
则消息 ![M-inlined] 的 SHA1 值为:
其中  为 SHA1 算法输出时的 5 个状态值;将这 5 个状态值按照大端字节序依次输出,即为的 SHA1 哈希值 。
WinRAR 在做完 SHA1 计算后,采用大数 ![h-inlined] 作为 ECC 签名时消息的哈希:
## 4. ECC 签名算法
设私钥为 ![k-inlined],公钥为 ![P-inlined],即:
消息哈希为 ![h-inlined],则签名  为:
1. 生成随机数 ![Rnd-inlined],满足 。
2. 计算 ![r-inlined]
其中  表示取  的 X 坐标,同时将 X 坐标从 ![GF2p15p17-inlined] 转换为大数。
若  或者  则回到步骤 1。
3. 计算 ![s-inlined]
若  则回到步骤 1。
4. 输出 。
## 5. WinRAR 的私钥生成算法
该算法会利用长度为 ![l-inlined] 的数据
来生成私钥 ![k-inlined]。
1. 设 6 个 32 位整数为 ,则有
2. 令 。
3. 如果  则计算 ![T-inlined] 的 SHA1 值,并将状态值  赋值给 :
否则,即  时,令:
4. 把  作为计数器,自增 1。
计算 SHA1 值:
取  的低 16 位并记为 。
5. 步骤 4 再重复 14 次。
6. 重复执行完后会得到 ,则输出私钥
## 6. WinRAR 的公钥和私钥
WinRAR 的私钥 ![k-inlined] 为:
该私钥是通过算法 5 生成的,其中数据 ![T-inlined] 的长度为 0。
公钥 ![P-inlined] 为:
## 7. 授权文件"rarreg.key"的生成
授权文件的生成需要两个参数:
1. 用户名的 ANSI 字符串,不包括 null-terminator;记为
2. 授权类型的 ANSI 字符串,不包括 null-terminator;记为
`rarreg.key` 的生成算法如下:
1. 使用用户名 ![UU-inlined] 通过算法 5 计算出私钥  以及公钥 ,并将公钥  按照 SM2 压缩公钥格式以 Hex 字符串(ASCII 编码)的形式输出。得到的 Hex 字符串记为临时值 ![Temp-inlined]。
![Temp-inlined] 的长度应该为 64;若长度不足,则在前面补字符`'0'`,直到长度为 64。
2. 令字符串 ![Data3-inlined]为
3. 使用 ![Data3-inlined] 通过算法 5 计算出私钥  以及公钥 ,并将公钥  按照 SM2 压缩公钥格式以 Hex 字符串(ASCII 编码)的形式输出。得到的 Hex 字符串记为 ![Data0-inlined]。
![Data0-inlined] 的长度应该为 64;若长度不足,则在前面补字符`'0'`,直到长度为 64。
4. 令字符串 ![UID-inlined]为
5. 对授权类型 ![LL-inlined] 使用算法 4 得到签名 ,其中私钥见第 6 节。
要求  和  的长度都不得超过 240 比特,否则重复该步骤。
6. 将  和  以 16 进制形式输出(无`"0x"`前缀),分别记为  和 。
若长度不满 60,则在前面补字符`'0'`,直到长度为 60。
7. 令字符串 ![Data1-inlined]为
8. 令字符串 ![Temp-inlined]为
对 ![Temp-inlined] 使用算法 4 得到签名 ,其中私钥见第 6 节。
要求  和  的长度都不得超过 240 比特,否则重复该步骤。
9. 将  和  以 16 进制形式输出(无`"0x"`前缀),分别记为  和 。
若长度不满 60,则在前面补字符`'0'`,直到长度为 60。
10. 令字符串 ![Data2-inlined]为
11. 对
计算 CRC32 值,最终校验和为 CRC32 值的反。将校验和以 10 进制形式输出,若长度不满 10,则在前面补字符`'0'`,直到长度为 10,记为 。
12. 令字符串 ![Data-inlined]为
13. 格式化输出。
- 固定文件头`"RAR registration data"`,占一行。
- 用户名,占一行。
- 授权类型,占一行。
- UID,占一行:
- 将 ![Data-inlined] 按照每行 54 个字符输出。
## 拓展阅读
[winrar-keygen](https://github.com/bitcookies/winrar-keygen)
[WinRAR-Extractor](https://github.com/lvtx/WinRAR-Extractor)