easy-encryption-tool 2.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. easy_encryption_tool-2.6.0/PKG-INFO +1553 -0
  2. easy_encryption_tool-2.6.0/easy_encryption_tool/__init__.py +30 -0
  3. easy_encryption_tool-2.6.0/easy_encryption_tool/aes_command.py +1023 -0
  4. easy_encryption_tool-2.6.0/easy_encryption_tool/cert_parse.py +638 -0
  5. easy_encryption_tool-2.6.0/easy_encryption_tool/cipherhub_defaults.py +43 -0
  6. easy_encryption_tool-2.6.0/easy_encryption_tool/command_perf.py +35 -0
  7. easy_encryption_tool-2.6.0/easy_encryption_tool/common.py +654 -0
  8. easy_encryption_tool-2.6.0/easy_encryption_tool/convert_command.py +228 -0
  9. easy_encryption_tool-2.6.0/easy_encryption_tool/crypto/__init__.py +11 -0
  10. easy_encryption_tool-2.6.0/easy_encryption_tool/ecc_command.py +910 -0
  11. easy_encryption_tool-2.6.0/easy_encryption_tool/envelope_command.py +1632 -0
  12. easy_encryption_tool-2.6.0/easy_encryption_tool/hash_command.py +223 -0
  13. easy_encryption_tool-2.6.0/easy_encryption_tool/hints.py +30 -0
  14. easy_encryption_tool-2.6.0/easy_encryption_tool/hmac_command.py +338 -0
  15. easy_encryption_tool-2.6.0/easy_encryption_tool/int_bytes_command.py +176 -0
  16. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/__init__.py +19 -0
  17. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/availability.py +45 -0
  18. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/__init__.py +83 -0
  19. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/aliyun.py +179 -0
  20. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/aws.py +102 -0
  21. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/azure.py +197 -0
  22. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/googlecloud.py +196 -0
  23. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/hashicorpvault.py +184 -0
  24. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/huaweicloud.py +299 -0
  25. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/backends/tencentcloud.py +165 -0
  26. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/config.py +30 -0
  27. easy_encryption_tool-2.6.0/easy_encryption_tool/kms/errors.py +17 -0
  28. easy_encryption_tool-2.6.0/easy_encryption_tool/main.py +307 -0
  29. easy_encryption_tool-2.6.0/easy_encryption_tool/output_builder.py +177 -0
  30. easy_encryption_tool-2.6.0/easy_encryption_tool/output_renderer.py +74 -0
  31. easy_encryption_tool-2.6.0/easy_encryption_tool/random_str.py +243 -0
  32. easy_encryption_tool-2.6.0/easy_encryption_tool/rich_ui.py +394 -0
  33. easy_encryption_tool-2.6.0/easy_encryption_tool/rsa_command.py +854 -0
  34. easy_encryption_tool-2.6.0/easy_encryption_tool/shell_completion.py +86 -0
  35. easy_encryption_tool-2.6.0/easy_encryption_tool/sm2_command.py +749 -0
  36. easy_encryption_tool-2.6.0/easy_encryption_tool/sm4_command.py +899 -0
  37. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/__init__.py +6 -0
  38. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/aad.py +20 -0
  39. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/errors.py +74 -0
  40. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/format_detect.py +87 -0
  41. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/ini_store.py +84 -0
  42. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/json_store.py +61 -0
  43. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/keys.py +28 -0
  44. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/mac.py +123 -0
  45. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/policy.py +74 -0
  46. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/token.py +74 -0
  47. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/traversal.py +205 -0
  48. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/types.py +89 -0
  49. easy_encryption_tool-2.6.0/easy_encryption_tool/structured/yaml_store.py +86 -0
  50. easy_encryption_tool-2.6.0/easy_encryption_tool/structured_command.py +663 -0
  51. easy_encryption_tool-2.6.0/easy_encryption_tool/tool_version.py +129 -0
  52. easy_encryption_tool-2.6.0/easy_encryption_tool/ts_command.py +327 -0
  53. easy_encryption_tool-2.6.0/easy_encryption_tool/validators.py +71 -0
  54. easy_encryption_tool-2.6.0/easy_encryption_tool/zuc_command.py +412 -0
  55. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/PKG-INFO +1553 -0
  56. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/SOURCES.txt +86 -0
  57. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/dependency_links.txt +1 -0
  58. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/entry_points.txt +3 -0
  59. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/not-zip-safe +1 -0
  60. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/requires.txt +24 -0
  61. easy_encryption_tool-2.6.0/easy_encryption_tool.egg-info/top_level.txt +2 -0
  62. easy_encryption_tool-2.6.0/setup.cfg +4 -0
  63. easy_encryption_tool-2.6.0/setup.py +87 -0
  64. easy_encryption_tool-2.6.0/tests/__init__.py +1 -0
  65. easy_encryption_tool-2.6.0/tests/conftest.py +89 -0
  66. easy_encryption_tool-2.6.0/tests/sm4_cbc_demo.py +21 -0
  67. easy_encryption_tool-2.6.0/tests/test_aes_command.py +561 -0
  68. easy_encryption_tool-2.6.0/tests/test_cert_parse.py +107 -0
  69. easy_encryption_tool-2.6.0/tests/test_cipherhub_compatibility.py +687 -0
  70. easy_encryption_tool-2.6.0/tests/test_command_perf.py +30 -0
  71. easy_encryption_tool-2.6.0/tests/test_common.py +397 -0
  72. easy_encryption_tool-2.6.0/tests/test_crypto.py +23 -0
  73. easy_encryption_tool-2.6.0/tests/test_crypto_core.py +559 -0
  74. easy_encryption_tool-2.6.0/tests/test_ecc_command.py +185 -0
  75. easy_encryption_tool-2.6.0/tests/test_hash_command.py +186 -0
  76. easy_encryption_tool-2.6.0/tests/test_hints.py +47 -0
  77. easy_encryption_tool-2.6.0/tests/test_hmac_command.py +261 -0
  78. easy_encryption_tool-2.6.0/tests/test_main.py +74 -0
  79. easy_encryption_tool-2.6.0/tests/test_output_contract.py +110 -0
  80. easy_encryption_tool-2.6.0/tests/test_random_str.py +97 -0
  81. easy_encryption_tool-2.6.0/tests/test_rich_ui.py +54 -0
  82. easy_encryption_tool-2.6.0/tests/test_rsa_command.py +246 -0
  83. easy_encryption_tool-2.6.0/tests/test_sm2_command.py +209 -0
  84. easy_encryption_tool-2.6.0/tests/test_sm4_command.py +301 -0
  85. easy_encryption_tool-2.6.0/tests/test_structured_regressions.py +445 -0
  86. easy_encryption_tool-2.6.0/tests/test_tool_version.py +35 -0
  87. easy_encryption_tool-2.6.0/tests/test_validators.py +108 -0
  88. easy_encryption_tool-2.6.0/tests/test_zuc_command.py +194 -0
