Skip to content

Commit 7bc7d49

Browse files
committed
[优化] DSA加密解密代码
1 parent 36dc8a7 commit 7bc7d49

1 file changed

Lines changed: 64 additions & 33 deletions

File tree

GameFrameX.Foundation.Encryption/DsaHelper.cs

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
namespace GameFrameX.Foundation.Encryption;
55

66
/// <summary>
7-
/// DSA 加密解密工具类
7+
/// DSA 数字签名算法工具类
8+
/// 提供了DSA数字签名的创建、签名和验证功能
9+
/// DSA算法专门用于数字签名,不能用于加密解密
810
/// </summary>
911
public sealed class DsaHelper
1012
{
@@ -13,18 +15,22 @@ public sealed class DsaHelper
1315
/// <summary>
1416
/// 使用现有的 DSACryptoServiceProvider 实例初始化 Dsa 类
1517
/// </summary>
16-
/// <param name="dsa">DSACryptoServiceProvider 实例</param>
18+
/// <param name="dsa">DSACryptoServiceProvider 实例,不能为null</param>
19+
/// <exception cref="ArgumentNullException">当dsa参数为null时抛出</exception>
1720
public DsaHelper(DSACryptoServiceProvider dsa)
1821
{
19-
_dsa = dsa;
22+
_dsa = dsa ?? throw new ArgumentNullException(nameof(dsa));
2023
}
2124

2225
/// <summary>
2326
/// 使用 XML 格式的密钥字符串初始化 Dsa 类
2427
/// </summary>
25-
/// <param name="key">XML 格式的密钥字符串</param>
28+
/// <param name="key">XML 格式的密钥字符串,可以是公钥或私钥</param>
29+
/// <exception cref="ArgumentException">当key参数为null或空时抛出</exception>
30+
/// <exception cref="CryptographicException">当密钥格式无效时抛出</exception>
2631
public DsaHelper(string key)
2732
{
33+
ArgumentException.ThrowIfNullOrEmpty(key, nameof(key));
2834
var dsa = new DSACryptoServiceProvider();
2935
dsa.FromXmlString(key);
3036
_dsa = dsa;
@@ -33,7 +39,9 @@ public DsaHelper(string key)
3339
/// <summary>
3440
/// 生成新的 DSA 密钥对,并以 XML 字符串形式返回
3541
/// </summary>
36-
/// <returns>包含私钥和公钥的字典</returns>
42+
/// <returns>包含私钥和公钥的字典,其中:
43+
/// - privatekey: 包含完整密钥信息的XML字符串
44+
/// - publickey: 仅包含公钥信息的XML字符串</returns>
3745
public static Dictionary<string, string> Make()
3846
{
3947
var dic = new Dictionary<string, string>();
@@ -46,13 +54,16 @@ public static Dictionary<string, string> Make()
4654
/// <summary>
4755
/// 使用私钥对数据进行签名
4856
/// </summary>
49-
/// <param name="dataToSign">要签名的数据字节数组</param>
50-
/// <param name="privateKey">XML 格式的私钥字符串</param>
51-
/// <returns>签名后的字节数组</returns>
57+
/// <param name="dataToSign">要签名的数据字节数组,不能为null</param>
58+
/// <param name="privateKey">XML 格式的私钥字符串,必须包含私钥信息</param>
59+
/// <returns>签名后的字节数组,如果签名过程出错则返回null</returns>
60+
/// <exception cref="ArgumentNullException">当参数为null时抛出</exception>
5261
public static byte[] SignData(byte[] dataToSign, string privateKey)
5362
{
5463
try
5564
{
65+
ArgumentNullException.ThrowIfNull(dataToSign, nameof(dataToSign));
66+
ArgumentNullException.ThrowIfNull(privateKey, nameof(privateKey));
5667
var dsa = new DSACryptoServiceProvider();
5768
dsa.FromXmlString(privateKey);
5869
return dsa.SignData(dataToSign);
@@ -66,24 +77,29 @@ public static byte[] SignData(byte[] dataToSign, string privateKey)
6677
/// <summary>
6778
/// 使用私钥对字符串数据进行签名,并返回 Base64 编码的签名字符串
6879
/// </summary>
69-
/// <param name="dataToSign">要签名的字符串数据</param>
70-
/// <param name="privateKey">XML 格式的私钥字符串</param>
71-
/// <returns>Base64 编码的签名字符串</returns>
80+
/// <param name="dataToSign">要签名的字符串数据,不能为null或空</param>
81+
/// <param name="privateKey">XML 格式的私钥字符串,必须包含私钥信息</param>
82+
/// <returns>Base64 编码的签名字符串,如果签名过程出错则返回null</returns>
83+
/// <exception cref="ArgumentNullException">当参数为null时抛出</exception>
7284
public static string SignData(string dataToSign, string privateKey)
7385
{
86+
ArgumentException.ThrowIfNullOrEmpty(dataToSign, nameof(dataToSign));
87+
7488
var res = SignData(Encoding.UTF8.GetBytes(dataToSign), privateKey);
75-
return Convert.ToBase64String(res);
89+
return res != null ? Convert.ToBase64String(res) : null;
7690
}
7791

7892
/// <summary>
7993
/// 使用实例化的 DSACryptoServiceProvider 对数据进行签名
8094
/// </summary>
81-
/// <param name="dataToSign">要签名的数据字节数组</param>
82-
/// <returns>签名后的字节数组</returns>
95+
/// <param name="dataToSign">要签名的数据字节数组,不能为null</param>
96+
/// <returns>签名后的字节数组,如果签名过程出错则返回null</returns>
97+
/// <exception cref="ArgumentNullException">当dataToSign为null时抛出</exception>
8398
public byte[] SignData(byte[] dataToSign)
8499
{
85100
try
86101
{
102+
ArgumentNullException.ThrowIfNull(dataToSign, nameof(dataToSign));
87103
return _dsa.SignData(dataToSign);
88104
}
89105
catch
@@ -95,27 +111,33 @@ public byte[] SignData(byte[] dataToSign)
95111
/// <summary>
96112
/// 使用实例化的 DSACryptoServiceProvider 对字符串数据进行签名,并返回 Base64 编码的签名字符串
97113
/// </summary>
98-
/// <param name="dataToSign">要签名的字符串数据</param>
99-
/// <returns>Base64 编码的签名字符串</returns>
114+
/// <param name="dataToSign">要签名的字符串数据,不能为null或空</param>
115+
/// <returns>Base64 编码的签名字符串,如果签名过程出错则返回null</returns>
116+
/// <exception cref="ArgumentNullException">当dataToSign为null或空时抛出</exception>
100117
public string SignData(string dataToSign)
101118
{
119+
ArgumentException.ThrowIfNullOrEmpty(dataToSign, nameof(dataToSign));
102120
var res = SignData(Encoding.UTF8.GetBytes(dataToSign));
103-
return Convert.ToBase64String(res);
121+
return res != null ? Convert.ToBase64String(res) : null;
104122
}
105123

106124
/// <summary>
107-
/// 使用私钥验证数据的签名
125+
/// 使用公钥验证数据的签名
108126
/// </summary>
109-
/// <param name="dataToVerify">要验证的数据字节数组</param>
110-
/// <param name="signedData">签名后的字节数组</param>
111-
/// <param name="privateKey">XML 格式的私钥字符串</param>
127+
/// <param name="dataToVerify">要验证的数据字节数组,不能为null</param>
128+
/// <param name="signedData">签名后的字节数组,不能为null</param>
129+
/// <param name="publicKey">XML 格式的公钥字符串</param>
112130
/// <returns>如果签名有效,返回 true;否则返回 false</returns>
113-
public static bool VerifyData(byte[] dataToVerify, byte[] signedData, string privateKey)
131+
/// <exception cref="ArgumentNullException">当任意参数为null时抛出</exception>
132+
public static bool VerifyData(byte[] dataToVerify, byte[] signedData, string publicKey)
114133
{
115134
try
116135
{
136+
ArgumentNullException.ThrowIfNull(dataToVerify, nameof(dataToVerify));
137+
ArgumentNullException.ThrowIfNull(signedData, nameof(signedData));
138+
ArgumentException.ThrowIfNullOrEmpty(publicKey, nameof(publicKey));
117139
var dsa = new DSACryptoServiceProvider();
118-
dsa.FromXmlString(privateKey);
140+
dsa.FromXmlString(publicKey);
119141
return dsa.VerifyData(dataToVerify, signedData);
120142
}
121143
catch
@@ -125,27 +147,33 @@ public static bool VerifyData(byte[] dataToVerify, byte[] signedData, string pri
125147
}
126148

127149
/// <summary>
128-
/// 使用私钥验证字符串数据的签名
150+
/// 使用公钥验证字符串数据的签名
129151
/// </summary>
130-
/// <param name="dataToVerify">要验证的字符串数据</param>
131-
/// <param name="signedData">Base64 编码的签名字符串</param>
132-
/// <param name="privateKey">XML 格式的私钥字符串</param>
152+
/// <param name="dataToVerify">要验证的字符串数据,不能为null或空</param>
153+
/// <param name="signedData">Base64 编码的签名字符串,不能为null或空</param>
154+
/// <param name="publicKey">XML 格式的公钥字符串</param>
133155
/// <returns>如果签名有效,返回 true;否则返回 false</returns>
134-
public static bool VerifyData(string dataToVerify, string signedData, string privateKey)
156+
/// <exception cref="ArgumentNullException">当任意参数为null或空时抛出</exception>
157+
public static bool VerifyData(string dataToVerify, string signedData, string publicKey)
135158
{
136-
return VerifyData(Encoding.UTF8.GetBytes(dataToVerify), Convert.FromBase64String(signedData), privateKey);
159+
ArgumentException.ThrowIfNullOrEmpty(dataToVerify, nameof(dataToVerify));
160+
ArgumentException.ThrowIfNullOrEmpty(signedData, nameof(signedData));
161+
return VerifyData(Encoding.UTF8.GetBytes(dataToVerify), Convert.FromBase64String(signedData), publicKey);
137162
}
138163

139164
/// <summary>
140165
/// 使用实例化的 DSACryptoServiceProvider 验证数据的签名
141166
/// </summary>
142-
/// <param name="dataToVerify">要验证的数据字节数组</param>
143-
/// <param name="signedData">签名后的字节数组</param>
167+
/// <param name="dataToVerify">要验证的数据字节数组,不能为null</param>
168+
/// <param name="signedData">签名后的字节数组,不能为null</param>
144169
/// <returns>如果签名有效,返回 true;否则返回 false</returns>
170+
/// <exception cref="ArgumentNullException">当任意参数为null时抛出</exception>
145171
public bool VerifyData(byte[] dataToVerify, byte[] signedData)
146172
{
147173
try
148174
{
175+
ArgumentNullException.ThrowIfNull(dataToVerify, nameof(dataToVerify));
176+
ArgumentNullException.ThrowIfNull(signedData, nameof(signedData));
149177
return _dsa.VerifyData(dataToVerify, signedData);
150178
}
151179
catch
@@ -157,13 +185,16 @@ public bool VerifyData(byte[] dataToVerify, byte[] signedData)
157185
/// <summary>
158186
/// 使用实例化的 DSACryptoServiceProvider 验证字符串数据的签名
159187
/// </summary>
160-
/// <param name="dataToVerify">要验证的字符串数据</param>
161-
/// <param name="signedData">Base64 编码的签名字符串</param>
188+
/// <param name="dataToVerify">要验证的字符串数据,不能为null或空</param>
189+
/// <param name="signedData">Base64 编码的签名字符串,不能为null或空</param>
162190
/// <returns>如果签名有效,返回 true;否则返回 false</returns>
191+
/// <exception cref="ArgumentNullException">当任意参数为null或空时抛出</exception>
163192
public bool VerifyData(string dataToVerify, string signedData)
164193
{
165194
try
166195
{
196+
ArgumentException.ThrowIfNullOrEmpty(dataToVerify, nameof(dataToVerify));
197+
ArgumentException.ThrowIfNullOrEmpty(signedData, nameof(signedData));
167198
return VerifyData(Encoding.UTF8.GetBytes(dataToVerify), Convert.FromBase64String(signedData));
168199
}
169200
catch

0 commit comments

Comments
 (0)