Skip to content

Commit 4490f04

Browse files
committed
feat(加密): 添加加密模块本地化支持
为加密模块添加多语言支持,包括错误消息、日志和状态信息的本地化资源文件。修改所有加密工具类使用本地化服务获取错误消息,并添加了对应的资源键常量类。 新增中英文资源文件,包含加密模块的所有异常、日志和验证消息。同时添加项目引用到本地化模块,并完善代码中的异常处理逻辑。
1 parent ff6c257 commit 4490f04

12 files changed

Lines changed: 623 additions & 49 deletions

File tree

GameFrameX.Foundation.Encryption/AesHelper.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Security.Cryptography;
22
using System.Text;
3+
using GameFrameX.Foundation.Localization.Core;
4+
using GameFrameX.Foundation.Encryption.Localization;
35

46
namespace GameFrameX.Foundation.Encryption;
57

@@ -24,12 +26,12 @@ public static string Encrypt(string encryptString, string encryptKey)
2426
{
2527
if (string.IsNullOrEmpty(encryptString))
2628
{
27-
throw new ArgumentException("Plain text cannot be null or empty", nameof(encryptString));
29+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.PlainTextCannotBeNullOrEmpty), nameof(encryptString));
2830
}
2931

3032
if (string.IsNullOrEmpty(encryptKey))
3133
{
32-
throw new ArgumentException("Encryption key cannot be null or empty", nameof(encryptKey));
34+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.EncryptionKeyCannotBeNullOrEmpty), nameof(encryptKey));
3335
}
3436

3537
return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(encryptString), encryptKey));
@@ -64,7 +66,7 @@ public static byte[] Encrypt(byte[] encryptByte, string encryptKey)
6466

6567
if (string.IsNullOrEmpty(encryptKey))
6668
{
67-
throw new ArgumentException("Encryption key cannot be null or empty", nameof(encryptKey));
69+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.EncryptionKeyCannotBeNullOrEmpty), nameof(encryptKey));
6870
}
6971

7072
byte[] encryptedBytes = null;
@@ -117,12 +119,12 @@ public static string Decrypt(string decryptString, string decryptKey)
117119
{
118120
if (string.IsNullOrEmpty(decryptString))
119121
{
120-
throw new ArgumentException("Cipher text cannot be null or empty", nameof(decryptString));
122+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.CipherTextCannotBeNullOrEmpty), nameof(decryptString));
121123
}
122124

123125
if (string.IsNullOrEmpty(decryptKey))
124126
{
125-
throw new ArgumentException("Decryption key cannot be null or empty", nameof(decryptKey));
127+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.DecryptionKeyCannotBeNullOrEmpty), nameof(decryptKey));
126128
}
127129

128130
return Encoding.UTF8.GetString(AesDecrypt(Convert.FromBase64String(decryptString), decryptKey));
@@ -157,7 +159,7 @@ public static byte[] AesDecrypt(byte[] decryptByte, string decryptKey)
157159

158160
if (string.IsNullOrEmpty(decryptKey))
159161
{
160-
throw new ArgumentException("Decryption key cannot be null or empty", nameof(decryptKey));
162+
throw new ArgumentException(LocalizationService.GetString(LocalizationKeys.Exceptions.DecryptionKeyCannotBeNullOrEmpty), nameof(decryptKey));
161163
}
162164

163165
byte[] decryptedBytes = null;