@@ -0,0 +1,1553 @@
1
+ Metadata-Version: 2.1
2
+ Name: easy_encryption_tool
3
+ Version: 2.6.0
4
+ Summary: 易加密 CLI 工具,支持 AES/SM4/ZUC/RSA/ECC/SM2 等加解密与签名验签
5
+ Home-page: https://cipherhub.cloud
6
+ Author: bowenerchen
7
+ Author-email: bowener.chen@gmail.com
8
+ License: MIT
9
+ Project-URL: Documentation, https://pypi.org/project/easy-encryption-tool/
10
+ Keywords: encryption cli tool security aes sm4 sm2 sm3 zuc hmac hash ecc rsa gmssl
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Security :: Cryptography
24
+ Requires-Python: >=3.8
25
+ Description-Content-Type: text/markdown
26
+ Requires-Dist: click>=8.0
27
+ Requires-Dist: cryptography>=42.0
28
+ Requires-Dist: pyyaml>=6.0
29
+ Requires-Dist: requests>=2.28
30
+ Requires-Dist: pyopenssl>=24.0
31
+ Requires-Dist: rich>=13.0
32
+ Requires-Dist: rich-click>=1.9.1
33
+ Provides-Extra: gmssl
34
+ Requires-Dist: easy_gmssl>=2.0.1; extra == "gmssl"
35
+ Provides-Extra: kms
36
+ Requires-Dist: boto3>=1.26; extra == "kms"
37
+ Requires-Dist: tencentcloud-sdk-python-kms>=3.0.0; extra == "kms"
38
+ Requires-Dist: alibabacloud-kms20160120>=2.0.0; extra == "kms"
39
+ Requires-Dist: huaweicloudsdkkms>=3.1.0; extra == "kms"
40
+ Requires-Dist: google-cloud-kms>=2.0.0; extra == "kms"
41
+ Requires-Dist: hvac>=2.0.0; extra == "kms"
42
+ Requires-Dist: azure-keyvault-keys>=4.8.0; extra == "kms"
43
+ Requires-Dist: azure-identity>=1.15.0; extra == "kms"
44
+ Provides-Extra: test
45
+ Requires-Dist: pytest>=7.0; extra == "test"
46
+ Requires-Dist: pytest-cov>=4.0; extra == "test"
47
+
48
+ # 易加密(easy_encryption_tool)
49
+
50
+ ## 工具的安装
51
+
52
+ ### 基础安装(仅国际算法)
53
+
54
+ 以下命令安装后即可使用 AES、RSA、ECC、SHA 系列、HMAC(国际哈希)等算法:
55
+
56
+ ```bash
57
+ pip install easy-encryption-tool
58
+ ```
59
+
60
+ ### 国密算法支持(可选)
61
+
62
+ 如需使用 **国密算法**(SM2、SM3、SM4、ZUC),请安装 **easy_gmssl** 库(注意:本工具使用 `easy_gmssl`,非 `gmssl`,二者为不同项目):
63
+
64
+ ```bash
65
+ # 推荐:通过 [gmssl] extra 一次性安装 easy_encryption_tool 及 easy_gmssl
66
+ pip install easy-encryption-tool[gmssl]
67
+
68
+ # 或:单独安装 easy_gmssl(若已安装 easy-encryption-tool)
69
+ pip install easy_gmssl
70
+ ```
71
+
72
+ **依赖国密算法的命令**:`hash -a sm3`、`hmac -a sm3`、`sm2`、`sm4`、`zuc`、`cert-parse -g`。未安装 `easy_gmssl` 时,执行这些命令会提示:`xxx 需要 easy_gmssl 库,请执行: pip install easy_gmssl`。
73
+
74
+ 项目地址:[easy-encryption-tool · PyPI](https://pypi.org/project/easy-encryption-tool/)
75
+
76
+ ---
77
+
78
+ ## 国密算法支持说明
79
+
80
+ | 算法 | 说明 | 对应命令 | 需 easy_gmssl |
81
+ |------|------|----------|---------------|
82
+ | SM2 | 国密非对称算法,对标 RSA | `sm2`(加解密、签名验签) | ✓ |
83
+ | SM3 | 国密哈希算法 | `hash -a sm3` | ✓ |
84
+ | SM4 | 国密对称算法,对标 AES | `sm4`(CBC/GCM 模式) | ✓ |
85
+ | ZUC | 祖冲之流密码 | `zuc` | ✓ |
86
+ | SM2 证书 | 国密证书解析 | `cert-parse -g` | ✓ |
87
+
88
+ 国际算法(AES、RSA、ECC、SHA、HMAC 等)**无需** `easy_gmssl`,仅安装 `easy-encryption-tool` 即可使用。
89
+
90
+ ---
91
+
92
+ ## 工具支持的命令
93
+
94
+ ```python
95
+ ❯ easy_encryption_tool --help
96
+
97
+ Usage: easy_encryption_tool [OPTIONS] COMMAND [ARGS]...
98
+
99
+ Options:
100
+ --help Show this message and exit.
101
+
102
+ Commands:
103
+ aes aes加解密工具,默认支持 aes-cbc-256 和 aes-gcm-256
104
+ cert-parse 解析 pem 或 der 格式的证书,支持国际算法及国密 SM2(-g)
105
+ ecc ecc签名验签和密钥交换验证工具
106
+ hash 哈希摘要工具,支持 SM3、SHA256、SHA384、SHA512
107
+ hmac hmac消息验证码工具,支持 SM3 及国际哈希算法
108
+ random-str 随机字符串生成器
109
+ rsa rsa加解密和签名验签工具
110
+ sm2 国密 SM2 加解密和签名验签工具(多种密文/签名格式)
111
+ sm4 国密 SM4 对称加解密工具,支持 cbc 和 gcm 模式
112
+ version 展示当前版本信息以及运行时信息
113
+ zuc ZUC 祖冲之流密码加解密工具
114
+ install-completion 安装 Shell Tab 自动补全(bash/zsh/fish)
115
+ ```
116
+
117
+ ## Shell Tab 自动补全
118
+
119
+ 支持对子命令、选项及选项值进行 Tab 补全,提升命令行使用效率。安装方式:
120
+
121
+ ```bash
122
+ # 生成补全脚本并加载(zsh 示例)
123
+ easy_encryption_tool install-completion --shell zsh -p ~/.easy_encryption_tool_complete.sh
124
+ source ~/.easy_encryption_tool_complete.sh
125
+ ```
126
+
127
+ 补全能力包括:子命令补全、选项补全、固定可选值补全(如 `-A` encrypt/decrypt、`-m` cbc/gcm)、文件路径补全(如 `-i` 在指定 `-f` 时、`-o`、密钥文件路径等)。详见 [CLI 使用说明](../docs/CLI_USAGE_GUIDE.md#4-install-completion---shell-自动补全)。
128
+
129
+ ## 显示版本
130
+
131
+ ```python
132
+ ❯ easy_encryption_tool version
133
+
134
+ ------ 7906e795524f2b7c begin@2024-04-04_15:02:59.590 ------
135
+ tool-version:v1.0.0
136
+ python:3.11.4 (main, Jul 5 2023, 08:54:11) [Clang 14.0.6 ]
137
+ os:darwin
138
+ chip:macOS-14.3.1-arm64-arm-64bit
139
+ byte-order:little
140
+ ------ 7906e795524f2b7c took 0.007 milli-seconds to execute ------
141
+
142
+ ```
143
+
144
+ ## 生成随机字符串
145
+
146
+ ### 支持的参数
147
+
148
+ ```python
149
+ ❯ easy_encryption_tool random-str --help
150
+ Usage: main.py random-str [OPTIONS]
151
+
152
+ Options:
153
+ -l, --length INTEGER RANGE 最小生成一个字节字符串,最大长度由系统最大整型值决定 [default: 32;
154
+ 1<=x<=9223372036854775807]
155
+ -o, --output-file TEXT 指定输出的文件,文件需要具有可写权限
156
+ --help Show this message and exit.
157
+ ```
158
+
159
+ ### 直接输出到 stdout
160
+
161
+ ```python
162
+ # -l指定随机字符串的长度为32字节
163
+ ❯ easy_encryption_tool random-str -l 32
164
+
165
+ ------ 632aebf88dfe8f93 begin@2024-04-04_15:01:23.987 ------
166
+ qBg@G%Tp((@2h81tg@9II7#0Su4`B06$
167
+ ------ 632aebf88dfe8f93 took 0.049 milli-seconds to execute ------
168
+ ```
169
+
170
+ ### 输出到文件
171
+
172
+ ```python
173
+ ❯ easy_encryption_tool random-str -l 37 -o test_random
174
+
175
+ ------ 71a2d32b0816349f begin@2024-04-04_15:24:22.476 ------
176
+ write to test_random success
177
+ ------ 71a2d32b0816349f took 0.299 milli-seconds to execute ------
178
+
179
+ ❯ cat test_random
180
+ _9@mL1`D2#NZz5m@!X7sdHKqQEowM6%o3E`bj
181
+ ```
182
+
183
+ ### 当指定的文件不可写时
184
+
185
+ ```python
186
+ ❯ easy_encryption_tool random-str -l 37 -o test_random
187
+
188
+ ------ 0e4094ce6a4fe22c begin@2024-04-04_15:25:49.125 ------
189
+ try write to test_random failed
190
+ ------ 0e4094ce6a4fe22c took 0.030 milli-seconds to execute ------
191
+
192
+ ```
193
+
194
+ ## AES对称加密算法
195
+
196
+ ### 支持的命令参数
197
+
198
+ ```python
199
+ ❯ easy_encryption_tool aes --help
200
+ Usage: main.py aes [OPTIONS]
201
+
202
+ Options:
203
+ -m, --mode [cbc|gcm] aes mode,默认为 cbc 模式,可选 cbc 或 gcm 模式
204
+ [default: cbc]
205
+ -k, --key TEXT key 默认 32 字节,即 256 位,只允许输入可见字符,
206
+ 长度不够则自动补齐,长度超出则自动截取 [default:
207
+ kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk]
208
+ -v, --iv-nonce TEXT cbc 模式下,iv 默认 16 字节即 128 位,gcm 模式下 nonce 默认
209
+ 12 字节即 96 位,长度不够则自动补齐,长度超出则自动截取 [default:
210
+ vvvvvvvvvvvvvvvv]
211
+ -r, --random-key-iv 是否自动生成随机的密钥和 iv/nonce,如果随机生成,则密钥长度默认 32
212
+ 字节,iv 默认为 16 字节, nonce 默认为 12 字节
213
+ -a, --action [encrypt|decrypt] 加密(encrypt)或 解密(decrypt),加密后输出 base64 编码的字符串
214
+ [default: encrypt]
215
+ -i, --input-data TEXT 输入数据,即被加密或解密的数据,加密时允许输入:字符串、 base64
216
+ 编码数据、文件路径,解密时允许输入:base64 编码数据、文件路径
217
+ [required]
218
+ -e, --is-base64-encoded 如果 -i/--input-data 的值被 base64 编码过,则需要带上 -e
219
+ 参数,-e 与 -f 互斥 [default: False]
220
+ -f, --is-a-file 如果 -i/--input-data 的值是一个文件,则需要带上 -f
221
+ 参数表示当前需要被处理的是一个文件,-e 与 -f 互斥
222
+ -l, --input-limit INTEGER 输入内容最大长度,单位为 MB,默认为 1MB,在 -i 为非文件时生效
223
+ [default: 1]
224
+ -o, --output-file TEXT 指定输出文件,当输入时指定了文件,则输出时必须指定
225
+ --aad TEXT gcm 模式下的关联认证数据 AAD,默认: "密码学人 CipherHUB 默认 AAD 数据"
226
+ --help Show this message and exit.
227
+ ```
228
+
229
+ ### 关于密钥、IV和模式的预设
230
+
231
+ - 加密模式:仅支持 CBC 模式和 GCM 模式
232
+ - **填充规则**:CBC 模式始终按 PKCS#7 填充;GCM 模式**默认不填充**(与 CipherHUB stream_cipher 兼容),若需填充可加 `--gcm-pad`,加密与解密需一致使用
233
+ - 密钥:默认 32 字节,即 256 位,不足会自动补齐,超过会自动截取
234
+ - IV:CBC 模式下时 IV 长度默认 16 字节,GCM 模式下 Nonce 长度默认 12 字节(其中 4 字节预留作为计数器,由算法自行处理)
235
+
236
+ ### 关于输入数据的预设
237
+
238
+ 加密行为支持三种数据输入方式:
239
+
240
+ - 字符串如:hello,world
241
+ - Base64 编码的字节流如:aGVsbG8sd29ybGQK(生成的 shell 命令:echo "hello,world"|base64)
242
+ - 文件名路径:~/data/test_plain.txt
243
+
244
+ 解密行为支持两种数据输入方式:
245
+
246
+ - Base64 编码的字节流如:/hEP3J5KHZgNnCeBD/W5MQ==
247
+ - 文件名路径:~/data/test_cipher.bin
248
+
249
+ ### 指定密钥和 IV
250
+
251
+ #### 使用默认的密钥
252
+
253
+ ```shell
254
+ # 加密hello,world,密钥和 iv 均为默认数据
255
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i hello,world
256
+
257
+ ------ 15ec713c1b8c0ef3 begin@2024-04-04_15:29:25.203 ------
258
+ plain size:11
259
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
260
+ iv:vvvvvvvvvvvvvvvv
261
+ cipher size:16
262
+ cipher:PcgHm88aPtUjwVx+SDvMqw==
263
+ auth_tag_size:0
264
+ auth_tag:
265
+ ------ 15ec713c1b8c0ef3 took 26.874 milli-seconds to execute ------
266
+
267
+ # 解密hello,world
268
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i PcgHm88aPtUjwVx+SDvMqw== -e
269
+
270
+ ------ fb11b7f46716698e begin@2024-04-04_15:29:40.648 ------
271
+ cipher size:16
272
+ plain size:11
273
+ str plain:hello,world
274
+ ------ fb11b7f46716698e took 13.754 milli-seconds to execute ------
275
+ ```
276
+
277
+ #### 使用随机生成的密钥
278
+
279
+ ```python
280
+ # 加密 -r 表示随机生成密钥和 IV
281
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i hello,world -r
282
+
283
+ ------ d39dbe0c997a868b begin@2024-04-04_15:29:54.358 ------
284
+ plain size:11
285
+ key:Ta9M^p)+L1+_L^26!Xmcs6AR2^3p_5FY
286
+ iv:9*H`JW(dzpi5HBd0
287
+ cipher size:16
288
+ cipher:h7lMpOimKxO0zr7AMVsI9w==
289
+ auth_tag_size:0
290
+ auth_tag:
291
+ ------ d39dbe0c997a868b took 14.258 milli-seconds to execute ------
292
+
293
+ # 解密
294
+ # -k 和 -v 的值使用引号是为了预防里面带有特殊 shell 命令的字符比如‘&’、‘!’等等
295
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i h7lMpOimKxO0zr7AMVsI9w== -e -k 'Ta9M^p)+L1+_L^26!Xmcs6AR2^3p_5FY' -v '9*H`JW(dzpi5HBd0'
296
+
297
+ ------ 1332e834884e2b0e begin@2024-04-04_15:31:06.666 ------
298
+ cipher size:16
299
+ plain size:11
300
+ str plain:hello,world
301
+ ------ 1332e834884e2b0e took 15.691 milli-seconds to execute ------
302
+ ```
303
+
304
+ #### 使用指定的密钥
305
+
306
+ ##### 密钥或 iv 长度不够时会自动填充
307
+
308
+ ```python
309
+ # 加密,此时 key(1234) 和 iv(1234) 长度都不足
310
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i hello,world -k 1234 -v 4321
311
+
312
+ ------ c5abaa3af64a5f6c begin@2024-04-04_15:31:34.231 ------
313
+ plain size:11
314
+ key:1234g6Z0GE$Z@ybb^IIb3FN5Ux%BE=00
315
+ iv:4321nJ4j*Nud(yH4
316
+ cipher size:16
317
+ cipher:dHJKRtSi8KsCe6ZFltF0kA==
318
+ auth_tag_size:0
319
+ auth_tag:
320
+ ------ c5abaa3af64a5f6c took 14.648 milli-seconds to execute ------
321
+
322
+ # 解密
323
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i dHJKRtSi8KsCe6ZFltF0kA== -e -k '1234g6Z0GE$Z@ybb^IIb3FN5Ux%BE=00' -v '4321nJ4j*Nud(yH4'
324
+
325
+ ------ 7c2018bd08e58a63 begin@2024-04-04_15:32:16.014 ------
326
+ cipher size:16
327
+ plain size:11
328
+ str plain:hello,world
329
+ ------ 7c2018bd08e58a63 took 14.343 milli-seconds to execute ------
330
+ ```
331
+
332
+ ##### 密钥或iv超长时会自动截取
333
+
334
+ ```python
335
+ # 加密,此时密钥和 iv 的长度都超长
336
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i hello,world -k 12345678901234567890123456789012abcde -v 1234567890123456abcde
337
+
338
+ ------ 8ff4bd52df0a0865 begin@2024-04-04_15:32:31.104 ------
339
+ plain size:11
340
+ key:12345678901234567890123456789012
341
+ iv:1234567890123456
342
+ cipher size:16
343
+ cipher:wOXlD3Ie7xiQh81aR8N1tQ==
344
+ auth_tag_size:0
345
+ auth_tag:
346
+ ------ 8ff4bd52df0a0865 took 13.849 milli-seconds to execute ------
347
+
348
+ # 解密
349
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i wOXlD3Ie7xiQh81aR8N1tQ== -e -k 12345678901234567890123456789012 -v 1234567890123456
350
+
351
+ ------ 50ea907cc74207ad begin@2024-04-04_15:32:46.937 ------
352
+ cipher size:16
353
+ plain size:11
354
+ str plain:hello,world
355
+ ------ 50ea907cc74207ad took 13.690 milli-seconds to execute ------
356
+ ```
357
+
358
+ ### 指定明文
359
+
360
+ #### 输入字符串作为明文
361
+
362
+ ```python
363
+ # 加密
364
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i hello,world
365
+
366
+ ------ e6dc33dc9ca747d0 begin@2024-04-04_15:33:05.505 ------
367
+ plain size:11
368
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
369
+ iv:vvvvvvvvvvvvvvvv
370
+ cipher size:16
371
+ cipher:PcgHm88aPtUjwVx+SDvMqw==
372
+ auth_tag_size:0
373
+ auth_tag:
374
+ ------ e6dc33dc9ca747d0 took 14.098 milli-seconds to execute ------
375
+ ```
376
+
377
+ #### 输入base64编码的字节流作为明文
378
+
379
+ ```python
380
+ # 加密 -e 表明输入的数据经过了 base64 编码,加密或解密时需要先将数据做 base64 解码
381
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i 9H8InkmnUjgVHC8elQxThUSmzkO0tuGlP0Si4X1kmoK7azOIDoFnt8dXjeWNGb+dc7qiEBPi+jymax4i+24KBQ== -e
382
+
383
+ ------ fc5b00c0a79ff88e begin@2024-04-04_15:33:17.585 ------
384
+ plain size:64
385
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
386
+ iv:vvvvvvvvvvvvvvvv
387
+ cipher size:80
388
+ cipher:ZHq7uJQjkx/2Bm5ZmrcuS/5c/s/qayDVcuWZmvsTle1RAUKyv0dvGhOVYEINmL35eSMVoT3Bx/M6lU9NGCuiM5OxyJ2VcuB30dp8GVZg0oQ=
389
+ auth_tag_size:0
390
+ auth_tag:
391
+ ------ fc5b00c0a79ff88e took 14.382 milli-seconds to execute ------
392
+ ```
393
+
394
+ #### 输入文件作为明文
395
+
396
+ ```python
397
+ # 加密
398
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i ./test_data/test_plain.txt -f -o ./tmp_cipher.bin
399
+
400
+ ------ 1d5fb25a63f1ed4d begin@2024-04-04_15:33:57.461 ------
401
+ input file size:64
402
+ cipher size:80
403
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
404
+ iv:vvvvvvvvvvvvvvvv
405
+ auth_tag_size:0
406
+ auth_tag:
407
+ ------ 1d5fb25a63f1ed4d took 14.859 milli-seconds to execute ------
408
+
409
+ # 查看文件大小,密文文件比明文文件多了16 字节,这是因为明文的最后一个 block 会做 PKCS#7 数据填充
410
+ ❯ cat ./test_data/test_plain.txt
411
+ 123456789012345612345678901234561234567890123456123456789012345
412
+ ❯ ll ./test_data/test_plain.txt
413
+ -rw-r--r-- 1 xxxx staff 64 Apr 2 21:06 ./test_data/test_plain.txt
414
+ ❯ ll ./tmp_cipher.bin
415
+ -rw-r--r-- 1 xxxx staff 80 Apr 4 15:33 ./tmp_cipher.bin
416
+ ```
417
+
418
+ ### 指定密文
419
+
420
+ #### 输入base64编码的字节流作为密文
421
+
422
+ ##### 如果解密出来的明文直接可以以字符串方式打印
423
+
424
+ ```python
425
+ # 明文本身为 hello,world
426
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i PcgHm88aPtUjwVx+SDvMqw== -e
427
+
428
+ ------ 2b6a86223a0ba102 begin@2024-04-04_15:35:26.995 ------
429
+ cipher size:16
430
+ plain size:11
431
+ str plain:hello,world
432
+ ------ 2b6a86223a0ba102 took 13.676 milli-seconds to execute ------
433
+ ```
434
+
435
+ ##### 如果解密出来的密文不能以字符串方式打印
436
+
437
+ ```python
438
+ # 明文本身是字节流
439
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i ZHq7uJQjkx/2Bm5ZmrcuS/5c/s/qayDVcuWZmvsTle1RAUKyv0dvGhOVYEINmL35eSMVoT3Bx/M6lU9NGCuiM5OxyJ2VcuB30dp8GVZg0oQ= -e
440
+
441
+ ------ d399aa241aa6b691 begin@2024-04-04_15:35:39.781 ------
442
+ cipher size:80
443
+ plain size:64
444
+ b64 encoded plain:9H8InkmnUjgVHC8elQxThUSmzkO0tuGlP0Si4X1kmoK7azOIDoFnt8dXjeWNGb+dc7qiEBPi+jymax4i+24KBQ==
445
+ ------ d399aa241aa6b691 took 13.869 milli-seconds to execute ------
446
+ ```
447
+
448
+ #### 输入文件作为密文
449
+
450
+ ```python
451
+ ❯ easy_encryption_tool aes -m cbc -a decrypt -i ./tmp_cipher.bin -f -o ./tmp_plain.txt
452
+
453
+ ------ 1f27fb444d1139b2 begin@2024-04-04_15:36:03.267 ------
454
+ input file size:80
455
+ decrypt ./tmp_cipher.bin success
456
+ write to ./tmp_plain.txt
457
+ plain size:64
458
+ ------ 1f27fb444d1139b2 took 14.259 milli-seconds to execute ------
459
+
460
+ # 文件大小一致、内容一致
461
+ ❯ ll ./tmp_plain.txt ./test_data/test_plain.txt
462
+ -rw-r--r-- 1 xxxx staff 64 Apr 2 21:06 ./test_data/test_plain.txt
463
+ -rw-r--r-- 1 xxxx staff 64 Apr 3 10:58 ./tmp_plain.txt
464
+ ❯ cat tmp_plain.txt ./test_data/test_plain.txt
465
+ 123456789012345612345678901234561234567890123456123456789012345
466
+ 123456789012345612345678901234561234567890123456123456789012345
467
+ ```
468
+
469
+ ### 使用GCM模式
470
+
471
+ **GCM 填充说明**:GCM 模式默认**不对**明文做 PKCS#7 填充,直接加密原始数据,与 CipherHUB stream_cipher 兼容。若需 PKCS#7 填充,请加 `--gcm-pad`,加密与解密必须一致使用。
472
+
473
+ #### 代码层面的预设
474
+
475
+ 代码中,对于加密的明文默认使用固定的上下文数据作为验证数据
476
+
477
+ ```python
478
+ if mode == aes_gcm_mode:
479
+ self.__auth_data = json.dumps({
480
+ 'mode': mode, # 值为 gcm
481
+ 'obj': 'aes_operator',
482
+ }).encode(encoding = 'utf-8')
483
+ if action == aes_encrypt_action:
484
+ self.__aes_gcm_obj = Cipher(algorithms.AES(self.__key), modes.GCM(self.__iv), backend = default_backend())
485
+ self.__aes_gcm_enc_op = self.__aes_gcm_obj.encryptor()
486
+ self.__aes_gcm_enc_op.authenticate_additional_data(self.__auth_data)
487
+ ```
488
+
489
+ #### 对字符串做加解密
490
+
491
+ ```python
492
+ # gcm模式加密
493
+ ❯ easy_encryption_tool aes -m gcm -a encrypt -i hello,world
494
+
495
+ ------ b8e914a4634acde7 begin@2024-04-04_15:36:39.558 ------
496
+ plain size:11
497
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
498
+ iv:vvvvvvvvvvvv
499
+ cipher size:16
500
+ cipher:TajM7IwxIZIoqHkU87dY7w==
501
+ auth_tag_size:16
502
+ auth_tag:df8z3ccRyGOQTluw26dIlA==
503
+ ------ b8e914a4634acde7 took 14.280 milli-seconds to execute ------
504
+ ```
505
+
506
+ #### 对 base64 编码的字节流做加解密
507
+
508
+ ```python
509
+ # 加密
510
+ ❯ easy_encryption_tool aes -m gcm -a encrypt -i 9H8InkmnUjgVHC8elQxThUSmzkO0tuGlP0Si4X1kmoK7azOIDoFnt8dXjeWNGb+dc7qiEBPi+jymax4i+24KBQ== -e
511
+
512
+ ------ 7781b5bffdcef12b begin@2024-04-04_15:37:05.562 ------
513
+ plain size:64
514
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
515
+ iv:vvvvvvvvvvvv
516
+ cipher size:80
517
+ cipher:0bKoHqq6BMVP2DIPY74Ob2tGi69gVzHSZREJT3DAeCsVU52ykLcfKZIq/GD2PEkCwLLE8o37nvPK9t/pr4LStVy5unAN/EVllIvvopq2pis=
518
+ auth_tag_size:16
519
+ auth_tag:B1Jp0FuxyNXAOVAvj9S+Ow==
520
+ ------ 7781b5bffdcef12b took 13.915 milli-seconds to execute ------
521
+
522
+
523
+ # 解密
524
+ ❯ easy_encryption_tool aes -m gcm -a decrypt -i 0bKoHqq6BMVP2DIPY74Ob2tGi69gVzHSZREJT3DAeCsVU52ykLcfKZIq/GD2PEkCwLLE8o37nvPK9t/pr4LStVy5unAN/EVllIvvopq2pis= -e -t B1Jp0FuxyNXAOVAvj9S+Ow==
525
+
526
+ ------ 5bcc82c4235dcde4 begin@2024-04-04_15:37:17.397 ------
527
+ cipher size:80
528
+ plain size:64
529
+ b64 encoded plain:9H8InkmnUjgVHC8elQxThUSmzkO0tuGlP0Si4X1kmoK7azOIDoFnt8dXjeWNGb+dc7qiEBPi+jymax4i+24KBQ==
530
+ ------ 5bcc82c4235dcde4 took 13.844 milli-seconds to execute ------
531
+ ```
532
+
533
+ #### 对文件做加解密
534
+
535
+ ```python
536
+ # 加密
537
+ ❯ easy_encryption_tool aes -m gcm -a encrypt -i ./test_data/test_plain.txt -f -o ./tmp_gcm_cipher.bin
538
+
539
+ ------ 0c4605fe37eb7e4b begin@2024-04-04_15:37:45.621 ------
540
+ input file size:64
541
+ cipher size:80
542
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
543
+ iv:vvvvvvvvvvvv
544
+ auth_tag_size:16
545
+ auth_tag:krJchuyaDRYHnu5tsy8UzA==
546
+ ------ 0c4605fe37eb7e4b took 14.347 milli-seconds to execute ------
547
+
548
+ # 解密
549
+ ❯ easy_encryption_tool aes -m gcm -a decrypt -i ./tmp_gcm_cipher.bin -f -o tmp_gcm_plain.txt -t krJchuyaDRYHnu5tsy8UzA==
550
+
551
+ ------ d181cab086ebaeaa begin@2024-04-04_15:38:00.709 ------
552
+ input file size:80
553
+ decrypt ./tmp_gcm_cipher.bin success
554
+ write to tmp_gcm_plain.txt
555
+ plain size:64
556
+ ------ d181cab086ebaeaa took 14.397 milli-seconds to execute ------
557
+ ```
558
+
559
+ #### tag值对解密很重要
560
+
561
+ ```python
562
+ # gcm模式正常解密
563
+ ❯ easy_encryption_tool aes -m gcm -a decrypt -i TajM7IwxIZIoqHkU87dY7w== -e -t df8z3ccRyGOQTluw26dIlA==
564
+
565
+ ------ 86699527d1227e39 begin@2024-04-04_15:38:22.322 ------
566
+ cipher size:16
567
+ plain size:11
568
+ str plain:hello,world
569
+ ------ 86699527d1227e39 took 13.987 milli-seconds to execute ------
570
+
571
+ # 不传 gcm tag 会报错
572
+ ❯ easy_encryption_tool aes -m gcm -a decrypt -i TajM7IwxIZIoqHkU87dY7w== -e
573
+
574
+ ------ 11c1531f0fd5b7a8 begin@2024-04-04_15:38:32.957 ------
575
+ expected a gcm tag(16 Bytes)
576
+ ------ 11c1531f0fd5b7a8 took 0.030 milli-seconds to execute ------
577
+
578
+ # 传错误的 tag 会解密失败
579
+ ❯ easy_encryption_tool aes -m gcm -a decrypt -i TajM7IwxIZIoqHkU87dY7w== -e -t H7n7OzKgQyHL86zbnQ0r+g==
580
+
581
+ ------ 90580b5c3649a1ba begin@2024-04-04_15:38:46.823 ------
582
+ decrypt TajM7IwxIZIoqHkU87dY7w== failed:
583
+ ------ 90580b5c3649a1ba took 14.030 milli-seconds to execute ------
584
+
585
+ ```
586
+
587
+ ### 常用的参数合法性检查
588
+
589
+ #### -m 模式参数
590
+
591
+ ```python
592
+ easy_encryption_tool aes -m abc -a encrypt -i 1234
593
+ Usage: main.py aes [OPTIONS]
594
+ Try 'main.py aes --help' for help.
595
+
596
+ Error: Invalid value for '-m' / '--mode': 'abc' is not one of 'cbc', 'gcm'.
597
+ ```
598
+
599
+ #### -a 动作参数
600
+
601
+ ```python
602
+ easy_encryption_tool aes -m cbc -a abc -i 1234
603
+ Usage: main.py aes [OPTIONS]
604
+ Try 'main.py aes --help' for help.
605
+
606
+ Error: Invalid value for '-a' / '--action': 'abc' is not one of 'encrypt', 'decrypt'.
607
+ ```
608
+
609
+ #### -i 输入参数
610
+
611
+ ##### 字符串超限
612
+
613
+ ```python
614
+ # 这里设置最大限制为0MBytes,也就是不允许加密,这里是故意预留的
615
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i 1234 -l 0
616
+
617
+ ------ 5ce766f36cc28968 begin@2024-04-04_15:39:42.675 ------
618
+ the data exceeds the maximum bytes limit, limited to:0Bytes, now:4Bytes
619
+ ------ 5ce766f36cc28968 took 0.023 milli-seconds to execute ------
620
+ ```
621
+
622
+ ##### 非法的base64编码数据
623
+
624
+ ```python
625
+ # 任意构造的字符串
626
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i qwert -e
627
+
628
+ ------ 4844fa0e0939482d begin@2024-04-04_15:39:53.597 ------
629
+ invalid b64 encoded data:qwert
630
+ ------ 4844fa0e0939482d took 0.044 milli-seconds to execute ------
631
+
632
+ # base64数据缺少字符(正确的是:ZUD3MJT3ohiimrryNW7jBw==)
633
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i ZUD3MJT3ohiimrryNW7jBw -e
634
+
635
+ ------ 22301b388db43f9d begin@2024-04-04_15:40:05.092 ------
636
+ invalid b64 encoded data:ZUD3MJT3ohiimrryNW7jBw
637
+ ------ 22301b388db43f9d took 0.036 milli-seconds to execute ------
638
+ ```
639
+
640
+ ##### 文件不可读
641
+
642
+ ```python
643
+ # 创建文件并设置为只可root读
644
+ sudo touch test_plain
645
+ sudo chmod 400 test_plain
646
+ # 查看文件
647
+ ll test_plain
648
+ -r-------- 1 root staff 0 Apr 3 11:29 test_plain
649
+
650
+ # 使用其他用户运行命令访问
651
+ easy_encryption_tool aes -m cbc -a encrypt -i test_plain -f
652
+ test_plain may not exist or may be unreadable
653
+ ------ aes_command took 0.076 milli-seconds to execute ------
654
+ ```
655
+
656
+ ##### 文件不可写
657
+
658
+ ```python
659
+ # 文件写权限检查失败
660
+ easy_encryption_tool aes -m cbc -a encrypt -i tmp_gcm_plain.txt -f -o test_plain
661
+
662
+ tmp_gcm_plain.txt opened in mode rb success
663
+ test_plain may not exist or may not writable
664
+ tmp_gcm_plain.txt closed success
665
+ ------ aes_command took 0.126 milli-seconds to execute ------
666
+ ```
667
+
668
+ ##### -e 与 -f 参数互斥
669
+
670
+ ```python
671
+ ❯ easy_encryption_tool aes -m cbc -a encrypt -i test_plain -f -e
672
+
673
+ ------ 75998f7a4a1364f6 begin@2024-04-04_15:40:30.038 ------
674
+ the input data cannot be used as both a file and base64 encoded data
675
+ ------ 75998f7a4a1364f6 took 0.026 milli-seconds to execute ------
676
+ ```
677
+
678
+ ##### 对文件加密或解密时,必须指定输出的文件名
679
+
680
+ ```python
681
+ # 加密不指定输出文件
682
+ ❯ easy_encryption_tool aes -m gcm -a encrypt -i ./test_data/test_plain.txt -f
683
+
684
+ ------ 3564874090cf12d5 begin@2024-04-04_15:40:55.522 ------
685
+ need a output file specified and writable
686
+ ------ 3564874090cf12d5 took 0.074 milli-seconds to execute ------
687
+
688
+ # 解密不指定输出文件
689
+ ❯ easy_encryption_tool aes -m gcm -a decrypt -i ./test_data/test_plain.txt -f -t df8z3ccRyGOQTluw26dIlA==
690
+
691
+ ------ c3dee26a5649a077 begin@2024-04-04_15:41:07.541 ------
692
+ need a output file specified and writable
693
+ ------ c3dee26a5649a077 took 0.084 milli-seconds to execute ------
694
+ ```
695
+
696
+
697
+
698
+ ## HMAC验证码
699
+
700
+ ### 支持的命令参数
701
+
702
+ ```python
703
+ ❯ easy_encryption_tool hmac --help
704
+ Usage: main.py hmac [OPTIONS]
705
+
706
+ Options:
707
+ -i, --input-data TEXT 输入数据,允许输入:字符串、 base64 编码数据、文件路径 [required]
708
+ -e, --is-base64-encoded 如果 -i/--input-data 的值被 base64 编码过,则需要带上 -e
709
+ 参数,-e 与 -f 互斥 [default: False]
710
+ -f, --is-a-file 如果 -i/--input-data 的值是一个文件,则需要带上 -f
711
+ 参数表示当前需要被处理的是一个文件,-e 与 -f 互斥
712
+ -h, --hash-alg [sha224|sha256|sha384|sha512|sha3_224|sha3_256|sha3_384|sha3_512]
713
+ 哈希算法 [default: sha256]
714
+ -k, --key TEXT key 默认值为 32 字节,即 256 位,只允许输入可见字符 [default:
715
+ kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk]
716
+ -r, --random-key 是否自动生成随机的密钥,如果自动生成随机密钥则默认 32 字节长度
717
+ --help Show this message and exit.
718
+ ```
719
+
720
+ ### 关于输入数据和密钥的预设
721
+
722
+ - 输入数据支持三种方式:字符串明文、base64 编码的字节流、文件
723
+ - 密钥默认 32 字节,支持生成随机密钥(长度强制为 32 字节)
724
+
725
+ ### 指定密钥
726
+
727
+ #### 使用默认密钥
728
+
729
+ ```python
730
+ ❯ easy_encryption_tool hmac -i hello,world
731
+
732
+ ------ 1daa56484b0a4733 begin@2024-04-04_15:41:52.566 ------
733
+ data size:11Bytes
734
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
735
+ hmac:dcd5f3d53661434856c4fb1f76072a22c5fb2526bfd8713aa5041cc43aab7675
736
+ ------ 1daa56484b0a4733 took 0.029 milli-seconds to execute ------
737
+ ```
738
+
739
+ #### 自己指定密钥
740
+
741
+ ```python
742
+ ❯ easy_encryption_tool hmac -i hello,world -k 1234
743
+
744
+ ------ 990d2a043f6fb90a begin@2024-04-04_15:42:03.420 ------
745
+ data size:11Bytes
746
+ key:1234
747
+ hmac:96dd6f73018a6d1911d77a906bc41a6aaae760331eb367ca7134a6b85dbbfdcb
748
+ ------ 990d2a043f6fb90a took 0.025 milli-seconds to execute ------
749
+ ```
750
+
751
+ #### 生成随机密钥
752
+
753
+ ```python
754
+ ❯ easy_encryption_tool hmac -i hello,world -r
755
+
756
+ ------ 8acd4791042aae7c begin@2024-04-04_15:42:14.518 ------
757
+ data size:11Bytes
758
+ key:6+98I^y4IsiGGj0p!(1^O+iuoH%CO!s5
759
+ hmac:f8f9931c074fd30c9fe60c31beb87600bfd3b51960e91f34d765d339aa9981f8
760
+ ------ 8acd4791042aae7c took 0.057 milli-seconds to execute ------
761
+ ```
762
+
763
+ ### 指定输入
764
+
765
+ #### 输入字符串
766
+
767
+ ```python
768
+ ❯ easy_encryption_tool hmac -i hello,world
769
+
770
+ ------ 7ad6f172e3498e2a begin@2024-04-04_15:42:33.801 ------
771
+ data size:11Bytes
772
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
773
+ hmac:dcd5f3d53661434856c4fb1f76072a22c5fb2526bfd8713aa5041cc43aab7675
774
+ ------ 7ad6f172e3498e2a took 0.028 milli-seconds to execute ------
775
+ ```
776
+
777
+ #### 输入 base64 编码的字节流
778
+
779
+ ```python
780
+ ❯ easy_encryption_tool hmac -i krJchuyaDRYHnu5tsy8UzA== -e
781
+
782
+ ------ 7f8694414df48f4e begin@2024-04-04_15:42:46.859 ------
783
+ data size:16Bytes
784
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
785
+ hmac:276e565d1e8a65b38463e124c45c60b00e01a8a623995aae360d1035e0d58923
786
+ ------ 7f8694414df48f4e took 0.035 milli-seconds to execute ------
787
+ ```
788
+
789
+ #### 输入文件
790
+
791
+ ```python
792
+ ❯ easy_encryption_tool hmac -i ./test_data/test_plain.txt -f
793
+
794
+ ------ d9f4d5072cc8d6ee begin@2024-04-04_15:42:57.326 ------
795
+ file size:64Bytes
796
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
797
+ hmac:5b0ea206c45019e090246cea031ca3a267bab15d39bd53491272473aef75d8b0
798
+ ------ d9f4d5072cc8d6ee took 0.102 milli-seconds to execute ------
799
+
800
+ ```
801
+
802
+ ### 指定哈希算法
803
+
804
+ ```python
805
+ # 支持的 hash 列表:
806
+ # [sha224 | sha256 | sha384 | sha512 | sha3_224 | sha3_256 | sha3_384 | sha3_512]
807
+
808
+ # 使用 sha512
809
+ ❯ easy_encryption_tool hmac -i ./test_data/test_plain.txt -f -h sha512
810
+
811
+ ------ 440b99b2f7479972 begin@2024-04-04_15:43:10.055 ------
812
+ file size:64Bytes
813
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
814
+ hmac:3c41a94f15c6517e5774d0878268e33c12d9170136c8d9c972f9294324aca61ee2bc4e0f1c7b4a59525ba40f3ccf7b94ebb1de74881ae85023a187e8c1626e1b
815
+ ------ 440b99b2f7479972 took 0.107 milli-seconds to execute ------
816
+
817
+ # 使用sha3_256
818
+ ❯ easy_encryption_tool hmac -i ./test_data/test_plain.txt -f -h sha3_256
819
+
820
+ ------ c48755f9b49e99b3 begin@2024-04-04_15:43:23.256 ------
821
+ file size:64Bytes
822
+ key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
823
+ hmac:25494b6effa8df3ad1bff777892e08ceccf3fbaa181608d006400b8da3fef853
824
+ ------ c48755f9b49e99b3 took 0.087 milli-seconds to execute ------
825
+ ```
826
+
827
+ ## RSA非对称密钥
828
+
829
+ ### 支持的命令
830
+
831
+ ```python
832
+ ❯ easy_encryption_tool rsa --help
833
+ Usage: main.py rsa [OPTIONS] COMMAND [ARGS]...
834
+
835
+ Options:
836
+ --help Show this message and exit.
837
+
838
+ Commands:
839
+ decrypt
840
+ encrypt
841
+ generate
842
+ sign
843
+ verify
844
+ ```
845
+
846
+ ### 生成密钥对
847
+
848
+ #### 支持的参数
849
+
850
+ ```python
851
+ ❯ easy_encryption_tool rsa generate --help
852
+ Usage: main.py rsa generate [OPTIONS]
853
+
854
+ Options:
855
+ -s, --size [2048|3072|4096] 密钥位数 [default: 2048]
856
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
857
+ -f, --file-name TEXT 输出密钥对的文件名前缀,最终写入数据时会创建文件并加上文件名后缀 [default:
858
+ demo; required]
859
+ -p, --password TEXT 私钥密码,使用私钥时需要输入正确的密码
860
+ -r, --random-password 是否生成私钥的随机密码,如果带上 -r 标识,则随机生成32字节的密码
861
+ --help Show this message and exit.
862
+ ```
863
+
864
+ #### 默认生成
865
+
866
+ ``` python
867
+ # 密钥长度2048位,私钥不带密码
868
+ ❯ easy_encryption_tool rsa generate -f test
869
+
870
+ ------ 6b89fd023be2d70e begin@2024-04-04_15:48:44.313 ------
871
+ generate test_rsa_public.pem/test_rsa_private.pem success
872
+ ------ 6b89fd023be2d70e took 134.487 milli-seconds to execute ------
873
+ ```
874
+
875
+ #### 指定长度且指定密码
876
+
877
+ ```python
878
+ # pem格式密钥,私钥不带密码
879
+ ❯ easy_encryption_tool rsa generate -f test_no_pwd_pem -s 4096 -e pem
880
+
881
+ ------ 7d68ecefd4536a1c begin@2024-04-04_15:50:00.393 ------
882
+ generate test_no_pwd_pem_rsa_public.pem/test_no_pwd_pem_rsa_private.pem success
883
+ ------ 7d68ecefd4536a1c took 560.056 milli-seconds to execute ------
884
+
885
+ # pem格式密钥,私钥带密码
886
+ ❯ easy_encryption_tool rsa generate -f test_pwd_pem -s 4096 -e pem -p 1234567890
887
+
888
+ ------ f036eed08d4188e6 begin@2024-04-04_15:51:20.417 ------
889
+ private key password:1234567890
890
+ generate test_pwd_pem_rsa_public.pem/test_pwd_pem_rsa_private_cipher.pem success
891
+ ------ f036eed08d4188e6 took 341.474 milli-seconds to execute ------
892
+
893
+ # der格式密钥,私钥不带密码
894
+ ❯ easy_encryption_tool rsa generate -f test_no_pwd_der -s 4096 -e der
895
+
896
+ ------ e152e62cc8ff4080 begin@2024-04-04_15:51:53.004 ------
897
+ generate test_no_pwd_der_rsa_public.der/test_no_pwd_der_rsa_private.der success
898
+ ------ e152e62cc8ff4080 took 620.032 milli-seconds to execute ------
899
+
900
+ # der格式密钥,私钥带密码
901
+ ❯ easy_encryption_tool rsa generate -f test_pwd_der -s 4096 -e der -p 1234567890
902
+
903
+ ------ 9b08b9054b7642cd begin@2024-04-04_15:52:04.209 ------
904
+ private key password:1234567890
905
+ generate test_pwd_der_rsa_public.der/test_pwd_der_rsa_private_cipher.der success
906
+ ------ 9b08b9054b7642cd took 1108.390 milli-seconds to execute ------
907
+
908
+ ```
909
+
910
+ #### 指定长度且随机生成密码
911
+
912
+ ```python
913
+ ❯ easy_encryption_tool rsa generate -f test -s 4096 -r
914
+
915
+ ------ e3eba04fda53c701 begin@2024-04-04_15:53:14.570 ------
916
+ private key password:4)H(iipM9=qnUV!!16LZ3)n&YGQE@v04
917
+ generate test_rsa_public.pem/test_rsa_private_cipher.pem success
918
+ ------ e3eba04fda53c701 took 300.131 milli-seconds to execute ------
919
+ ```
920
+
921
+ ### 加密与解密
922
+
923
+ #### 支持的参数
924
+
925
+ ```python
926
+ # 加密
927
+ ❯ easy_encryption_tool rsa encrypt --help
928
+ Usage: main.py rsa encrypt [OPTIONS]
929
+
930
+ Options:
931
+ -f, --public-key TEXT 公钥文件路径 [required]
932
+ -i, --input-data TEXT 输入数据,可以直接为字符串,也可以为
933
+ base64编码的数据,base64编码的数据需要带上标识 -c [required]
934
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
935
+ -c, --b64-encoded 输入数据是否被 base64 编码过
936
+ -l, --input-limit INTEGER 输入内容最大长度,单位为 MB,默认为 1MB,非对称不适合直接加密过长的数据
937
+ [default: 1]
938
+ -m, --mode [oaep|pkcs1v15] 加密时的填充模式 [default: oaep; required]
939
+ -h, --hash-mode [sha256|sha384|sha512]
940
+ 此参数仅在-m为 oaep 时生效 [default: sha256]
941
+ --help Show this message and exit.
942
+
943
+ # 解密
944
+ ❯ easy_encryption_tool rsa decrypt --help
945
+ Usage: main.py rsa decrypt [OPTIONS]
946
+
947
+ Options:
948
+ -f, --private-key TEXT 私钥文件路径 [required]
949
+ -i, --input-data TEXT 输入的密文数据, 必须为base64编码的数据 [required]
950
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
951
+ -m, --mode [oaep|pkcs1v15] 加密时的填充模式 [default: oaep; required]
952
+ -h, --hash-mode [sha256|sha384|sha512]
953
+ 此参数仅在-m为 oaep 时生效 [default: sha256]
954
+ -p, --password TEXT 私钥密码,使用私钥时需要输入正确的密码
955
+ --help Show this message and exit.
956
+
957
+ ```
958
+
959
+ #### 使用 PEM 密钥加解密
960
+
961
+ ##### 私钥不需要密码
962
+
963
+ ```python
964
+ # 加密
965
+ ❯ easy_encryption_tool rsa encrypt -e pem -f ./test_data/test_no_pwd_pem_public.pem -i hello,world
966
+
967
+ ------ 18869a5ba5f11a4f begin@2024-04-04_15:55:10.501 ------
968
+ pub key size:4096
969
+ padding mode:oaep-sha256
970
+ cipher:pQlqgAyKEdrjcdRPe90uWHIJv781VD1X0+wrVyzmf6GE1hMdEwcukflGsgkysN3jbR2btNAEfYwxmvk+b1Om/AUdtGrZNAMuCygY3Y2U6ikVRcOCdd0ZCz3Gp7NTEblifVxMR/UsK2VQ+/4Tysmslv2QFOV7Mz+uE6j/o+hTBYhR42r+tkKsAEQGB8LLfo5GC+Wjk5mU1Yt3d8bz3/55S7Wv3DhAlrD9AuiEhqv4E8JL0MgSIN26rzHnOOlkP5vRlH5lLITzier7W9inoQxpYpKdk3xa7gsRXKXVBNcaNdCn9AH/SkrfEe+bHpZcAWG7It2OyTlaAzSwmia+wYx3CgyVtzMHNU9jQrz8xnMcP1ZntxVNvoVnhn9li0H8XTCAy3p+YfYGybEqiSNeFL7cEsONO8x8y0bkqNQE9KFTba0yZNsME1JfJmQVG9IrLaIn1RAsGmPeVYCuHmwcZQCxFUc14von867Z4HewLNqnN5EzalTnVzIY4whZcwMnmp53tZKeNhh0QemuoEqWmkf4cwJHGR/KZJKi+dhB5vo0+LffXf4LzsJRAwbE9ylwEPEsjFx1BYw7jbVIb7hgZ0AZB0J2OMdov25xMWk2nYBmR6L/QFBCtw/J8t7198ZuHmHI247gl8zJ3tFEAPFw1eFOQOkIAKnSDVfnPBlTZQ8smtM=
971
+ ------ 18869a5ba5f11a4f took 15.731 milli-seconds to execute ------
972
+
973
+ # 解密
974
+ ❯ easy_encryption_tool rsa decrypt -e pem -f ./test_data/test_no_pwd_pem_private.pem -i pQlqgAyKEdrjcdRPe90uWHIJv781VD1X0+wrVyzmf6GE1hMdEwcukflGsgkysN3jbR2btNAEfYwxmvk+b1Om/AUdtGrZNAMuCygY3Y2U6ikVRcOCdd0ZCz3Gp7NTEblifVxMR/UsK2VQ+/4Tysmslv2QFOV7Mz+uE6j/o+hTBYhR42r+tkKsAEQGB8LLfo5GC+Wjk5mU1Yt3d8bz3/55S7Wv3DhAlrD9AuiEhqv4E8JL0MgSIN26rzHnOOlkP5vRlH5lLITzier7W9inoQxpYpKdk3xa7gsRXKXVBNcaNdCn9AH/SkrfEe+bHpZcAWG7It2OyTlaAzSwmia+wYx3CgyVtzMHNU9jQrz8xnMcP1ZntxVNvoVnhn9li0H8XTCAy3p+YfYGybEqiSNeFL7cEsONO8x8y0bkqNQE9KFTba0yZNsME1JfJmQVG9IrLaIn1RAsGmPeVYCuHmwcZQCxFUc14von867Z4HewLNqnN5EzalTnVzIY4whZcwMnmp53tZKeNhh0QemuoEqWmkf4cwJHGR/KZJKi+dhB5vo0+LffXf4LzsJRAwbE9ylwEPEsjFx1BYw7jbVIb7hgZ0AZB0J2OMdov25xMWk2nYBmR6L/QFBCtw/J8t7198ZuHmHI247gl8zJ3tFEAPFw1eFOQOkIAKnSDVfnPBlTZQ8smtM=
975
+
976
+ ------ 197c89cd0b631ce0 begin@2024-04-04_15:55:40.536 ------
977
+ private key password:
978
+ key size:4096
979
+ padding mode:oaep-sha256
980
+ origin plain:hello,world
981
+ ------ 197c89cd0b631ce0 took 338.602 milli-seconds to execute ------
982
+ ```
983
+
984
+ ##### 私钥需要密码
985
+
986
+ ```python
987
+ # 加密
988
+ ❯ easy_encryption_tool rsa encrypt -e pem -f ./test_data/test_pwd_pem_public.pem -i hello,world
989
+
990
+ ------ e1cde686b573fb50 begin@2024-04-04_15:56:04.554 ------
991
+ pub key size:4096
992
+ padding mode:oaep-sha256
993
+ cipher:pF06oJgMvzJ8WUphoYqaccLhClQjeSiSQXbQpORXtzkAFKeSqAQwGCKLQlDeJft6bc4wxUe1hS5IM/21hOpx1HZKZyXurfeqHkOXx4ekiakqS+8MgW6x4vozQfTKUZHoDStA8chwibtWlDCAGESYj1drr1UA8cNc5I+ij+hM3voFA3zh8o6JaKLKmxvNedRk5ugJQE6lL3RHMAya5oQS5AYQTtfuLQl52G0loQIPoWWB8KgZD6iZ///I2MI8B4kEHS1O2eg897DNyHGRdf8nRjTJdecWFR7wXY0VQeV8lR2BEsPb7L15qg4lZvonpew9qII6gW5J39yLK73vbAAkpdAmpOGxvOVtztE0Tn4UFkIkOZDkH8nlj1JwhCJ5K9R+TwlkoUinFMasOUZFEvNHzbha69mVErxBQHwv6N6P4kTLOBFVDrqF1Y00ZAQ0ZjIr/s7OdJAyoHlzZkroSfkbvV2eOho3nJD8aoIYdfa1kwttJ7p027VSVMflO1jULRZ0EkT2ncgzOMjqm4fB8Se42/QGjGtKYKOOPp4uBbFuxi8ra4LWY0l0h+FYJ6wXeIcODMLuxHWK4drfJrj5IpaTYNuysmeDEDfMQZQV1WYmyfFsJtIqXFiKrQatgFtGsfYXPCNBTrXa4HVW/Ohm7vE1PKGh+e2K7VpSZ6F4nW+YmQc=
994
+ ------ e1cde686b573fb50 took 15.492 milli-seconds to execute ------
995
+
996
+ # 解密 -p 指定密码
997
+ ❯ easy_encryption_tool rsa decrypt -e pem -f ./test_data/test_pwd_pem_private_cipher.pem -i pF06oJgMvzJ8WUphoYqaccLhClQjeSiSQXbQpORXtzkAFKeSqAQwGCKLQlDeJft6bc4wxUe1hS5IM/21hOpx1HZKZyXurfeqHkOXx4ekiakqS+8MgW6x4vozQfTKUZHoDStA8chwibtWlDCAGESYj1drr1UA8cNc5I+ij+hM3voFA3zh8o6JaKLKmxvNedRk5ugJQE6lL3RHMAya5oQS5AYQTtfuLQl52G0loQIPoWWB8KgZD6iZ///I2MI8B4kEHS1O2eg897DNyHGRdf8nRjTJdecWFR7wXY0VQeV8lR2BEsPb7L15qg4lZvonpew9qII6gW5J39yLK73vbAAkpdAmpOGxvOVtztE0Tn4UFkIkOZDkH8nlj1JwhCJ5K9R+TwlkoUinFMasOUZFEvNHzbha69mVErxBQHwv6N6P4kTLOBFVDrqF1Y00ZAQ0ZjIr/s7OdJAyoHlzZkroSfkbvV2eOho3nJD8aoIYdfa1kwttJ7p027VSVMflO1jULRZ0EkT2ncgzOMjqm4fB8Se42/QGjGtKYKOOPp4uBbFuxi8ra4LWY0l0h+FYJ6wXeIcODMLuxHWK4drfJrj5IpaTYNuysmeDEDfMQZQV1WYmyfFsJtIqXFiKrQatgFtGsfYXPCNBTrXa4HVW/Ohm7vE1PKGh+e2K7VpSZ6F4nW+YmQc= -p 1234567890
998
+
999
+ ------ cb0ebbe7b572b665 begin@2024-04-04_15:56:25.496 ------
1000
+ private key password:1234567890
1001
+ key size:4096
1002
+ padding mode:oaep-sha256
1003
+ origin plain:hello,world
1004
+ ------ cb0ebbe7b572b665 took 338.788 milli-seconds to execute ------
1005
+ ```
1006
+
1007
+ #### 使用 DER 密钥加解密
1008
+
1009
+ ##### 私钥不需要密码
1010
+
1011
+ ```python
1012
+ # 加密
1013
+ ❯ easy_encryption_tool rsa encrypt -e der -f ./test_data/test_no_pwd_der_public.der -i hello,world
1014
+
1015
+ ------ 10e4568e22050ecc begin@2024-04-04_15:56:47.705 ------
1016
+ pub key size:4096
1017
+ padding mode:oaep-sha256
1018
+ cipher:V0g9TwUetAKZOl6xwe9SL7ra1P3K2JGwTZ2NMKdZiP4zNaPxxjPPv8Me3g9qMWLNBcfU6dd+7Ia7xGb0c5Ou1/uf7D3xSoV6hU0PV/0i8feJYATgkWFO1NOt1TpIHlcYHtA9NdHEaNXR9qbY8pHyAokVRf83hyQIZMTPgpGo2GH0lJkFAOjxWOiGyPKF7GgdHjz+8rfu4R9VBUg0Wy0O1zyvTKA+b4iE6MS4zJBbzPe0H43w9OLp+TQFykrhLWXsFX+AEhdhxa7N0ebaorlQNtPnY8KuXFx0cqIzWigBcfWNTYgcjbFGLm+mo0Btin0UqDFhbC8EwdpVGnVr6ZBLCvEmyqDAuJN5UCEBQ7Jrakgot/qZ4QHPL5HdU+tNXb8KULH75fyu0A11zzHjpw2E2KRKmg1Fg9aExaim4r15T2VU1eYjZKaPV/YiYMPlqZM9udUQFTmrLRIhCUUp+fc+MJu3zR6chz6d0eSx/RdV8ik8ilKILZl7dAfRS3hC5QG0pPh54Z+MqgAZbHfTxCbjnxqoPJzMOcC+JOPEpjC2PhS6MYE70+Ub8RS1cGZmZ2z32UnanqfT9kLbR626CWUzPzZWsnMheoX5bAABDfp7AkC9BXv+ca3REAyvR8HchVkVMiIRC4dTlY4p4+uFVtOnkhUG5mzSOVGebAWOJ+ftTFY=
1019
+ ------ 10e4568e22050ecc took 14.792 milli-seconds to execute ------
1020
+
1021
+
1022
+ # 解密
1023
+ ❯ easy_encryption_tool rsa decrypt -e der -f ./test_data/test_no_pwd_der_private.der -i V0g9TwUetAKZOl6xwe9SL7ra1P3K2JGwTZ2NMKdZiP4zNaPxxjPPv8Me3g9qMWLNBcfU6dd+7Ia7xGb0c5Ou1/uf7D3xSoV6hU0PV/0i8feJYATgkWFO1NOt1TpIHlcYHtA9NdHEaNXR9qbY8pHyAokVRf83hyQIZMTPgpGo2GH0lJkFAOjxWOiGyPKF7GgdHjz+8rfu4R9VBUg0Wy0O1zyvTKA+b4iE6MS4zJBbzPe0H43w9OLp+TQFykrhLWXsFX+AEhdhxa7N0ebaorlQNtPnY8KuXFx0cqIzWigBcfWNTYgcjbFGLm+mo0Btin0UqDFhbC8EwdpVGnVr6ZBLCvEmyqDAuJN5UCEBQ7Jrakgot/qZ4QHPL5HdU+tNXb8KULH75fyu0A11zzHjpw2E2KRKmg1Fg9aExaim4r15T2VU1eYjZKaPV/YiYMPlqZM9udUQFTmrLRIhCUUp+fc+MJu3zR6chz6d0eSx/RdV8ik8ilKILZl7dAfRS3hC5QG0pPh54Z+MqgAZbHfTxCbjnxqoPJzMOcC+JOPEpjC2PhS6MYE70+Ub8RS1cGZmZ2z32UnanqfT9kLbR626CWUzPzZWsnMheoX5bAABDfp7AkC9BXv+ca3REAyvR8HchVkVMiIRC4dTlY4p4+uFVtOnkhUG5mzSOVGebAWOJ+ftTFY=
1024
+
1025
+ ------ ff1efcc52f4fc05e begin@2024-04-04_15:57:10.634 ------
1026
+ private key password:
1027
+ key size:4096
1028
+ padding mode:oaep-sha256
1029
+ origin plain:hello,world
1030
+ ------ ff1efcc52f4fc05e took 348.368 milli-seconds to execute ------
1031
+ ```
1032
+
1033
+ ##### 私钥需要密码
1034
+
1035
+ ```python
1036
+ # 加密
1037
+ ❯ easy_encryption_tool rsa encrypt -e der -f ./test_data/test_pwd_der_public.der -i hello,world
1038
+
1039
+ ------ d59dc4bec2be5592 begin@2024-04-04_15:57:28.114 ------
1040
+ pub key size:4096
1041
+ padding mode:oaep-sha256
1042
+ cipher:XNNpZfpu7ZjnI1HnH/KN9BdO+/rxrtt0K4z/KRQjsAZEYZV4uMtT0o45ZHrDfr6mHNrrIlTRrt6wghIeQUojEo0uQA7auwhqJXXl3ghwTqGhKH4Lkf6q+d0X/Pn1MgRoNb3dIvWsZcpTlnqmffphOe2DzWP4By9a3yZe9rb8S/ddml7/+4BIXVqxwWcAMsAg3lpLnNHBQ853XYeDZXxKjvx4J8f2RUbp7c/xsH6eUjxZfDehcoZL7te6OrY2N342UzYKBqTQV4zbqVTm0c6V1Q7XkjFK3esgcxicitIP2UsdQjpQf9xMtOTQzErdSQk/Pd6tLxLNyKQcxDaqXR9TXA84koIfGETx434im+zhOgsUuSwS6zBARI3AlpQi14LVAbr3/6ABIEJG5QvVVVG32aVzOMrPtViRqZzcDgkyIsBOXLAQv7c5UkP+nePtnjs31IXmcO87p5zW6rweW/6Y5z1emI6RIHgLjqGKFKkaWXua0N+ZqHTEuqks2y27mFFT/g2DJN3zp5corIcjgSEqyuQbQg/hFaurrqzu+djQ1Pevjzy8rUOM7k97UYUHwjv0ITeIB/m2Rknbwsu3WH3jW6TV8Ta+Bw05ZKYT6hoFPttfno+iDVRmzRlY2QuBxHzEALtdsANzxKnpUr/vr5mEmU8Wmi87QSjp1ULMJ5lTU64=
1043
+ ------ d59dc4bec2be5592 took 14.696 milli-seconds to execute ------
1044
+
1045
+ # 解密 -p 指定密码
1046
+ ❯ easy_encryption_tool rsa decrypt -e der -f ./test_data/test_pwd_der_private_cipher.der -i XNNpZfpu7ZjnI1HnH/KN9BdO+/rxrtt0K4z/KRQjsAZEYZV4uMtT0o45ZHrDfr6mHNrrIlTRrt6wghIeQUojEo0uQA7auwhqJXXl3ghwTqGhKH4Lkf6q+d0X/Pn1MgRoNb3dIvWsZcpTlnqmffphOe2DzWP4By9a3yZe9rb8S/ddml7/+4BIXVqxwWcAMsAg3lpLnNHBQ853XYeDZXxKjvx4J8f2RUbp7c/xsH6eUjxZfDehcoZL7te6OrY2N342UzYKBqTQV4zbqVTm0c6V1Q7XkjFK3esgcxicitIP2UsdQjpQf9xMtOTQzErdSQk/Pd6tLxLNyKQcxDaqXR9TXA84koIfGETx434im+zhOgsUuSwS6zBARI3AlpQi14LVAbr3/6ABIEJG5QvVVVG32aVzOMrPtViRqZzcDgkyIsBOXLAQv7c5UkP+nePtnjs31IXmcO87p5zW6rweW/6Y5z1emI6RIHgLjqGKFKkaWXua0N+ZqHTEuqks2y27mFFT/g2DJN3zp5corIcjgSEqyuQbQg/hFaurrqzu+djQ1Pevjzy8rUOM7k97UYUHwjv0ITeIB/m2Rknbwsu3WH3jW6TV8Ta+Bw05ZKYT6hoFPttfno+iDVRmzRlY2QuBxHzEALtdsANzxKnpUr/vr5mEmU8Wmi87QSjp1ULMJ5lTU64= -p 1234567890
1047
+
1048
+ ------ 806b307f230908a4 begin@2024-04-04_15:57:47.873 ------
1049
+ private key password:1234567890
1050
+ key size:4096
1051
+ padding mode:oaep-sha256
1052
+ origin plain:hello,world
1053
+ ------ 806b307f230908a4 took 343.988 milli-seconds to execute ------
1054
+ ```
1055
+
1056
+ #### 对明文为 base64 编码的字节流做加解密
1057
+
1058
+ ```python
1059
+ # 加密
1060
+ ❯ easy_encryption_tool rsa encrypt -e pem -f ./test_data/test_pwd_pem_public.pem -i krJchuyaDRYHnu5tsy8UzA== -c
1061
+
1062
+ ------ 29fa5af7e9f84f15 begin@2024-04-04_15:58:07.029 ------
1063
+ pub key size:4096
1064
+ padding mode:oaep-sha256
1065
+ cipher:QiztiJ21bVsNf4DyPhzDAR/E24Xqe94P398JLDakFl3LDhOA3I/XHY3v3R0GBNRrrMPtUorGHxCVmJNqc06kLCtQ4ljd015rYFRgbAtNLsaNgjsdv1Q7kHQSVa7L1BHdhNDK47svEWMQTS4jKLiKVYbCnz4ARYqe3n+vf5UtVDlrpmMNjowbdfnhnEFibCICBwnGUpssFs9X546/BzCTlqgEGdy1SpFhfX2LaqXkTQwsd3YxU9ynHZ7oVe78z/xJlEDQbPGJSfGbUtoCgQAn975hzCceC+CeDK9E7N8vu6HTv9K3vMNRHTOweRWuGxJKKjzVLSXRcDjkXynJPPe6yuyJdFnsoSHWuOsyqPrjJJC+2RvrkW24RlIEMnVEqLReD8/OnZEEw4CZF9xqplS7yRN/khaYM4MxD9qcxAIYgpg2wq6QngtabU+nGtQSfjKIkXlXnbvqMcLI1pS0TtG5vUeNSzc3Ll8g9CxvMrA/T/vUjz9d60fsGpHbjZezpsQdI8Us60BMxUWgFZ6x/ME5HkMmtXYfvi0/aNKWXymgHtVxqeM9hJaQ6MX1zNZRPe4MMHu3xJgATAbVc7GldgV+d2gZm2cLzZaTTB4ARcAARSKPgbskmIQ2buNRs2/ogjvtG72jilOCmSPKZom0VPHkrLzL4csxgxSd2M5N4cu6+Po=
1066
+ ------ 29fa5af7e9f84f15 took 15.584 milli-seconds to execute ------
1067
+
1068
+ # 解密 -p 指定密码
1069
+ ❯ easy_encryption_tool rsa decrypt -e pem -f ./test_data/test_pwd_pem_private_cipher.pem -i QiztiJ21bVsNf4DyPhzDAR/E24Xqe94P398JLDakFl3LDhOA3I/XHY3v3R0GBNRrrMPtUorGHxCVmJNqc06kLCtQ4ljd015rYFRgbAtNLsaNgjsdv1Q7kHQSVa7L1BHdhNDK47svEWMQTS4jKLiKVYbCnz4ARYqe3n+vf5UtVDlrpmMNjowbdfnhnEFibCICBwnGUpssFs9X546/BzCTlqgEGdy1SpFhfX2LaqXkTQwsd3YxU9ynHZ7oVe78z/xJlEDQbPGJSfGbUtoCgQAn975hzCceC+CeDK9E7N8vu6HTv9K3vMNRHTOweRWuGxJKKjzVLSXRcDjkXynJPPe6yuyJdFnsoSHWuOsyqPrjJJC+2RvrkW24RlIEMnVEqLReD8/OnZEEw4CZF9xqplS7yRN/khaYM4MxD9qcxAIYgpg2wq6QngtabU+nGtQSfjKIkXlXnbvqMcLI1pS0TtG5vUeNSzc3Ll8g9CxvMrA/T/vUjz9d60fsGpHbjZezpsQdI8Us60BMxUWgFZ6x/ME5HkMmtXYfvi0/aNKWXymgHtVxqeM9hJaQ6MX1zNZRPe4MMHu3xJgATAbVc7GldgV+d2gZm2cLzZaTTB4ARcAARSKPgbskmIQ2buNRs2/ogjvtG72jilOCmSPKZom0VPHkrLzL4csxgxSd2M5N4cu6+Po= -p 1234567890
1070
+
1071
+ ------ d1f6350d34acf14e begin@2024-04-04_15:58:25.431 ------
1072
+ private key password:1234567890
1073
+ key size:4096
1074
+ padding mode:oaep-sha256
1075
+ b64 encoded plain:krJchuyaDRYHnu5tsy8UzA==
1076
+ ------ d1f6350d34acf14e took 344.681 milli-seconds to execute ------
1077
+ ```
1078
+
1079
+ #### 加密模式设置
1080
+
1081
+ ##### OAEP模式
1082
+
1083
+ ```python
1084
+ # 加密
1085
+ ❯ easy_encryption_tool rsa encrypt -e pem -f ./test_data/test_no_pwd_pem_public.pem -i hello,world -m oaep
1086
+
1087
+ ------ 5d4c86b12cac7641 begin@2024-04-04_15:58:41.153 ------
1088
+ pub key size:4096
1089
+ padding mode:oaep-sha256
1090
+ cipher:LmYOuAO+zP1qCjivWUH7/EM81/2pDNK5t7JmRXW1GvhElRCa0uKTvEYa/Ncsoqv+zpbxo3O6j9K3YkGbO6rbi2DasYSKCX6DGvMNd348onbEiLZEpRMCGG03PpTpoargFZJhsnUQ6MvFPEpML9Om8EbjAwMG+xukuKV2Vak/6GmO8XQfsr6C+1hzhXqBggorJPyjpGZfypQO3Cx38puIpGC+TAewXZNMcBiVU3MTFvVfPk/vqlzYU68TXHGIIsKFKQG35iOSJA3bXr/FLwor3yAGdk7VS2e1kAYnuceUW9WN4FKb+ThRGRiDepJmFPM3TN9ZEEbdDH+wIZO7MkmKD4RBUgBO0RSDMIP8x8LxKN05xKqRxcrFbx5UKfurf1vAi4Hu+AP+e3kL/2UlvmHfLwmVYMT4Quzy414T/R43cNe9eH8KCypNjV5bFqdUyxJ4u7mC0f+S7PD1oTB6vhwsMOXH6tadhd7LpzpUrEyH6DLhukRIuo72IIdGnXNlB9d4yklxCPfvg9lj/irmdJKaq0MSbm1mZCp3J6R+sd0iKXakZnkPU7YLjwz92S7a1gSwfEpzBfsQZcuqs2BSN/iOEWMEB1XVGZrsbv5Tpp8APo/scGLBHmyk7Q/mDgsaNXrrGiQw0NfU4ZPzaFlvL2AC6HVE0YK4Nm4CIAXy+m2hItM=
1091
+ ------ 5d4c86b12cac7641 took 14.201 milli-seconds to execute ------
1092
+
1093
+ # 解密
1094
+ ❯ easy_encryption_tool rsa decrypt -e pem -f test_data/test_no_pwd_pem_private.pem -m oaep -i LmYOuAO+zP1qCjivWUH7/EM81/2pDNK5t7JmRXW1GvhElRCa0uKTvEYa/Ncsoqv+zpbxo3O6j9K3YkGbO6rbi2DasYSKCX6DGvMNd348onbEiLZEpRMCGG03PpTpoargFZJhsnUQ6MvFPEpML9Om8EbjAwMG+xukuKV2Vak/6GmO8XQfsr6C+1hzhXqBggorJPyjpGZfypQO3Cx38puIpGC+TAewXZNMcBiVU3MTFvVfPk/vqlzYU68TXHGIIsKFKQG35iOSJA3bXr/FLwor3yAGdk7VS2e1kAYnuceUW9WN4FKb+ThRGRiDepJmFPM3TN9ZEEbdDH+wIZO7MkmKD4RBUgBO0RSDMIP8x8LxKN05xKqRxcrFbx5UKfurf1vAi4Hu+AP+e3kL/2UlvmHfLwmVYMT4Quzy414T/R43cNe9eH8KCypNjV5bFqdUyxJ4u7mC0f+S7PD1oTB6vhwsMOXH6tadhd7LpzpUrEyH6DLhukRIuo72IIdGnXNlB9d4yklxCPfvg9lj/irmdJKaq0MSbm1mZCp3J6R+sd0iKXakZnkPU7YLjwz92S7a1gSwfEpzBfsQZcuqs2BSN/iOEWMEB1XVGZrsbv5Tpp8APo/scGLBHmyk7Q/mDgsaNXrrGiQw0NfU4ZPzaFlvL2AC6HVE0YK4Nm4CIAXy+m2hItM=
1095
+
1096
+ ------ 9f151c4c9f56af86 begin@2024-04-04_15:59:05.700 ------
1097
+ private key password:
1098
+ key size:4096
1099
+ padding mode:oaep-sha256
1100
+ origin plain:hello,world
1101
+ ------ 9f151c4c9f56af86 took 346.121 milli-seconds to execute ------
1102
+ ```
1103
+
1104
+ ##### PKCS1v15 模式
1105
+
1106
+ ```python
1107
+ # 加密
1108
+ ❯ easy_encryption_tool rsa encrypt -e pem -f ./test_data/test_no_pwd_pem_public.pem -i hello,world -m pkcs1v15
1109
+
1110
+ ------ 875086be5059242c begin@2024-04-04_15:59:19.282 ------
1111
+ pub key size:4096
1112
+ padding mode:pkcs1v15
1113
+ cipher:i1hVnoQsWAQK4sftuvg08Fq1dzm3o5BRNb78K6gBGVwsu1a/gSFGwIqSOa22ONlZ0cnPu7v/mZAVOi8/tXa1++JrmpnyoZTQ3vATkXK8WG6Q6Dw/dLKUFvsRv04hxMI2ttSMNqFsiRRnCy1qx2m4PFPPuZFniuT4i9hutGn4br+d5e1DtyLxsSmefKk4BJn0Rzgzv3ImeBmT0znTJ5VN2SI/WRHlvc6KmtnQ1xD2/2kkMycPzLguL+XXc+ie/sNg3Y0CelQcXOxonAnkQcXKpzQL7+pONVDHIJvRRXjv0nUWhTay+KWPApfB+BZ0MkI03oW0divZXohI5pWa7n4Gvw1qN+Kvt3BAmBK64LvlKFzZF553re5fMKodhrK/yhIsCtWYjsrgEz+5UAmavwH6dgTrIpssfSQDaUlWwVQRG/pG+jbxkKZ1Y7SX1SAznS4Jb3xKFeWN7ulPLJIe3Zro4VxihW0KgChDFrnVtpZLuXq98mVR+v/L2HaCzNRCY39soYZZywt3IhP2ZDVoCGpVQWQ8y69pbCKfCfiOheRf1j7VYtIOATT2kNGJrVnBwZvXBfQ2Mp3y9UPIud+WAkS2s6bha1QBF/YX72xtZoiICLZZmrmXN3DdGWy1y8SM3mI75s2GsqjF6JeN2iNoLtDy2tpREH78MujjnSjMSCP78wY=
1114
+ ------ 875086be5059242c took 14.024 milli-seconds to execute ------
1115
+
1116
+ # 解密
1117
+ ❯ easy_encryption_tool rsa decrypt -e pem -f test_data/test_no_pwd_pem_private.pem -m pkcs1v15 -i i1hVnoQsWAQK4sftuvg08Fq1dzm3o5BRNb78K6gBGVwsu1a/gSFGwIqSOa22ONlZ0cnPu7v/mZAVOi8/tXa1++JrmpnyoZTQ3vATkXK8WG6Q6Dw/dLKUFvsRv04hxMI2ttSMNqFsiRRnCy1qx2m4PFPPuZFniuT4i9hutGn4br+d5e1DtyLxsSmefKk4BJn0Rzgzv3ImeBmT0znTJ5VN2SI/WRHlvc6KmtnQ1xD2/2kkMycPzLguL+XXc+ie/sNg3Y0CelQcXOxonAnkQcXKpzQL7+pONVDHIJvRRXjv0nUWhTay+KWPApfB+BZ0MkI03oW0divZXohI5pWa7n4Gvw1qN+Kvt3BAmBK64LvlKFzZF553re5fMKodhrK/yhIsCtWYjsrgEz+5UAmavwH6dgTrIpssfSQDaUlWwVQRG/pG+jbxkKZ1Y7SX1SAznS4Jb3xKFeWN7ulPLJIe3Zro4VxihW0KgChDFrnVtpZLuXq98mVR+v/L2HaCzNRCY39soYZZywt3IhP2ZDVoCGpVQWQ8y69pbCKfCfiOheRf1j7VYtIOATT2kNGJrVnBwZvXBfQ2Mp3y9UPIud+WAkS2s6bha1QBF/YX72xtZoiICLZZmrmXN3DdGWy1y8SM3mI75s2GsqjF6JeN2iNoLtDy2tpREH78MujjnSjMSCP78wY=
1118
+
1119
+ ------ d5096f43a1dd5d65 begin@2024-04-04_15:59:37.216 ------
1120
+ private key password:
1121
+ key size:4096
1122
+ padding mode:pkcs1v15
1123
+ origin plain:hello,world
1124
+ ------ d5096f43a1dd5d65 took 348.221 milli-seconds to execute ------
1125
+ ```
1126
+
1127
+
1128
+
1129
+ ### 签名与验签
1130
+
1131
+ #### 支持的参数
1132
+
1133
+ ```python
1134
+ # 签名
1135
+ ❯ easy_encryption_tool rsa sign --help
1136
+ Usage: main.py rsa sign [OPTIONS]
1137
+
1138
+ Options:
1139
+ -f, --private-key TEXT 私钥文件路径 [required]
1140
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
1141
+ -m, --mode [pss|pkcs1v15] 签名时的填充模式 [default: pss; required]
1142
+ -h, --hash-mode [sha256|sha384|sha512]
1143
+ 签名时的哈希算法 [default: sha256]
1144
+ -p, --password TEXT 私钥密码,使用私钥时需要输入正确的密码
1145
+ -i, --input-data TEXT 需要被签名的数据 [required]
1146
+ -c, --b64-encoded 输入数据是否被 base64 编码过
1147
+ --help Show this message and exit.
1148
+
1149
+ # 验签
1150
+ ❯ easy_encryption_tool rsa verify --help
1151
+ Usage: main.py rsa verify [OPTIONS]
1152
+
1153
+ Options:
1154
+ -f, --public-key TEXT 公钥文件路径 [required]
1155
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
1156
+ -m, --mode [pss|pkcs1v15] 签名时的填充模式 [default: pss; required]
1157
+ -h, --hash-mode [sha256|sha384|sha512]
1158
+ 签名时的哈希算法 [default: sha256]
1159
+ -i, --input-data TEXT 需要被签名的数据 [required]
1160
+ -c, --b64-encoded 输入数据是否被 base64 编码过
1161
+ -s, --signature TEXT base64 编码过的签名值
1162
+ --help Show this message and exit.
1163
+ ```
1164
+
1165
+ #### PSS模式
1166
+
1167
+ ```python
1168
+ # 签名 -p 指定密码
1169
+ ❯ easy_encryption_tool rsa sign -e der -f ./test_data/test_pwd_der_private_cipher.der -m pss -i hello,world -p 1234567890
1170
+
1171
+ ------ 9238d47e0e2636f1 begin@2024-04-04_16:01:35.674 ------
1172
+ key size:4096
1173
+ signature:74bd0807319b4b7c58dc40eaf58efee853eb5d506079ebe8aa3e76350d42ea88c4560c4e732911cca4cd101da6b5b712fae4005bd207d88fcc87761c5c0942f932b9f5773814b91c68c91b23fd623681a069fd29d86c1c89b080b35cf1f45024bf92fdfade2b9536603f5ae40ee0d1350eae686ba1b02954efd8f2b43226228247ce8d5d9c1bbebb97aa77eb52c5a62fbf8bd46e531abf3683487ce5f18cb48f2f175398861f579ea3f38281fc74c7d26942a890fbf3f7c089c553fb632058e7d553c9fc3f4126433cd126067df935008227eaa96b4b7fcb01621d1d553d58070b656aaf2e6d28eb062e5643c639261d908bfd57542ed06e18bfd1419f300582d571c8f461422f684ffd9a68584fd164667f94e9775024cfe635a207297c8a3f1e078652c45c92c7d5ac2a10b6541b2aaaa30e926496caae06effe280bc275ea6b34cf83f3f2ce141acfbce1e03d11071cd9e177be28855fe108ef25ae0ba42db67e9992e3fa0072f92dd8843c666707685f49a10fba0f5719b752025893b272f8171951e007f1527b0320c62e1e9d6814e8de43084e51f917d52047a856576e6cc608576f4d99f4a8e9b237be7c576cf30cb8f97b69e85be2a6e5911f1105555778d122351691d434d40e3742278c54e71c8eac4bbb59918e3ffd3c162d25f0d1dff36e17c3ced4af449f5d06195f9a3328f1c24bd7b52aa49d8727e1894ad2
1174
+ ----------------
1175
+ base64 encoded:dL0IBzGbS3xY3EDq9Y7+6FPrXVBgeevoqj52NQ1C6ojEVgxOcykRzKTNEB2mtbcS+uQAW9IH2I/Mh3YcXAlC+TK59Xc4FLkcaMkbI/1iNoGgaf0p2GwcibCAs1zx9FAkv5L9+t4rlTZgP1rkDuDRNQ6uaGuhsClU79jytDImIoJHzo1dnBu+u5eqd+tSxaYvv4vUblMavzaDSHzl8Yy0jy8XU5iGH1eeo/OCgfx0x9JpQqiQ+/P3wInFU/tjIFjn1VPJ/D9BJkM80SYGffk1AIIn6qlrS3/LAWIdHVU9WAcLZWqvLm0o6wYuVkPGOSYdkIv9V1Qu0G4Yv9FBnzAFgtVxyPRhQi9oT/2aaFhP0WRmf5Tpd1Akz+Y1ogcpfIo/HgeGUsRcksfVrCoQtlQbKqqjDpJklsquBu/+KAvCdeprNM+D8/LOFBrPvOHgPREHHNnhd74ohV/hCO8lrgukLbZ+mZLj+gBy+S3YhDxmZwdoX0mhD7oPVxm3UgJYk7Jy+BcZUeAH8VJ7AyDGLh6daBTo3kMITlH5F9UgR6hWV25sxghXb02Z9Kjpsje+fFds8wy4+Xtp6FvipuWRHxEFVVd40SI1FpHUNNQON0InjFTnHI6sS7tZkY4//TwWLSXw0d/zbhfDztSvRJ9dBhlfmjMo8cJL17UqpJ2HJ+GJStI=
1176
+ mode:pss-sha256
1177
+ ------ 9238d47e0e2636f1 took 348.185 milli-seconds to execute ------
1178
+
1179
+ # 验签
1180
+ ❯ easy_encryption_tool rsa verify -e der -f ./test_data/test_pwd_der_public.der -m pss -s dL0IBzGbS3xY3EDq9Y7+6FPrXVBgeevoqj52NQ1C6ojEVgxOcykRzKTNEB2mtbcS+uQAW9IH2I/Mh3YcXAlC+TK59Xc4FLkcaMkbI/1iNoGgaf0p2GwcibCAs1zx9FAkv5L9+t4rlTZgP1rkDuDRNQ6uaGuhsClU79jytDImIoJHzo1dnBu+u5eqd+tSxaYvv4vUblMavzaDSHzl8Yy0jy8XU5iGH1eeo/OCgfx0x9JpQqiQ+/P3wInFU/tjIFjn1VPJ/D9BJkM80SYGffk1AIIn6qlrS3/LAWIdHVU9WAcLZWqvLm0o6wYuVkPGOSYdkIv9V1Qu0G4Yv9FBnzAFgtVxyPRhQi9oT/2aaFhP0WRmf5Tpd1Akz+Y1ogcpfIo/HgeGUsRcksfVrCoQtlQbKqqjDpJklsquBu/+KAvCdeprNM+D8/LOFBrPvOHgPREHHNnhd74ohV/hCO8lrgukLbZ+mZLj+gBy+S3YhDxmZwdoX0mhD7oPVxm3UgJYk7Jy+BcZUeAH8VJ7AyDGLh6daBTo3kMITlH5F9UgR6hWV25sxghXb02Z9Kjpsje+fFds8wy4+Xtp6FvipuWRHxEFVVd40SI1FpHUNNQON0InjFTnHI6sS7tZkY4//TwWLSXw0d/zbhfDztSvRJ9dBhlfmjMo8cJL17UqpJ2HJ+GJStI= -i hello,world
1181
+
1182
+ ------ 8e8b995bbc527e67 begin@2024-04-04_16:02:01.136 ------
1183
+ verify success
1184
+ key size:4096
1185
+ mode:pss-sha256
1186
+ ------ 8e8b995bbc527e67 took 14.193 milli-seconds to execute ------
1187
+ ```
1188
+
1189
+ #### PKCS1v15模式
1190
+
1191
+ ```python
1192
+ # 签名 -p 指定密码
1193
+ ❯ easy_encryption_tool rsa sign -e pem -f ./test_data/test_pwd_pem_private_cipher.pem -i hello,world -p 1234567890
1194
+
1195
+ ------ c12c59d278e72bb6 begin@2024-04-04_16:02:15.070 ------
1196
+ key size:4096
1197
+ signature:8590c16fd7349f7da4b845ab56c0fd786cd0f5bd4c60b8508d571f9c1da8a6f647c6b283a593ce3a8d77bf052f8eef2752058cb653faf434b7e04e4b49248d2d55815616c0e9e4e4196186bc749831616ab66a815f82bc6414d9469790aabb987cdf76b2594e586c65512042aa70f04c6c5ddf9d2038cd01971d36829e3342710e3221eb83f0299baa876df8fa43f76b6bad7ec0a28e30d77f5bdbae132f880ee2234bd5de82ae1e7c00fcb20d04f5c65e5d79a9b64f3776868139581b1ba3cf8167ca2e893330b4a49f2a5c0cd9bd5f331d270dbd3aacc6fba492ab7cce3fe78ec2f7b82d339b9ab90b89bbed8fe5f123f26709a4777dee8df500bf6d4d7178c25889c90b4d0826a47a85556958041aeb5e3609abe315d286d2804eacda85af2bbdfab943206150bd651fd0cb5106ff9b03636dcd2b5ab4d2186fe48241802ad0c8a4313d8bc29ff5c36fa0cffad5e566f3b47b3564b2739685e5ca881c3729fc300911f62b95c36eced3ebb6260997ba16b614599d809df71010a94ada31fa1db0342b632826b57599a8227ce18a44565de61e23e96b5d413702648173ada70f7c3d46599357edb4b2926f5824eef4a5960eae06c236c7cf1a8890ff67365b1aaf778423b99e641ffd56553d8196b4ed40b11ae6e804f8623fc9e3842f248394b61d1886c550d5e20c4e9d3c8b071da6f55569740f3b633cfd99167442a9f5
1198
+ ----------------
1199
+ base64 encoded:hZDBb9c0n32kuEWrVsD9eGzQ9b1MYLhQjVcfnB2opvZHxrKDpZPOOo13vwUvju8nUgWMtlP69DS34E5LSSSNLVWBVhbA6eTkGWGGvHSYMWFqtmqBX4K8ZBTZRpeQqruYfN92sllOWGxlUSBCqnDwTGxd350gOM0Blx02gp4zQnEOMiHrg/Apm6qHbfj6Q/dra61+wKKOMNd/W9uuEy+IDuIjS9Xegq4efAD8sg0E9cZeXXmptk83doaBOVgbG6PPgWfKLokzMLSknypcDNm9XzMdJw29OqzG+6SSq3zOP+eOwve4LTObmrkLibvtj+XxI/JnCaR3fe6N9QC/bU1xeMJYickLTQgmpHqFVWlYBBrrXjYJq+MV0obSgE6s2oWvK736uUMgYVC9ZR/Qy1EG/5sDY23NK1q00hhv5IJBgCrQyKQxPYvCn/XDb6DP+tXlZvO0ezVksnOWheXKiBw3KfwwCRH2K5XDbs7T67YmCZe6FrYUWZ2AnfcQEKlK2jH6HbA0K2MoJrV1magifOGKRFZd5h4j6WtdQTcCZIFzracPfD1GWZNX7bSykm9YJO70pZYOrgbCNsfPGoiQ/2c2Wxqvd4QjuZ5kH/1WVT2BlrTtQLEa5ugE+GI/yeOELySDlLYdGIbFUNXiDE6dPIsHHab1VWl0DztjPP2ZFnRCqfU=
1200
+ mode:pss-sha256
1201
+ ------ c12c59d278e72bb6 took 343.034 milli-seconds to execute ------
1202
+
1203
+ # 验签
1204
+ ❯ easy_encryption_tool rsa verify -e pem -f ./test_data/test_pwd_pem_public.pem -i hello,world -s hZDBb9c0n32kuEWrVsD9eGzQ9b1MYLhQjVcfnB2opvZHxrKDpZPOOo13vwUvju8nUgWMtlP69DS34E5LSSSNLVWBVhbA6eTkGWGGvHSYMWFqtmqBX4K8ZBTZRpeQqruYfN92sllOWGxlUSBCqnDwTGxd350gOM0Blx02gp4zQnEOMiHrg/Apm6qHbfj6Q/dra61+wKKOMNd/W9uuEy+IDuIjS9Xegq4efAD8sg0E9cZeXXmptk83doaBOVgbG6PPgWfKLokzMLSknypcDNm9XzMdJw29OqzG+6SSq3zOP+eOwve4LTObmrkLibvtj+XxI/JnCaR3fe6N9QC/bU1xeMJYickLTQgmpHqFVWlYBBrrXjYJq+MV0obSgE6s2oWvK736uUMgYVC9ZR/Qy1EG/5sDY23NK1q00hhv5IJBgCrQyKQxPYvCn/XDb6DP+tXlZvO0ezVksnOWheXKiBw3KfwwCRH2K5XDbs7T67YmCZe6FrYUWZ2AnfcQEKlK2jH6HbA0K2MoJrV1magifOGKRFZd5h4j6WtdQTcCZIFzracPfD1GWZNX7bSykm9YJO70pZYOrgbCNsfPGoiQ/2c2Wxqvd4QjuZ5kH/1WVT2BlrTtQLEa5ugE+GI/yeOELySDlLYdGIbFUNXiDE6dPIsHHab1VWl0DztjPP2ZFnRCqfU=
1205
+
1206
+ ------ 8151e7568131a1c6 begin@2024-04-04_16:02:36.431 ------
1207
+ verify success
1208
+ key size:4096
1209
+ mode:pss-sha256
1210
+ ------ 8151e7568131a1c6 took 13.708 milli-seconds to execute ------
1211
+ ```
1212
+
1213
+ ## ECC椭圆曲线
1214
+
1215
+ ### 支持的命令
1216
+
1217
+ ```
1218
+ ❯ easy_encryption_tool ecc --help
1219
+ Usage: main.py ecc [OPTIONS] COMMAND [ARGS]...
1220
+
1221
+ Options:
1222
+ --help Show this message and exit.
1223
+
1224
+ Commands:
1225
+ ecdh
1226
+ generate
1227
+ sign
1228
+ verify
1229
+ ```
1230
+
1231
+ ### 生成密钥对
1232
+
1233
+ ```python
1234
+ ❯ easy_encryption_tool ecc generate --help
1235
+ Usage: main.py ecc generate [OPTIONS]
1236
+
1237
+ Options:
1238
+ -c, --curve [secp256r1|secp384r1|secp521r1|secp256k1]
1239
+ ecc 椭圆曲线类型 [default: secp256k1]
1240
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
1241
+ -f, --file-name TEXT 输出密钥对的文件名前缀,最终写入数据时会创建文件并加上文件名后缀 [default:
1242
+ demo; required]
1243
+ -p, --password TEXT 私钥密码,使用私钥时需要输入正确的密码
1244
+ -r, --random-password 是否生成私钥的随机密码,如果带上 -r 标识,则随机生成32字节的密码
1245
+ --help Show this message and exit.
1246
+ ```
1247
+
1248
+ #### 默认生成
1249
+
1250
+ ```python
1251
+ ❯ easy_encryption_tool ecc generate
1252
+
1253
+ ------ d6b0cebd74d64b57 begin@2024-04-04_16:07:59.720 ------
1254
+ generate demo_ecc_public.pem/demo_ecc_private.pem success
1255
+ ------ d6b0cebd74d64b57 took 17.039 milli-seconds to execute ------
1256
+ ```
1257
+
1258
+ #### 指定椭圆曲线且指定密码
1259
+
1260
+ ```python
1261
+ ❯ easy_encryption_tool ecc generate -c secp384r1 -p 1234567890
1262
+
1263
+ ------ e852fd0a2d84d39f begin@2024-04-04_16:08:46.706 ------
1264
+ private key password:1234567890
1265
+ generate demo_ecc_public.pem/demo_ecc_private_cipher.pem success
1266
+ ------ e852fd0a2d84d39f took 16.710 milli-seconds to execute ------
1267
+ ```
1268
+
1269
+ #### 指定椭圆曲线且随机生成密码
1270
+
1271
+ ```python
1272
+ ❯ easy_encryption_tool ecc generate -c secp384r1 -r
1273
+
1274
+ ------ 073bd5585937e6fd begin@2024-04-04_16:09:28.102 ------
1275
+ private key password:)N)y&4dq=ODg`339uE`7*@A9Gl0eVs3Z
1276
+ generate demo_ecc_public.pem/demo_ecc_private_cipher.pem success
1277
+ ------ 073bd5585937e6fd took 16.721 milli-seconds to execute ------
1278
+ ```
1279
+
1280
+ ### ECDH密钥交换
1281
+
1282
+ #### 支持的参数
1283
+
1284
+ ```python
1285
+ ❯ easy_encryption_tool ecc ecdh --help
1286
+ Usage: main.py ecc ecdh [OPTIONS]
1287
+
1288
+ Options:
1289
+ -a, --alice-pub-key TEXT 你自己的公钥文件的路径如: ./alice_public.pem [required]
1290
+ -k, --alice-pri-key TEXT 你自己的私钥文件的路径如: ./alice_private.pem [required]
1291
+ -p, --password TEXT 你自己的私钥的密码,如果创建时设置了密码,那么在使用私钥时需要输入正确的密码
1292
+ -b, --bob-pub-key TEXT 对方的公钥文件的路径如: ./bob_public.pem [required]
1293
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
1294
+ -l, --length INTEGER RANGE 派生密钥的长度,默认 32 字节,长度范围[16 -- 64] [default: 32;
1295
+ 16<=x<=64]
1296
+ -s, --salt TEXT 用于增加派生密钥安全性的盐值,两边必须提供一样的盐值 [default:
1297
+ hello,world1234567890!@#$%^&*()_+{}:";<>?/;
1298
+ required]
1299
+ -c, --context TEXT 用于增加派生密钥安全性的上下文信息,两边必须提供一样的上下文数据 [default: ecc
1300
+ handshake context data; required]
1301
+ --help Show this message and exit.
1302
+
1303
+ ```
1304
+
1305
+ #### 生成 alice 与 bob 的密钥对
1306
+
1307
+ ```python
1308
+ ❯ easy_encryption_tool ecc generate -f alice -p 1234567890
1309
+
1310
+ ------ f4815ee66aa727b2 begin@2024-04-04_16:11:03.966 ------
1311
+ private key password:1234567890
1312
+ generate alice_ecc_public.pem/alice_ecc_private_cipher.pem success
1313
+ ------ f4815ee66aa727b2 took 17.763 milli-seconds to execute ------
1314
+
1315
+ ❯ easy_encryption_tool ecc generate -f bob -p 1234567890
1316
+
1317
+ ------ 76e72cdd07cb5c32 begin@2024-04-04_16:11:26.201 ------
1318
+ private key password:1234567890
1319
+ generate bob_ecc_public.pem/bob_ecc_private_cipher.pem success
1320
+ ------ 76e72cdd07cb5c32 took 16.373 milli-seconds to execute ------
1321
+ ```
1322
+
1323
+ #### alice派生和 bob 共享的对称密钥
1324
+
1325
+ ```python
1326
+ ❯ easy_encryption_tool ecc ecdh -a ./alice_ecc_public.pem -k ./alice_ecc_private_cipher.pem -p 1234567890 -b ./bob_ecc_public.pem -l 64 -s alice-bob -c key-alice-bob
1327
+
1328
+ ------ 8235537a02e647d4 begin@2024-04-04_16:14:48.686 ------
1329
+ curve name:secp256k1
1330
+ derived key:u+UNGIzrPbLRVlTSixl8fgd3SgLuGeQrwSI4Irs1tpSVivmTxYLTOUm/o1pvqPLuOGVA8D3iLdUGLEE72Wo1QQ==
1331
+ length:64
1332
+ ------ 8235537a02e647d4 took 18.166 milli-seconds to execute ------
1333
+ ```
1334
+
1335
+ #### bob派生和alice共享的对称密钥
1336
+
1337
+ ```python
1338
+ ❯ easy_encryption_tool ecc ecdh -a ./bob_ecc_public.pem -k ./bob_ecc_private_cipher.pem -p 1234567890 -b ./alice_ecc_public.pem -l 64 -s alice-bob -c key-alice-bob
1339
+
1340
+ ------ d50d7d254d02104c begin@2024-04-04_16:15:39.570 ------
1341
+ curve name:secp256k1
1342
+ derived key:u+UNGIzrPbLRVlTSixl8fgd3SgLuGeQrwSI4Irs1tpSVivmTxYLTOUm/o1pvqPLuOGVA8D3iLdUGLEE72Wo1QQ==
1343
+ length:64
1344
+ ------ d50d7d254d02104c took 16.998 milli-seconds to execute ------
1345
+ ```
1346
+
1347
+ ### 签名与验签
1348
+
1349
+ #### 支持的参数
1350
+
1351
+ ```python
1352
+ # 签名
1353
+ ❯ easy_encryption_tool ecc sign --help
1354
+ Usage: main.py ecc sign [OPTIONS]
1355
+
1356
+ Options:
1357
+ -f, --private-key TEXT 私钥文件路径 [required]
1358
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
1359
+ -h, --hash-mode [sha256|sha384|sha512|sha3-224|sha3-256|sha3-384|sha3-512]
1360
+ 签名时的哈希算法 [default: sha256]
1361
+ -p, --password TEXT 私钥密码,如果生成时设置了密码那么在使用私钥时需要输入正确的密码
1362
+ -i, --input-data TEXT 需要被签名的数据 [required]
1363
+ -c, --b64-encoded 输入数据是否被 base64 编码过
1364
+ --help Show this message and exit.
1365
+
1366
+ # 验签
1367
+ ❯ easy_encryption_tool ecc verify --help
1368
+ Usage: main.py ecc verify [OPTIONS]
1369
+
1370
+ Options:
1371
+ -f, --public-key TEXT 公钥文件路径 [required]
1372
+ -e, --encoding [pem|der] 密钥格式 [default: pem]
1373
+ -h, --hash-mode [sha256|sha384|sha512|sha3-224|sha3-256|sha3-384|sha3-512]
1374
+ 签名时的哈希算法 [default: sha256]
1375
+ -i, --input-data TEXT 需要被签名的数据 [required]
1376
+ -c, --b64-encoded 输入数据是否被 base64 编码过
1377
+ -s, --signature TEXT base64 编码过的签名值
1378
+ --help Show this message and exit.
1379
+ ```
1380
+
1381
+ #### 生成密钥对
1382
+
1383
+ ```python
1384
+ ❯ easy_encryption_tool ecc generate -c secp384r1 -p 1234567890 -e der
1385
+
1386
+ ------ 3a40beeed28cffa4 begin@2024-04-04_16:17:49.172 ------
1387
+ private key password:1234567890
1388
+ generate demo_ecc_public.der/demo_ecc_private_cipher.der success
1389
+ ------ 3a40beeed28cffa4 took 16.821 milli-seconds to execute ------
1390
+ ```
1391
+
1392
+ #### 签名
1393
+
1394
+ ```python
1395
+ ❯ easy_encryption_tool ecc sign -f ./demo_ecc_private_cipher.der -e der -h sha3-512 -p 1234567890 -i aGVsbG8sd29ybGQK -c
1396
+
1397
+ ------ dbc12fab8422ba0f begin@2024-04-04_16:18:57.578 ------
1398
+ curve name:secp384r1
1399
+ key size:384
1400
+ signature:30640230243bba7ec0a95f7aef4868673282b70217285a667ae52ce5e43c6af5b33e8adbda86bbe2a7d9f995b934d038eae5624c02306c47daed069e51bb12c274c13219c173ed4b59c6f76caab04f50b4359f3f25c0fa4dab4c17cb88888767f37e4c8cf993
1401
+ base64 encoded:MGQCMCQ7un7AqV9670hoZzKCtwIXKFpmeuUs5eQ8avWzPorb2oa74qfZ+ZW5NNA46uViTAIwbEfa7QaeUbsSwnTBMhnBc+1LWcb3bKqwT1C0NZ8/JcD6TatMF8uIiIdn835MjPmT
1402
+ mode:ECDSA
1403
+ ------ dbc12fab8422ba0f took 17.265 milli-seconds to execute ------
1404
+ ```
1405
+
1406
+ #### 验签
1407
+
1408
+ ```python
1409
+ ❯ easy_encryption_tool ecc verify -f ./demo_ecc_public.der -e der -h sha3-512 -i aGVsbG8sd29ybGQK -c -s MGQCMCQ7un7AqV9670hoZzKCtwIXKFpmeuUs5eQ8avWzPorb2oa74qfZ+ZW5NNA46uViTAIwbEfa7QaeUbsSwnTBMhnBc+1LWcb3bKqwT1C0NZ8/JcD6TatMF8uIiIdn835MjPmT
1410
+
1411
+ ------ d1c74d3acc46413b begin@2024-04-04_16:20:09.177 ------
1412
+ curve name:secp384r1
1413
+ verify success
1414
+ key size:384
1415
+ mode:ECDSA
1416
+ ------ d1c74d3acc46413b took 15.220 milli-seconds to execute ------
1417
+ ```
1418
+
1419
+ ## 证书解析与验证
1420
+
1421
+ ### 解析证书并验证签名
1422
+
1423
+ ```python
1424
+ ❯ easy_encryption_tool cert-parse -f test_certs/baidu.com.cer
1425
+
1426
+ ------ 27f6aa95a2461345 begin@2024-04-06_15:02:26.887 ------
1427
+ ------- verify signature: -------
1428
+ verify cert signature success
1429
+ ca issuer:http://secure.globalsign.com/cacert/gsrsaovsslca2018.crt
1430
+
1431
+ ------- basic info: -------
1432
+ version: v3-2
1433
+ serial_number: 26585094245224241434632730821
1434
+ signature_algorithm: PKCS #1 RSA Encryption
1435
+ signature_hash_algorithm: sha256
1436
+ issuer: GlobalSign nv-sa|GlobalSign RSA OV SSL CA 2018|BE
1437
+ valid_before: 20230706015106Z
1438
+ valid_after: 20240806015105Z
1439
+ subject: Beijing Baidu Netcom Science Technology Co., Ltd|CN|baidu.com
1440
+ public_key_bits: 2048
1441
+ public_key_type: 6(6:RSA|116:DSA|408:EC|28:DH)
1442
+ ------ 27f6aa95a2461345 took 83.634 milli-seconds to execute ------
1443
+
1444
+ ```
1445
+
1446
+ ### 解析完整证书内容
1447
+
1448
+ ```python
1449
+ ❯ easy_encryption_tool cert-parse -f baidu.com.cer -v
1450
+
1451
+ ------ 247b96f11927fe0f begin@2024-04-06_15:04:26.023 ------
1452
+ ------- verify signature: -------
1453
+ verify cert signature success
1454
+ ca issuer:http://secure.globalsign.com/cacert/gsrsaovsslca2018.crt
1455
+
1456
+ ------- basic info: -------
1457
+ version: v3-2
1458
+ serial_number: 26585094245224241434632730821
1459
+ signature_algorithm: PKCS #1 RSA Encryption
1460
+ signature_hash_algorithm: sha256
1461
+ issuer: GlobalSign nv-sa|GlobalSign RSA OV SSL CA 2018|BE
1462
+ valid_before: 20230706015106Z
1463
+ valid_after: 20240806015105Z
1464
+ subject: Beijing Baidu Netcom Science Technology Co., Ltd|CN|baidu.com
1465
+ public_key_bits: 2048
1466
+ public_key_type: 6(6:RSA|116:DSA|408:EC|28:DH)
1467
+
1468
+ ------- verbose info: -------
1469
+ public_key_exponent: ('10001',)
1470
+ public_key_modules: ('BB04BB84765807B45A8854E06A56BCE5D48D3E1EB928E0D7018F382B41B2597DF0AC27B426241438FE4CEA3B4951F7E95B40F73FA6C8DA0F026E258B4791B82E9E0021191D1800FCDE04FD2679395DF290BC809DA87CB2918989D8402FE5D2A7F35E6D482BC51F0AB1E08E8C76FFBCD1670AD249D609EE260302F3CCCDEA8AD531A82D8F03FD5EFCE43AC68967994CCE986DFA840D0E538BE66352C59B4AA9ABA32235990DEE19FF9B2DF5A477F2EC1080F4AB82B9D17E361F0E9F9B19A0F5C357DD88BBCEE1909C3F4BBADD3AA941B3DD864DC2C2B7E8FF3713C0048943443811E6A396F70922212F2C4E0E7EE5D85CBB00445BAFDEE4B3B0F03CB63845495D',)
1471
+ public_key_fingerprints: 43A4C24005AA3F8B7E7AAE35C6729A52025DACF5AAC86E4BF8D8B6633321A9D6
1472
+ signature: 0X195A675043B1AC7A93A86818728B407EA675DEAC21FCC94116204BF38C0BB94745AEF85D79F64335260198F0B9863E2901F1DFB072B5AE78D2DF61B678678AC9779ADEE0E4412F9C1EE53B7C973F422FADE3497F9D2B0288906925030114B9B5CB0F593D2D973D02D55190690C811022DAC651EF480CD24FDE61F26A8715A56D718E3702A2850F1E1975A3802E6A1AA2028C2FECBD3D81033F8AC0A0E6B40E0857CB001C8AB71B8F38719A8DC0710C3FBCD4BE569DF718C1AABEE4DF1A86E2626F23863054782D471FB4AD052973249814A019C002FD90904E625CE84D3189C3E88B9E73593B9891CA47A5055BC51E8F85390ECEB5260A804E9F084A11491363
1473
+ certificate_fingerprints: D8:AA:2D:80:6C:57:1F:B6:2E:D4:87:48:41:90:92:3F:93:24:F0:31:9C:FF:FE:DF:7B:62:1F:13:4E:6B:C1:00
1474
+ extension_count: 10
1475
+ extensions_detail: {
1476
+ "x509.AuthorityInformationAccess": {
1477
+ "oid": "1.3.6.1.5.5.7.1.1",
1478
+ "critical": false,
1479
+ "value": {
1480
+ "caIssuers": "http://secure.globalsign.com/cacert/gsrsaovsslca2018.crt",
1481
+ "OCSP": "http://ocsp.globalsign.com/gsrsaovsslca2018"
1482
+ }
1483
+ },
1484
+ "x509.BasicConstraints": {
1485
+ "oid": "2.5.29.19",
1486
+ "critical": false,
1487
+ "value": "<BasicConstraints(ca=False, path_length=None)>"
1488
+ },
1489
+ "x509.KeyUsage": {
1490
+ "oid": "2.5.29.15",
1491
+ "critical": true,
1492
+ "value": "<KeyUsage(digital_signature=True, content_commitment=False, key_encipherment=True, data_encipherment=False, key_agreement=False, key_cert_sign=False, crl_sign=False, encipher_only=False, decipher_only=False)>"
1493
+ },
1494
+ "x509.SubjectKeyIdentifier": {
1495
+ "oid": "2.5.29.14",
1496
+ "critical": false,
1497
+ "value": "<SubjectKeyIdentifier(digest=b'\\xeds\\xab\\xf9 \\xbez\\x19\\x9fY\\x1f\\xb2\\x9f\\xf2?/?\\x91\\x84\\x12')>"
1498
+ },
1499
+ "x509.SubjectAlternativeName": {
1500
+ "oid": "2.5.29.17",
1501
+ "critical": false,
1502
+ "value": "<SubjectAlternativeName(<GeneralNames([<DNSName(value='baidu.com')>, <DNSName(value='baifubao.com')>, <DNSName(value='www.baidu.cn')>, <DNSName(value='www.baidu.com.cn')>, <DNSName(value='mct.y.nuomi.com')>, <DNSName(value='apollo.auto')>, <DNSName(value='dwz.cn')>, <DNSName(value='*.baidu.com')>, <DNSName(value='*.baifubao.com')>, <DNSName(value='*.baidustatic.com')>, <DNSName(value='*.bdstatic.com')>, <DNSName(value='*.bdimg.com')>, <DNSName(value='*.hao123.com')>, <DNSName(value='*.nuomi.com')>, <DNSName(value='*.chuanke.com')>, <DNSName(value='*.trustgo.com')>, <DNSName(value='*.bce.baidu.com')>, <DNSName(value='*.eyun.baidu.com')>, <DNSName(value='*.map.baidu.com')>, <DNSName(value='*.mbd.baidu.com')>, <DNSName(value='*.fanyi.baidu.com')>, <DNSName(value='*.baidubce.com')>, <DNSName(value='*.mipcdn.com')>, <DNSName(value='*.news.baidu.com')>, <DNSName(value='*.baidupcs.com')>, <DNSName(value='*.aipage.com')>, <DNSName(value='*.aipage.cn')>, <DNSName(value='*.bcehost.com')>, <DNSName(value='*.safe.baidu.com')>, <DNSName(value='*.im.baidu.com')>, <DNSName(value='*.baiducontent.com')>, <DNSName(value='*.dlnel.com')>, <DNSName(value='*.dlnel.org')>, <DNSName(value='*.dueros.baidu.com')>, <DNSName(value='*.su.baidu.com')>, <DNSName(value='*.91.com')>, <DNSName(value='*.hao123.baidu.com')>, <DNSName(value='*.apollo.auto')>, <DNSName(value='*.xueshu.baidu.com')>, <DNSName(value='*.bj.baidubce.com')>, <DNSName(value='*.gz.baidubce.com')>, <DNSName(value='*.smartapps.cn')>, <DNSName(value='*.bdtjrcv.com')>, <DNSName(value='*.hao222.com')>, <DNSName(value='*.haokan.com')>, <DNSName(value='*.pae.baidu.com')>, <DNSName(value='*.vd.bdstatic.com')>, <DNSName(value='*.cloud.baidu.com')>, <DNSName(value='click.hm.baidu.com')>, <DNSName(value='log.hm.baidu.com')>, <DNSName(value='cm.pos.baidu.com')>, <DNSName(value='wn.pos.baidu.com')>, <DNSName(value='update.pan.baidu.com')>])>)>"
1503
+ },
1504
+ "x509.CRLDistributionPoints": {
1505
+ "oid": "2.5.29.31",
1506
+ "critical": false,
1507
+ "value": "<CRLDistributionPoints([<DistributionPoint(full_name=[<UniformResourceIdentifier(value='http://crl.globalsign.com/gsrsaovsslca2018.crl')>], relative_name=None, reasons=None, crl_issuer=None)>])>"
1508
+ },
1509
+ "x509.ExtendedKeyUsage": {
1510
+ "oid": "2.5.29.37",
1511
+ "critical": false,
1512
+ "value": "<ExtendedKeyUsage([<ObjectIdentifier(oid=1.3.6.1.5.5.7.3.1, name=serverAuth)>, <ObjectIdentifier(oid=1.3.6.1.5.5.7.3.2, name=clientAuth)>])>"
1513
+ },
1514
+ "x509.FreshestCRL": {
1515
+ "ERROR": "x509.ExtensionNotFound",
1516
+ "oid": "",
1517
+ "value": {},
1518
+ "critical": false
1519
+ },
1520
+ "x509.NameConstraints": {
1521
+ "ERROR": "x509.ExtensionNotFound",
1522
+ "oid": "",
1523
+ "value": {},
1524
+ "critical": false
1525
+ },
1526
+ "x509.PolicyConstraints": {
1527
+ "ERROR": "x509.ExtensionNotFound",
1528
+ "oid": "",
1529
+ "value": {},
1530
+ "critical": false
1531
+ }
1532
+ }
1533
+ ------ 247b96f11927fe0f took 76.036 milli-seconds to execute ------
1534
+ ```
1535
+
1536
+ ### 解析非法证书内容
1537
+
1538
+ ```python
1539
+ # pem格式
1540
+ ❯ easy_encryption_tool cert-parse -f ./test.crt
1541
+
1542
+ ------ 34ce7a7ed108f599 begin@2024-04-06_15:05:43.194 ------
1543
+ loading cert file:./upload.sh as format:pem failed:[('PEM routines', '', 'no start line')]
1544
+ ------ 34ce7a7ed108f599 took 0.140 milli-seconds to execute ------
1545
+
1546
+ # der格式
1547
+ ❯ easy_encryption_tool cert-parse -f ./test.crt -e der
1548
+
1549
+ ------ 041f017f1492c8ce begin@2024-04-06_15:06:04.418 ------
1550
+ loading cert file:./upload.sh as format:der failed:[('asn1 encoding routines', '', 'wrong tag'), ('asn1 encoding routines', '', 'nested asn1 error')]
1551
+ ------ 041f017f1492c8ce took 0.170 milli-seconds to execute ------
1552
+ ```
1553
+