44namespace GameFrameX . Foundation . Encryption ;
55
66/// <summary>
7- /// DSA 加密解密工具类
7+ /// DSA 数字签名算法工具类
8+ /// 提供了DSA数字签名的创建、签名和验证功能
9+ /// DSA算法专门用于数字签名,不能用于加密解密
810/// </summary>
911public 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