📙 Optimization README
38
README.md
|
|
@ -12,7 +12,7 @@
|
||||||
</a>
|
</a>
|
||||||
<img src="https://img.shields.io/badge/Visual%20Studio-2022-5D4298" />
|
<img src="https://img.shields.io/badge/Visual%20Studio-2022-5D4298" />
|
||||||
<a href="https://github.com/bitcookies/winrar-keygen/actions">
|
<a href="https://github.com/bitcookies/winrar-keygen/actions">
|
||||||
<img src="https://github.com/bitcookies/winrar-keygen/actions/workflows/action.yml/badge.svg" />
|
<img src="https://github.com/bitcookies/winrar-keygen/actions/workflows/action_secrets.yml/badge.svg" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/bitcookies/winrar-keygen/blob/master/LICENSE">
|
<a href="https://github.com/bitcookies/winrar-keygen/blob/master/LICENSE">
|
||||||
<img alt="License" src="https://img.shields.io/github/license/bitcookies/winrar-keygen.svg" />
|
<img alt="License" src="https://img.shields.io/github/license/bitcookies/winrar-keygen.svg" />
|
||||||
|
|
@ -61,9 +61,17 @@ Use [Secrets](https://docs.github.com/en/actions/security-guides/encrypted-secre
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 4.2 Creating Secrets
|
### 4.2 Allow Fork repo to run Workflows
|
||||||
|
|
||||||
Open your forked repository, and go to **Settings > Secrets > Actions > New repository secret**.
|
Go back to the repo you just forked and click **Actions** to allow Workflows to run in your forked repo.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 4.3 Creating Secrets
|
||||||
|
|
||||||
|
After allowing Workflows, go to **Settings > Secrets and variables > Actions > New repository secret**.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
@ -81,7 +89,7 @@ Once created, you will see:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 4.3 Run Workflow
|
### 4.4 Run Workflow
|
||||||
|
|
||||||
Go to **Actions** and select **WinRAR Keygen Secrets** to run Workflow manually.
|
Go to **Actions** and select **WinRAR Keygen Secrets** to run Workflow manually.
|
||||||
|
|
||||||
|
|
@ -95,6 +103,10 @@ After running successfully, open the corresponding task and select **rarreg_file
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
After extract `rarreg_file.zip`, you will get `rarreg.key`, just drag and drop it into WinRAR. You can also compress `rarreg.key` into `rarkey.rar` and double-click it to run it, and the license import will take place automatically.
|
||||||
|
|
||||||
|
If you get an invalid key, please check [the specific solution](#7-invalid-key).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 5. Use Github Actions with Push
|
## 5. Use Github Actions with Push
|
||||||
|
|
@ -114,7 +126,15 @@ Using push for key generation is very simple and convenient, but when there are
|
||||||
|
|
||||||
If you've forked before and I've committed new code, but you don't know how to merge the new content into your repository, then you can delete the current fork and fork again.
|
If you've forked before and I've committed new code, but you don't know how to merge the new content into your repository, then you can delete the current fork and fork again.
|
||||||
|
|
||||||
### 5.2 Modify info.json
|
### 5.2 Allow Fork repo to run Workflows
|
||||||
|
|
||||||
|
Go back to the repo you just forked and click **Actions** to allow Workflows to run in your forked repo.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 5.3 Edit info.json
|
||||||
|
|
||||||
Open your forked repository, and go to `keygen/info.json` and click on the edit button to edit the file.
|
Open your forked repository, and go to `keygen/info.json` and click on the edit button to edit the file.
|
||||||
|
|
||||||
|
|
@ -144,13 +164,7 @@ It is important to note that `test1` and `test2` are **ANSI-encoded string, spac
|
||||||
|
|
||||||
Once you have finished making changes, click the **Commit changes** button and Github Actions will start automatically.
|
Once you have finished making changes, click the **Commit changes** button and Github Actions will start automatically.
|
||||||
|
|
||||||
If Github Actions does not start automatically, you will need to click on the Actions page to **allow this workflows to run**, then modify and commit `keygen/info.json` again.
|
### 5.4 Download Key
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 5.3 Download Key
|
|
||||||
|
|
||||||
Go to **Actions** and select **WinRAR Keygen** to see the status of the program.
|
Go to **Actions** and select **WinRAR Keygen** to see the status of the program.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
</a>
|
</a>
|
||||||
<img src="https://img.shields.io/badge/Visual%20Studio-2022-5D4298" />
|
<img src="https://img.shields.io/badge/Visual%20Studio-2022-5D4298" />
|
||||||
<a href="https://github.com/bitcookies/winrar-keygen/actions">
|
<a href="https://github.com/bitcookies/winrar-keygen/actions">
|
||||||
<img src="https://github.com/bitcookies/winrar-keygen/actions/workflows/action.yml/badge.svg" />
|
<img src="https://github.com/bitcookies/winrar-keygen/actions/workflows/action_secrets.yml/badge.svg" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/bitcookies/winrar-keygen/blob/master/LICENSE">
|
<a href="https://github.com/bitcookies/winrar-keygen/blob/master/LICENSE">
|
||||||
<img alt="License" src="https://img.shields.io/github/license/bitcookies/winrar-keygen.svg" />
|
<img alt="License" src="https://img.shields.io/github/license/bitcookies/winrar-keygen.svg" />
|
||||||
|
|
@ -61,9 +61,17 @@ WinRAR不是免费软件。如果你想使用它,你应当向 [__RARLAB__](htt
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 4.2 创建 Secrets
|
### 4.2 允许 Fork 代码运行 Workflows
|
||||||
|
|
||||||
打开你 fork 后的仓库,进入 **Settings > Secrets > Actions > New repository secret** 来创建:
|
返回到你刚刚 fork 完成的 repo,然后点击 **Actions** 去允许 Workflows 在你的 fork repo 中运行:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 4.3 创建 Secrets
|
||||||
|
|
||||||
|
允许 Workflows 后,进入 **Settings > Secrets and variables > Actions > New repository secret** 来创建 Secrets:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
@ -81,9 +89,9 @@ WinRAR不是免费软件。如果你想使用它,你应当向 [__RARLAB__](htt
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 4.3 运行 Workflow
|
### 4.4 运行 Workflow
|
||||||
|
|
||||||
进入 **Actions** 并选择 **WinRAR Keygen Secrets** 来手动执行 Workflow:
|
进入 **Actions** 并选择 **WinRAR Keygen Secrets > Run workflow > Run workflow ** 来手动执行 Workflow:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
@ -95,6 +103,10 @@ WinRAR不是免费软件。如果你想使用它,你应当向 [__RARLAB__](htt
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
将 `rarreg_file.zip` 解压缩后会得到 `rarreg.key`,然后拖动导入 WinRAR 即可。你也可以将 `rarreg.key` 压缩成 `rarkey.rar`,然后双击运行,授权导入将会自动进行。
|
||||||
|
|
||||||
|
如果你得到的是 key 是无效的,请查看 [解决方法](#7-无效的-Key)。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 5. 通过 Push 使用 Github Actions
|
## 5. 通过 Push 使用 Github Actions
|
||||||
|
|
@ -114,9 +126,17 @@ WinRAR不是免费软件。如果你想使用它,你应当向 [__RARLAB__](htt
|
||||||
|
|
||||||
如果你之前 fork 过,然后我提交了新的代码,但是你不懂得如何合并新内容到你的仓库,那你也可以删掉当前 fork 的仓库,然后重新 fork 一次。
|
如果你之前 fork 过,然后我提交了新的代码,但是你不懂得如何合并新内容到你的仓库,那你也可以删掉当前 fork 的仓库,然后重新 fork 一次。
|
||||||
|
|
||||||
### 5.2 修改 info.json
|
### 5.2 允许 Fork 代码运行 Workflows
|
||||||
|
|
||||||
打开你 fork 后的仓库,进入 `keygen/info.json`,点击编辑按钮,对该文件进行编辑:
|
返回到你刚刚 fork 完成的 repo,然后点击 Actions 去允许 Workflows 在你的 fork repo 中运行:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 5.3 修改 info.json
|
||||||
|
|
||||||
|
允许 Workflows 后,进入 `keygen/info.json`,点击编辑按钮,对该文件进行编辑:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
@ -144,13 +164,7 @@ WinRAR不是免费软件。如果你想使用它,你应当向 [__RARLAB__](htt
|
||||||
|
|
||||||
修改完成之后,点击 **Commit changes** 按钮,Github Actions 会自动开始执行。
|
修改完成之后,点击 **Commit changes** 按钮,Github Actions 会自动开始执行。
|
||||||
|
|
||||||
如果 Github Actions 未自动开始,你需要先点击 Actions 页面 **允许此 workflows 运行**,然后再次修改并提交 `keygen/info.json` 。
|
### 5.4 下载文件
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 5.3 下载文件
|
|
||||||
|
|
||||||
进入 **Actions** 并选择 **WinRAR Keygen** 页面查看程序运行状况:
|
进入 **Actions** 并选择 **WinRAR Keygen** 页面查看程序运行状况:
|
||||||
|
|
||||||
|
|
@ -166,7 +180,7 @@ WinRAR不是免费软件。如果你想使用它,你应当向 [__RARLAB__](htt
|
||||||
|
|
||||||
将 `rarreg_file.zip` 解压缩后会得到 `rarreg.key`,然后拖动导入 WinRAR 即可。你也可以将 `rarreg.key` 压缩成 `rarkey.rar`,然后双击运行,授权导入将会自动进行。
|
将 `rarreg_file.zip` 解压缩后会得到 `rarreg.key`,然后拖动导入 WinRAR 即可。你也可以将 `rarreg.key` 压缩成 `rarkey.rar`,然后双击运行,授权导入将会自动进行。
|
||||||
|
|
||||||
如果你得到的是 key 是无效的,请查看 [解决方法](#7-无效的key)。
|
如果你得到的是 key 是无效的,请查看 [解决方法](#7-无效的-Key)。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,321 +0,0 @@
|
||||||
[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
|
|
||||||
|
|
||||||
# How is "rarreg.key" generated?
|
|
||||||
|
|
||||||
WinRAR uses an ECC-based signature algorithm to generate `rarreg.key`. The algorithm it used is a variant of Chinese SM2 digital signature algorithm. Different to many standard ECDSAs, the curve that WinRAR selected is a curve over composite field ![GF2p15p17-inlined].
|
|
||||||
|
|
||||||
## 1. Composite field ![GF2p15p17-inlined]
|
|
||||||
|
|
||||||
Elements in ground field ![GF2p15-inlined] are represented with standard basis, i.e. polynomial basis. The irreducible polynomial is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?P%28%5Calpha%29%3D%5Calpha%5E%7B15%7D+%5Calpha+1")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
where each coefficients is in ![GF2-inlined]. If we use
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B_1%3D%5C%7B1%2C%5Calpha%2C%5Calpha%5E2%2C%5Cldots%2C%5Calpha%5E%7B14%7D%5C%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
as the standard basis of the ground field, an element ![A-inlined] in ![GF2p15-inlined] can be denoted as
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?A%3D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_i%5Calpha%5Ei%20%5Cquad%20%5Cquad%20%5Cquad%20a_i%5Cin%5Ctextrm%7BGF%7D%282%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
The irreducible polynomial of composite field ![GF2p15p17-inlined] is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Q%28%5Cbeta%29%3D%5Cbeta%5E%7B17%7D+%5Cbeta%5E3+1")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
where each coefficients is in ![GF2p15-inlined]. If we use
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B_2%3D%5C%7B1%2C%5Cbeta%2C%5Cbeta%5E2%2C%5Cldots%2C%5Cbeta%5E%7B16%7D%5C%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
as the standard basis of the composite field, an element ![B-inlined] in ![GF2p15p17-inlined] can be denoted as
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%28%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Calpha%5Ei%29%5Cbeta%5Ej%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Calpha%5Ei%5Cbeta%5Ej%20%5Cquad%20%5Cquad%20%5Cquad%20a_%7Bj%2Ci%7D%5Cin%5Ctextrm%7BGF%7D%282%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
For clarity, we use ![D-inlined], which is a 255-bits-long integer to denote an element ![B-inlined] in ![GF2p15p17-inlined]. The map between them is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Calpha%5Ei%5Cbeta%5Ej%20%5Cleftrightarrow%20D%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Ccdot%202%5E%7B15j+i%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 2. Elliptic curve over ![GF2p15p17-inlined]
|
|
||||||
|
|
||||||
The equation of the elliptic curve that WinRAR uses is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?y%5E2+xy%3Dx%5E3+161%20%5Cquad%20%5Cquad%20%5Cquad%20161%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
The base point ![G-inlined] is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20G%26%3D%28G_x%2CG_y%29%20%5C%5C%20G_x%26%3D%5Ctextrm%7B0x56fdcbc6a27acee0cc2996e0096ae74feb1acf220a2341b898b549440297b8cc%7D%20%5Cquad%20G_x%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%5C%5C%20G_y%26%3D%5Ctextrm%7B0x20da32e8afc90b7cf0e76bde44496b4d0794054e6ea60f388682463132f931a7%7D%20%5Cquad%20G_y%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%20%5Cend%7Baligned%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
whose order ![n-inlined] is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?n%3D%5Ctextrm%7B0x1026dd85081b82314691ced9bbec30547840e4bf72d8b5e0d258442bbcd31%7D%20%5Cquad%20n%5Cin%5Cnolinebreak%5Cmathbb%7BZ%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 3. Message hash algorithm
|
|
||||||
|
|
||||||
We use
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?M%3Dm_0m_1%20%5Cldots%20m_%7Bl-1%7D%20%5Cquad%20%5Cquad%20m_i%5Cin%5B0%2C%20256%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
to denote a message whose length is ![l-inlined]. So the SHA1 value of ![M-inlined] should be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Ctextrm%7BSHA%7D_1%28M%29%3DS_0%7C%7CS_1%7C%7CS_2%7C%7CS_3%7C%7CS_4%20%5Cquad%20%5Cquad%20S_i%5Cin%5B0%2C%202%5E%7B32%7D%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
where  are 5 state values when SHA1 outputs. Generally speaking, the final SHA1 value should be the join of these 5 state values while each of state values is serialized in big-endian.
|
|
||||||
|
|
||||||
However, WinRAR doesn't serialize the 5 state values. Instead, it use a big integer ![h-inlined] as the hash of the input message.
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?h%3D%28%5Csum_%7Bi%3D0%7D%5E%7B4%7DS_i%20%5Ccdot%202%5E%7B32i%7D%29+%5Ctextrm%7B0x1bd10xb4e33c7c0ffd8d43%7D%20%5Ccdot%202%5E%7B32*5%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 4. ECC digital signature algorithm
|
|
||||||
|
|
||||||
We use ![k-inlined] to denote private key, ![P-inlined] to denote public key. So there must be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?P%3Dk%20%5Ccdot%20G")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
If we use ![h-inlined] to denote the hash of input data, WinRAR use the following algorithm to perform signing:
|
|
||||||
|
|
||||||
1. Generate a random big integer ![Rnd-inlined] which satisfies .
|
|
||||||
|
|
||||||
2. Calculate ![r-inlined]
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?r%3D%28%28Rnd%20%5Ccdot%20G%29_x+h%29%5C%20%5C%20Mod%5C%20%5C%20n">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
where  means we take X coordinate of  and convert it from ![GF2p15p17-inlined] to a big integer.
|
|
||||||
|
|
||||||
If  or , go back to step 1.
|
|
||||||
|
|
||||||
3. Calculate ![s-inlined]
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?s%3D%28Rnd-kr%29%5C%20%5C%20Mod%5C%20%5C%20n">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
If , go back to step 1.
|
|
||||||
|
|
||||||
4. Output .
|
|
||||||
|
|
||||||
## 5. WinRAR private key generation algorithm
|
|
||||||
|
|
||||||
We use
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?T%3Dt_0t_1%20%5Cldots%20t_%7Bl-1%7D%20%5Cquad%20%5Cquad%20t_i%5Cin%5B0%2C256%29">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
to denote input data whose length is ![l-inlined]. WinRAR use it to generate private key ![k-inlined].
|
|
||||||
|
|
||||||
1. We use  to denote 6 32-bits-long integer. So there is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?g_j%3D%5Csum_%7Bi%3D0%7D%5E%7B3%7Dg_%7Bj%2Ci%7D%20%5Ccdot%202%5E%7B8i%7D%20%5Cquad%20%5Cquad%20g_%7Bj%2Ci%7D%5Cin%5B0%2C256%29">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
2. Let .
|
|
||||||
|
|
||||||
3. If , we calculate SHA1 value of ![T-inlined]. Then assign SHA1 state value  to :
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20%5Ctextrm%7BSHA%7D_1%28T%29%26%3DS_0%7C%7CS_1%7C%7CS_2%7C%7CS_3%7C%7CS_4%20%5C%5C%20g_1%26%3DS_0%20%5C%5C%20g_2%26%3DS_1%20%5C%5C%20g_3%26%3DS_2%20%5C%5C%20g_4%26%3DS_3%20%5C%5C%20g_5%26%3DS_4%20%5C%5C%20%5Cend%7Baligned%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
Otherwise, when , we let
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20g_1%26%3D%5Ctextrm%7B0xeb3eb781%7D%20%5C%5C%20g_2%26%3D%5Ctextrm%7B0x50265329%7D%20%5C%5C%20g_3%26%3D%5Ctextrm%7B0xdc5ef4a3%7D%20%5C%5C%20g_4%26%3D%5Ctextrm%7B0x6847b9d5%7D%20%5C%5C%20g_5%26%3D%5Ctextrm%7B0xcde43b4c%7D%20%5C%5C%20%5Cend%7Baligned%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
4. Regard  as counter, add itself by 1.
|
|
||||||
|
|
||||||
Calculate SHA1:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Ctextrm%7BSHA%7D_1%28g_%7B0%2C0%7D%7C%7Cg_%7B0%2C1%7D%7C%7Cg_%7B0%2C2%7D%7C%7Cg_%7B0%2C3%7D%7C%7Cg_%7B1%2C0%7D%7C%7Cg_%7B1%2C1%7D%7C%7C%5Cldots%7C%7Cg_%7B5%2C0%7D%7C%7Cg_%7B5%2C1%7D%7C%7Cg_%7B5%2C2%7D%7C%7Cg_%7B5%2C3%7D%29%3DS_0%7C%7CS_1%7C%7CS_2%7C%7CS_3%7C%7CS_4">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
We takes the lowest 16 bits of  and donote it as .
|
|
||||||
|
|
||||||
5. Repeat step 4 again with 14 times.
|
|
||||||
|
|
||||||
6. After that, we will get . Then output private key
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?k%3D%5Csum_%7Bi%3D1%7D%5E%7B15%7Dk_i%20%5Ccdot%202%5E%7B16i%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 6. The private key and public key of WinRAR
|
|
||||||
|
|
||||||
Private key ![k-inlined] is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?k%3D%5Ctextrm%7B0x59fe6abcca90bdb95f0105271fa85fb9f11f467450c1ae9044b7fd61d65e%7D%20%5Cquad%20%5Cquad%20k%5Cin%5Cnolinebreak%5Cmathbb%7BZ%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
This private key is generated by the algorithm describled in section 5 where the length of data ![T-inlined] is zero.
|
|
||||||
|
|
||||||
Public key ![P-inlined] is
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20P%26%3D%28P_x%2CP_y%29%20%5C%5C%20P_x%26%3D%5Ctextrm%7B0x3861220ed9b36c9753df09a159dfb148135d495db3af8373425ee9a28884ba1a%7D%20%5Cquad%20P_x%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%20%5C%5C%20P_y%26%3D%5Ctextrm%7B0x12b64e62db43a56114554b0cbd573379338cea9124c8443c4f50e6c8b013ec20%7D%20%5Cquad%20P_y%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%20%5Cend%7Baligned%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 7. Generation of "rarreg.key"
|
|
||||||
|
|
||||||
The generation of license file `rarreg.key` requires 2 arguments:
|
|
||||||
|
|
||||||
1. Username, an ANSI-encoded string, without null-terminator. Denoted as
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?U%3Du_0u_1%20%5Cldots%20u_%7Bl-1%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
2. License type, an ANSI-encoded string, without null-terminator. Denoted as
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?L%3Dl_0l_1%20%5Cldots%20l_%7Bl-1%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
The following is the algorithm to generate `rarreg.key`.
|
|
||||||
|
|
||||||
1. Use the algorithm describled in section 5, with argument ![UU-inlined], to generate private key  and public key . Then output hexlified public key string with SM2 compressed public key format. The hexlified public key is denoted as ![Temp-inlined].
|
|
||||||
|
|
||||||
The length of ![Temp-inlined] should be 64. If less, pad with `'0'` until the length is 64.
|
|
||||||
|
|
||||||
2. Let ![Data3-inlined] be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Data%5E3%3D%5Ctexttt%7B%2260%22%7D%7C%7CTemp_0%7C%7CTemp_1%7C%7C%5Cldots%7C%7CTemp_%7B47%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
3. Use the algorithm describled in section 5, with argument ![Data3-inlined], to generate private key  and public key . Then output hexlified public key string with SM2 compressed public key format. The hexlified public key is denoted as ![Data0-inlined].
|
|
||||||
|
|
||||||
The length of ![Data0-inlined] should be 64. If less, pad with `'0'` until the length is 64.
|
|
||||||
|
|
||||||
4. Let ![UID-inlined] be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?UID%3DTemp_%7B48%7D%7C%7CTemp_%7B49%7D%7C%7C%5Cldots%7C%7CTemp_%7B63%7D%7C%7CData%5E0_0%7C%7CData%5E0_1%7C%7CData%5E0_2%7C%7CData%5E0_3">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
5. Use the algorithm describled in section 4, with argument ![LL-inlined] and private key ![k-inlined] describled section 6, to get signature .
|
|
||||||
|
|
||||||
The bit length of  and  shall not be more than 240. Otherwise, repeat this step.
|
|
||||||
|
|
||||||
6. Convert  and  to hex-integer string  and , without `"0x"` prefix.
|
|
||||||
|
|
||||||
If the length of  or  is less than 60, pad character `'0'` until the length is 60.
|
|
||||||
|
|
||||||
7. Let ![Data1-inlined] be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Data%5E1%3D%5Ctexttt%7B%2260%22%7D%7C%7CSZ%5E%7Bs_L%7D%7C%7CSZ%5E%7Br_L%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
8. Let ![Temp-inlined] be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Temp%3DU%7C%7CData%5E0">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
Use the algorithm describled in section 4, with argument ![Temp-inlined] and private key ![k-inlined] describled section 6, to get signature .
|
|
||||||
|
|
||||||
The bit length of  and  shall not be more than 240. Otherwise, repeat this step.
|
|
||||||
|
|
||||||
9. Convert  and  to hex-integer string  and , without `"0x"` prefix.
|
|
||||||
|
|
||||||
If the length of  or  is less than 60, pad character `'0'` until the length is 60.
|
|
||||||
|
|
||||||
10. Let ![Data2-inlined] be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Data%5E2%3D%5Ctexttt%7B%2260%22%7D%7C%7CSZ%5E%7Bs_%7BTemp%7D%7D%7C%7CSZ%5E%7Br_%7BTemp%7D%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
11. Calculate CRC32 value of
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?L%7C%7CU%7C%7CData%5E0%7C%7CData%5E1%7C%7CData%5E2%7C%7CData%5E3">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
The final checksum the complement of CRC32 value.
|
|
||||||
|
|
||||||
Then convert the checksum to decimal string . If the length is less than 10, pad character `'0'` until the length is 10.
|
|
||||||
|
|
||||||
12. Let ![Data-inlined] be
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cinline%20Data%3DData%5E0%7C%7CData%5E1%7C%7CData%5E2%7C%7CData%5E3%7C%7CSZ%5E%7Bchecksum%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
13. Output with format
|
|
||||||
|
|
||||||
* A fixed header `"RAR registration data"`, taking one line.
|
|
||||||
|
|
||||||
* Username, taking one line.
|
|
||||||
|
|
||||||
* License type, taking one line
|
|
||||||
|
|
||||||
* UID, taking one line, with format:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Ctexttt%7B%22UID%3D%22%7D%7C%7CUID">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
* Output ![Data-inlined], with 54 characters a line.
|
|
||||||
|
|
||||||
|
|
@ -1,319 +0,0 @@
|
||||||
[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
|
|
||||||
|
|
||||||
# "rarreg.key"是如何生成的?
|
|
||||||
|
|
||||||
WinRAR 使用了基于 ECC 的签名算法来生成 `rarreg.key` 文件,其使用的签名算法是中国 SM2 数字签名算法的变体。与各种标准 ECDSA 不同的是,WinRAR 使用的椭圆曲线是一个基于复合域 ![GF2p15p17-inlined] 上的曲线。
|
|
||||||
|
|
||||||
## 1. 复合域 ![GF2p15p17-inlined]
|
|
||||||
|
|
||||||
基域 ![GF2p15-inlined] 采用标准基(多项式基)来表达,采用的不可约多项式为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?P%28%5Calpha%29%3D%5Calpha%5E%7B15%7D+%5Calpha+1">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
各项系数全部位于 ![GF2-inlined]。设基域的标准基为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B_1%3D%5C%7B1%2C%5Calpha%2C%5Calpha%5E2%2C%5Cldots%2C%5Calpha%5E%7B14%7D%5C%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
则位于基域 ![GF2p15-inlined] 上的元素 ![A-inlined] 可以用如下方式表达:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?A%3D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_i%5Calpha%5Ei%20%5Cquad%20%5Cquad%20%5Cquad%20a_i%5Cin%5Ctextrm%7BGF%7D%282%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
复合域 ![GF2p15p17-inlined] 的不可约多项式为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Q%28%5Cbeta%29%3D%5Cbeta%5E%7B17%7D+%5Cbeta%5E3+1")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
各项系数全部位于 ![GF2p15-inlined]。设复合域的标准基为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B_2%3D%5C%7B1%2C%5Cbeta%2C%5Cbeta%5E2%2C%5Cldots%2C%5Cbeta%5E%7B16%7D%5C%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
则位于复合域 ![GF2p15p17-inlined] 上的元素 ![B-inlined] 可以用如下方式表达:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%28%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Calpha%5Ei%29%5Cbeta%5Ej%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Calpha%5Ei%5Cbeta%5Ej%20%5Cquad%20%5Cquad%20%5Cquad%20a_%7Bj%2Ci%7D%5Cin%5Ctextrm%7BGF%7D%282%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
为了方便表述我们用255比特的大数 ![D-inlined] 来表示位于复合域 ![GF2p15p17-inlined] 上的元素 ![B-inlined]。它们的对应关系为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?B%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Calpha%5Ei%5Cbeta%5Ej%20%5Cleftrightarrow%20D%3D%5Csum_%7Bj%3D0%7D%5E%7B16%7D%5Csum_%7Bi%3D0%7D%5E%7B14%7Da_%7Bj%2Ci%7D%5Ccdot%202%5E%7B15j+i%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 2. 复合域 ![GF2p15p17-inlined] 上的椭圆曲线
|
|
||||||
|
|
||||||
曲线方程为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?y%5E2+xy%3Dx%5E3+161%20%5Cquad%20%5Cquad%20%5Cquad%20161%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
基点 ![G-inlined] 为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20G%26%3D%28G_x%2CG_y%29%20%5C%5C%20G_x%26%3D%5Ctextrm%7B0x56fdcbc6a27acee0cc2996e0096ae74feb1acf220a2341b898b549440297b8cc%7D%20%5Cquad%20G_x%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%5C%5C%20G_y%26%3D%5Ctextrm%7B0x20da32e8afc90b7cf0e76bde44496b4d0794054e6ea60f388682463132f931a7%7D%20%5Cquad%20G_y%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%20%5Cend%7Baligned%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
基点 ![G-inlined] 的阶 ![n-inlined] 为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?n%3D%5Ctextrm%7B0x1026dd85081b82314691ced9bbec30547840e4bf72d8b5e0d258442bbcd31%7D%20%5Cquad%20n%5Cin%5Cnolinebreak%5Cmathbb%7BZ%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 3. 消息哈希算法
|
|
||||||
|
|
||||||
设长度为 ![l-inlined] 的消息为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?M%3Dm_0m_1%20%5Cldots%20m_%7Bl-1%7D%20%5Cquad%20%5Cquad%20m_i%5Cin%5B0%2C%20256%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
则消息 ![M-inlined] 的SHA1值为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Ctextrm%7BSHA%7D_1%28M%29%3DS_0%7C%7CS_1%7C%7CS_2%7C%7CS_3%7C%7CS_4%20%5Cquad%20%5Cquad%20S_i%5Cin%5B0%2C%202%5E%7B32%7D%29")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
其中  为SHA1算法输出时的5个状态值;将这5个状态值按照大端字节序依次输出,即为的SHA1哈希值 。
|
|
||||||
|
|
||||||
WinRAR在做完SHA1计算后,采用大数 ![h-inlined] 作为ECC签名时消息的哈希:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?h%3D%28%5Csum_%7Bi%3D0%7D%5E%7B4%7DS_i%20%5Ccdot%202%5E%7B32i%7D%29+%5Ctextrm%7B0x1bd10xb4e33c7c0ffd8d43%7D%20%5Ccdot%202%5E%7B32*5%7D")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
## 4. ECC签名算法
|
|
||||||
|
|
||||||
设私钥为 ![k-inlined],公钥为 ![P-inlined],即:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?P%3Dk%20%5Ccdot%20G")
|
|
||||||
</p>
|
|
||||||
|
|
||||||
消息哈希为 ![h-inlined],则签名  为:
|
|
||||||
|
|
||||||
1. 生成随机数 ![Rnd-inlined],满足 。
|
|
||||||
|
|
||||||
2. 计算 ![r-inlined]
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?r%3D%28%28Rnd%20%5Ccdot%20G%29_x+h%29%5C%20%5C%20Mod%5C%20%5C%20n">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
其中  表示取  的X坐标,同时将X坐标从 ![GF2p15p17-inlined] 转换为大数。
|
|
||||||
|
|
||||||
若  或者  则回到步骤1。
|
|
||||||
|
|
||||||
3. 计算 ![s-inlined]
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?s%3D%28Rnd-kr%29%5C%20%5C%20Mod%5C%20%5C%20n">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
若  则回到步骤1。
|
|
||||||
|
|
||||||
4. 输出 。
|
|
||||||
|
|
||||||
## 5. WinRAR的私钥生成算法
|
|
||||||
|
|
||||||
该算法会利用长度为 ![l-inlined] 的数据
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?T%3Dt_0t_1%20%5Cldots%20t_%7Bl-1%7D%20%5Cquad%20%5Cquad%20t_i%5Cin%5B0%2C256%29">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
来生成私钥 ![k-inlined]。
|
|
||||||
|
|
||||||
1. 设6个32位整数为 ,则有
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?g_j%3D%5Csum_%7Bi%3D0%7D%5E%7B3%7Dg_%7Bj%2Ci%7D%20%5Ccdot%202%5E%7B8i%7D%20%5Cquad%20%5Cquad%20g_%7Bj%2Ci%7D%5Cin%5B0%2C256%29">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
2. 令 。
|
|
||||||
|
|
||||||
3. 如果  则计算 ![T-inlined] 的SHA1值,并将状态值  赋值给 :
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20%5Ctextrm%7BSHA%7D_1%28T%29%26%3DS_0%7C%7CS_1%7C%7CS_2%7C%7CS_3%7C%7CS_4%20%5C%5C%20g_1%26%3DS_0%20%5C%5C%20g_2%26%3DS_1%20%5C%5C%20g_3%26%3DS_2%20%5C%5C%20g_4%26%3DS_3%20%5C%5C%20g_5%26%3DS_4%20%5C%5C%20%5Cend%7Baligned%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
否则,即  时,令:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20g_1%26%3D%5Ctextrm%7B0xeb3eb781%7D%20%5C%5C%20g_2%26%3D%5Ctextrm%7B0x50265329%7D%20%5C%5C%20g_3%26%3D%5Ctextrm%7B0xdc5ef4a3%7D%20%5C%5C%20g_4%26%3D%5Ctextrm%7B0x6847b9d5%7D%20%5C%5C%20g_5%26%3D%5Ctextrm%7B0xcde43b4c%7D%20%5C%5C%20%5Cend%7Baligned%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
4. 把  作为计数器,自增1。
|
|
||||||
|
|
||||||
计算SHA1值:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Ctextrm%7BSHA%7D_1%28g_%7B0%2C0%7D%7C%7Cg_%7B0%2C1%7D%7C%7Cg_%7B0%2C2%7D%7C%7Cg_%7B0%2C3%7D%7C%7Cg_%7B1%2C0%7D%7C%7Cg_%7B1%2C1%7D%7C%7C%5Cldots%7C%7Cg_%7B5%2C0%7D%7C%7Cg_%7B5%2C1%7D%7C%7Cg_%7B5%2C2%7D%7C%7Cg_%7B5%2C3%7D%29%3DS_0%7C%7CS_1%7C%7CS_2%7C%7CS_3%7C%7CS_4">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
取  的低16位并记为 。
|
|
||||||
|
|
||||||
5. 步骤4再重复14次。
|
|
||||||
|
|
||||||
6. 重复执行完后会得到 ,则输出私钥
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?k%3D%5Csum_%7Bi%3D1%7D%5E%7B15%7Dk_i%20%5Ccdot%202%5E%7B16i%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 6. WinRAR的公钥和私钥
|
|
||||||
|
|
||||||
WinRAR的私钥 ![k-inlined] 为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?k%3D%5Ctextrm%7B0x59fe6abcca90bdb95f0105271fa85fb9f11f467450c1ae9044b7fd61d65e%7D%20%5Cquad%20%5Cquad%20k%5Cin%5Cnolinebreak%5Cmathbb%7BZ%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
该私钥是通过算法5生成的,其中数据 ![T-inlined] 的长度为0。
|
|
||||||
|
|
||||||
公钥 ![P-inlined] 为:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cbegin%7Baligned%7D%20P%26%3D%28P_x%2CP_y%29%20%5C%5C%20P_x%26%3D%5Ctextrm%7B0x3861220ed9b36c9753df09a159dfb148135d495db3af8373425ee9a28884ba1a%7D%20%5Cquad%20P_x%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%20%5C%5C%20P_y%26%3D%5Ctextrm%7B0x12b64e62db43a56114554b0cbd573379338cea9124c8443c4f50e6c8b013ec20%7D%20%5Cquad%20P_y%5Cin%5Ctextrm%7BGF%7D%28%282%5E%7B15%7D%29%5E%7B17%7D%29%20%5Cend%7Baligned%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 7. 授权文件"rarreg.key"的生成
|
|
||||||
|
|
||||||
授权文件的生成需要两个参数:
|
|
||||||
|
|
||||||
1. 用户名的ANSI字符串,不包括null-terminator;记为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?U%3Du_0u_1%20%5Cldots%20u_%7Bl-1%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
2. 授权类型的ANSI字符串,不包括null-terminator;记为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?L%3Dl_0l_1%20%5Cldots%20l_%7Bl-1%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
`rarreg.key` 的生成算法如下:
|
|
||||||
|
|
||||||
1. 使用用户名 ![UU-inlined] 通过算法5计算出私钥  以及公钥 ,并将公钥  按照SM2压缩公钥格式以Hex字符串(ASCII编码)的形式输出。得到的Hex字符串记为临时值 ![Temp-inlined]。
|
|
||||||
|
|
||||||
![Temp-inlined] 的长度应该为64;若长度不足,则在前面补字符`'0'`,直到长度为64。
|
|
||||||
|
|
||||||
2. 令字符串 ![Data3-inlined]为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Data%5E3%3D%5Ctexttt%7B%2260%22%7D%7C%7CTemp_0%7C%7CTemp_1%7C%7C%5Cldots%7C%7CTemp_%7B47%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
3. 使用 ![Data3-inlined] 通过算法5计算出私钥  以及公钥 ,并将公钥  按照SM2压缩公钥格式以Hex字符串(ASCII编码)的形式输出。得到的Hex字符串记为 ![Data0-inlined]。
|
|
||||||
|
|
||||||
![Data0-inlined] 的长度应该为64;若长度不足,则在前面补字符`'0'`,直到长度为64。
|
|
||||||
|
|
||||||
4. 令字符串 ![UID-inlined]为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?UID%3DTemp_%7B48%7D%7C%7CTemp_%7B49%7D%7C%7C%5Cldots%7C%7CTemp_%7B63%7D%7C%7CData%5E0_0%7C%7CData%5E0_1%7C%7CData%5E0_2%7C%7CData%5E0_3">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
5. 对授权类型 ![LL-inlined] 使用算法4得到签名 ,其中私钥见第6节。
|
|
||||||
|
|
||||||
要求  和  的长度都不得超过240比特,否则重复该步骤。
|
|
||||||
|
|
||||||
6. 将  和  以16进制形式输出(无`"0x"`前缀),分别记为  和 。
|
|
||||||
|
|
||||||
若长度不满60,则在前面补字符`'0'`,直到长度为60。
|
|
||||||
|
|
||||||
7. 令字符串 ![Data1-inlined]为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Data%5E1%3D%5Ctexttt%7B%2260%22%7D%7C%7CSZ%5E%7Bs_L%7D%7C%7CSZ%5E%7Br_L%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
8. 令字符串 ![Temp-inlined]为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Temp%3DU%7C%7CData%5E0">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
对 ![Temp-inlined] 使用算法4得到签名 ,其中私钥见第6节。
|
|
||||||
|
|
||||||
要求  和  的长度都不得超过240比特,否则重复该步骤。
|
|
||||||
|
|
||||||
9. 将  和  以16进制形式输出(无`"0x"`前缀),分别记为  和 。
|
|
||||||
|
|
||||||
若长度不满60,则在前面补字符`'0'`,直到长度为60。
|
|
||||||
|
|
||||||
10. 令字符串 ![Data2-inlined]为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?Data%5E2%3D%5Ctexttt%7B%2260%22%7D%7C%7CSZ%5E%7Bs_%7BTemp%7D%7D%7C%7CSZ%5E%7Br_%7BTemp%7D%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
11. 对
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?L%7C%7CU%7C%7CData%5E0%7C%7CData%5E1%7C%7CData%5E2%7C%7CData%5E3">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
计算CRC32值,最终校验和为CRC32值的反。将校验和以10进制形式输出,若长度不满10,则在前面补字符`'0'`,直到长度为10,记为 。
|
|
||||||
|
|
||||||
12. 令字符串 ![Data-inlined]为
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Cinline%20Data%3DData%5E0%7C%7CData%5E1%7C%7CData%5E2%7C%7CData%5E3%7C%7CSZ%5E%7Bchecksum%7D">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
13. 格式化输出。
|
|
||||||
|
|
||||||
* 固定文件头`"RAR registration data"`,占一行。
|
|
||||||
|
|
||||||
* 用户名,占一行。
|
|
||||||
|
|
||||||
* 授权类型,占一行。
|
|
||||||
|
|
||||||
* UID,占一行:
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="http://latex.codecogs.com/svg.latex?%5Ctexttt%7B%22UID%3D%22%7D%7C%7CUID">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
* 将 ![Data-inlined] 按照每行54个字符输出。
|
|
||||||
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 238 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 29 KiB |