GameFrameX.Foundation.Encryption/GameFrameX.Foundation.Encryption.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@
4747
<ItemGroup>
4848
<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" />
4949
</ItemGroup>
50+
<ItemGroup>
51+
<Folder Include="Localization\Messages\" />
52+
</ItemGroup>
53+
<ItemGroup>
54+
<ProjectReference Include="..\GameFrameX.Foundation.Localization\GameFrameX.Foundation.Localization.csproj" />
55+
</ItemGroup>
5056
</Project>
Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2+
//
3+
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4+
//
5+
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6+
7+
using System;
8+
9+
namespace GameFrameX.Foundation.Encryption.Localization;
10+
11+
/// <summary>
12+
/// Encryption 模块本地化资源键常量定义
13+
/// </summary>
14+
/// <remarks>
15+
/// 这个类定义了 Encryption 模块中所有可本地化字符串的键常量。
16+
/// 使用常量可以避免字符串硬编码,提高代码的可维护性和类型安全性。
17+
/// </remarks>
18+
/// <example>
19+
/// <code>
20+
/// // 在代码中使用本地化键常量
21+
/// throw new ArgumentException(
22+
/// nameof(keySize),
23+
/// LocalizationService.GetString(LocalizationKeys.Exceptions.InvalidKeySize, expectedSize, actualSize));
24+
/// </code>
25+
/// </example>
26+
public static class LocalizationKeys
27+
{
28+
/// <summary>
29+
/// 异常消息资源键
30+
/// </summary>
31+
public static class Exceptions
32+
{
33+
/// <summary>
34+
/// 密钥数组不能为空的错误消息
35+
/// </summary>
36+
/// <remarks>
37+
/// 键名: Encryption.Exceptions.KeyArrayCannotBeEmpty
38+
/// 用途: 当传入的密钥数组为null或空时使用
39+
/// </remarks>
40+
public const string KeyArrayCannotBeEmpty = "Encryption.Exceptions.KeyArrayCannotBeEmpty";
41+
42+
/// <summary>
43+
/// 明文不能为空的错误消息
44+
/// </summary>
45+
/// <remarks>
46+
/// 键名: Encryption.Exceptions.PlainTextCannotBeNullOrEmpty
47+
/// 用途: 当待加密的明文为null或空字符串时使用
48+
/// </remarks>
49+
public const string PlainTextCannotBeNullOrEmpty = "Encryption.Exceptions.PlainTextCannotBeNullOrEmpty";
50+
51+
/// <summary>
52+
/// 加密密钥不能为空的错误消息
53+
/// </summary>
54+
/// <remarks>
55+
/// 键名: Encryption.Exceptions.EncryptionKeyCannotBeNullOrEmpty
56+
/// 用途: 当加密密钥为null或空字符串时使用
57+
/// </remarks>
58+
public const string EncryptionKeyCannotBeNullOrEmpty = "Encryption.Exceptions.EncryptionKeyCannotBeNullOrEmpty";
59+
60+
/// <summary>
61+
/// 密文不能为空的错误消息
62+
/// </summary>
63+
/// <remarks>
64+
/// 键名: Encryption.Exceptions.CipherTextCannotBeNullOrEmpty
65+
/// 用途: 当待解密的密文为null或空字符串时使用
66+
/// </remarks>
67+
public const string CipherTextCannotBeNullOrEmpty = "Encryption.Exceptions.CipherTextCannotBeNullOrEmpty";
68+
69+
/// <summary>
70+
/// 解密密钥不能为空的错误消息
71+
/// </summary>
72+
/// <remarks>
73+
/// 键名: Encryption.Exceptions.DecryptionKeyCannotBeNullOrEmpty
74+
/// 用途: 当解密密钥为null或空字符串时使用
75+
/// </remarks>
76+
public const string DecryptionKeyCannotBeNullOrEmpty = "Encryption.Exceptions.DecryptionKeyCannotBeNullOrEmpty";
77+
78+
/// <summary>
79+
/// 密钥长度无效的错误消息
80+
/// </summary>
81+
/// <remarks>
82+
/// 键名: Encryption.Exceptions.InvalidKeySize
83+
/// 用途: 当密钥长度不符合算法要求时使用
84+
/// 参数: {0} - 实际长度, {1} - 期望长度
85+
/// </remarks>
86+
public const string InvalidKeySize = "Encryption.Exceptions.InvalidKeySize";
87+
88+
/// <summary>
89+
/// 密钥字符串必须为32个字符的错误消息
90+
/// </summary>
91+
/// <remarks>
92+
/// 键名: Encryption.Exceptions.KeyMustBe32Characters
93+
/// 用途: SM4算法要求密钥为32个字符(16字节)
94+
/// </remarks>
95+
public const string KeyMustBe32Characters = "Encryption.Exceptions.KeyMustBe32Characters";
96+
97+
/// <summary>
98+
/// 密钥字符串必须为16个字符的错误消息
99+
/// </summary>
100+
/// <remarks>
101+
/// 键名: Encryption.Exceptions.KeyMustBe16Characters
102+
/// 用途: SM4算法的IV要求为16个字符(8字节)
103+
/// </remarks>
104+
public const string KeyMustBe16Characters = "Encryption.Exceptions.KeyMustBe16Characters";
105+
106+
/// <summary>
107+
/// 公钥不能为空的错误消息
108+
/// </summary>
109+
/// <remarks>
110+
/// 键名: Encryption.Exceptions.PublicKeyCannotBeEmpty
111+
/// 用途: 当SM2公钥为null或空时使用
112+
/// </remarks>
113+
public const string PublicKeyCannotBeEmpty = "Encryption.Exceptions.PublicKeyCannotBeEmpty";
114+
115+
/// <summary>
116+
/// 私钥不能为空的错误消息
117+
/// </summary>
118+
/// <remarks>
119+
/// 键名: Encryption.Exceptions.PrivateKeyCannotBeEmpty
120+
/// 用途: 当SM2私钥为null或空时使用
121+
/// </remarks>
122+
public const string PrivateKeyCannotBeEmpty = "Encryption.Exceptions.PrivateKeyCannotBeEmpty";
123+
124+
/// <summary>
125+
/// 公钥字符串不能为null的错误消息
126+
/// </summary>
127+
/// <remarks>
128+
/// 键名: Encryption.Exceptions.PublicKeyStringCannotBeNull
129+
/// 用途: 当SM2公钥字符串为null时使用
130+
/// </remarks>
131+
public const string PublicKeyStringCannotBeNull = "Encryption.Exceptions.PublicKeyStringCannotBeNull";
132+
133+
/// <summary>
134+
/// 公钥字符串不能为空的错误消息
135+
/// </summary>
136+
/// <remarks>
137+
/// 键名: Encryption.Exceptions.PublicKeyStringCannotBeEmpty
138+
/// 用途: 当SM2公钥字符串为空时使用
139+
/// </remarks>
140+
public const string PublicKeyStringCannotBeEmpty = "Encryption.Exceptions.PublicKeyStringCannotBeEmpty";
141+
142+
/// <summary>
143+
/// 私钥字符串不能为null的错误消息
144+
/// </summary>
145+
/// <remarks>
146+
/// 键名: Encryption.Exceptions.PrivateKeyStringCannotBeNull
147+
/// 用途: 当SM2私钥字符串为null时使用
148+
/// </remarks>
149+
public const string PrivateKeyStringCannotBeNull = "Encryption.Exceptions.PrivateKeyStringCannotBeNull";
150+
151+
/// <summary>
152+
/// 私钥字符串不能为空的错误消息
153+
/// </summary>
154+
/// <remarks>
155+
/// 键名: Encryption.Exceptions.PrivateKeyStringCannotBeEmpty
156+
/// 用途: 当SM2私钥字符串为空时使用
157+
/// </remarks>
158+
public const string PrivateKeyStringCannotBeEmpty = "Encryption.Exceptions.PrivateKeyStringCannotBeEmpty";
159+
160+
/// <summary>
161+
/// 公钥字节数组不能为null的错误消息
162+
/// </summary>
163+
/// <remarks>
164+
/// 键名: Encryption.Exceptions.PublicKeyByteArrayCannotBeNull
165+
/// 用途: 当SM2公钥字节数组为null时使用
166+
/// </remarks>
167+
public const string PublicKeyByteArrayCannotBeNull = "Encryption.Exceptions.PublicKeyByteArrayCannotBeNull";
168+
169+
/// <summary>
170+
/// 公钥字节数组不能为空的错误消息
171+
/// </summary>
172+
/// <remarks>
173+
/// 键名: Encryption.Exceptions.PublicKeyByteArrayCannotBeEmpty
174+
/// 用途: 当SM2公钥字节数组为空时使用
175+
/// </remarks>
176+
public const string PublicKeyByteArrayCannotBeEmpty = "Encryption.Exceptions.PublicKeyByteArrayCannotBeEmpty";
177+
178+
/// <summary>
179+
/// 私钥字节数组不能为null的错误消息
180+
/// </summary>
181+
/// <remarks>
182+
/// 键名: Encryption.Exceptions.PrivateKeyByteArrayCannotBeNull
183+
/// 用途: 当SM2私钥字节数组为null时使用
184+
/// </remarks>
185+
public const string PrivateKeyByteArrayCannotBeNull = "Encryption.Exceptions.PrivateKeyByteArrayCannotBeNull";
186+
187+
/// <summary>
188+
/// 私钥字节数组不能为空的错误消息
189+
/// </summary>
190+
/// <remarks>
191+
/// 键名: Encryption.Exceptions.PrivateKeyByteArrayCannotBeEmpty
192+
/// 用途: 当SM2私钥字节数组为空时使用
193+
/// </remarks>
194+
public const string PrivateKeyByteArrayCannotBeEmpty = "Encryption.Exceptions.PrivateKeyByteArrayCannotBeEmpty";
195+
196+
/// <summary>
197+
/// IV必须为32个字符的错误消息
198+
/// </summary>
199+
/// <remarks>
200+
/// 键名: Encryption.Exceptions.IVMustBe32Characters
201+
/// 用途: SM4算法要求IV为32个十六进制字符
202+
/// </remarks>
203+
public const string IVMustBe32Characters = "Encryption.Exceptions.IVMustBe32Characters";
204+
205+
/// <summary>
206+
/// IV必须为16个字符的错误消息
207+
/// </summary>
208+
/// <remarks>
209+
/// 键名: Encryption.Exceptions.IVMustBe16Characters
210+
/// 用途: SM4算法要求IV为16个十六进制字符
211+
/// </remarks>
212+
public const string IVMustBe16Characters = "Encryption.Exceptions.IVMustBe16Characters";
213+
}
214+
215+
/// <summary>
216+
/// 日志消息资源键
217+
/// </summary>
218+
public static class Logs
219+
{
220+
/// <summary>
221+
/// 加密操作完成的日志消息
222+
/// </summary>
223+
/// <remarks>
224+
/// 键名: Encryption.Logs.EncryptionCompleted
225+
/// 用途: 记录加密操作成功完成
226+
/// 参数: {0} - 算法名称, {1} - 数据长度
227+
/// </remarks>
228+
public const string EncryptionCompleted = "Encryption.Logs.EncryptionCompleted";
229+
230+
/// <summary>
231+
/// 解密操作完成的日志消息
232+
/// </summary>
233+
/// <remarks>
234+
/// 键名: Encryption.Logs.DecryptionCompleted
235+
/// 用途: 记录解密操作成功完成
236+
/// 参数: {0} - 算法名称, {1} - 数据长度
237+
/// </remarks>
238+
public const string DecryptionCompleted = "Encryption.Logs.DecryptionCompleted";
239+
240+
/// <summary>
241+
/// 密钥生成的日志消息
242+
/// </summary>
243+
/// <remarks>
244+
/// 键名: Encryption.Logs.KeyGenerated
245+
/// 用途: 记录密钥生成操作
246+
/// 参数: {0} - 算法名称, {1} - 密钥长度
247+
/// </remarks>
248+
public const string KeyGenerated = "Encryption.Logs.KeyGenerated";
249+
}
250+
251+
/// <summary>
252+
/// 状态消息资源键
253+
/// </summary>
254+
public static class Status
255+
{
256+
/// <summary>
257+
/// 加密算法初始化成功的状态消息
258+
/// </summary>
259+
/// <remarks>
260+
/// 键名: Encryption.Status.AlgorithmInitialized
261+
/// 用途: 表示加密算法初始化完成
262+
/// 参数: {0} - 算法名称
263+
/// </remarks>
264+
public const string AlgorithmInitialized = "Encryption.Status.AlgorithmInitialized";
265+
266+
/// <summary>
267+
/// 密钥验证成功的状态消息
268+
/// </summary>
269+
/// <remarks>
270+
/// 键名: Encryption.Status.KeyValidated
271+
/// 用途: 表示密钥验证通过
272+
/// 参数: {0} - 密钥长度, {1} - 算法要求
273+
/// </remarks>
274+
public const string KeyValidated = "Encryption.Status.KeyValidated";
275+
}
276+
277+
/// <summary>
278+
/// 验证消息资源键
279+
/// </summary>
280+
public static class Validation
281+
{
282+
/// <summary>
283+
/// 密钥格式验证失败的错误消息
284+
/// </summary>
285+
/// <remarks>
286+
/// 键名: Encryption.Validation.InvalidKeyFormat
287+
/// 用途: 当密钥格式不符合要求时使用
288+
/// 参数: {0} - 期望的格式
289+
/// </remarks>
290+
public const string InvalidKeyFormat = "Encryption.Validation.InvalidKeyFormat";
291+
292+
/// <summary>
293+
/// 数据长度验证失败的错误消息
294+
/// </summary>
295+
/// <remarks>
296+
/// 键名: Encryption.Validation.InvalidDataLength
297+
/// 用途: 当数据长度不符合算法要求时使用
298+
/// 参数: {0} - 实际长度, {1} - 期望长度
299+
/// </remarks>
300+
public const string InvalidDataLength = "Encryption.Validation.InvalidDataLength";
301+
}
302+
}

0 commit comments

Comments
 (0)