@@ -6,62 +6,22 @@ namespace com.github.xiangyuecn.rsacsharp {
6
6
/// GitHub: https://github.com/xiangyuecn/RSA-csharp
7
7
/// </summary>
8
8
class Program {
9
- static void RSA_ForCoreTest ( bool fast ) {
10
- Console . WriteLine ( hr ) ;
11
- Console . WriteLine ( ht + " RSA_ForCoreTest:仅限.NET Core下可测试 " + ht ) ;
12
- Console . WriteLine ( hr ) ;
13
-
14
- Console . WriteLine ( "RSA_ForCore:只支持.NET Core环境,可跨平台使用。如需在.NET Framework中使用,请用RSA_ForWindows(也支持.NET Core,但只能Windows系统中使用)。" ) ;
15
- Console . WriteLine ( ) ;
16
- if ( ! RSA_ForCore . IS_CORE ) {
17
- Console . WriteLine ( "非.NET Core环境,不测试!" ) ;
18
- return ;
19
- }
20
-
9
+ static void RSATest ( bool fast ) {
21
10
//新生成一个RSA密钥,也可以通过已有的pem、xml文本密钥来创建RSA
22
- var rsa = new RSA_ForCore ( 512 ) ;
23
- // var rsa = new RSA_ForCore("pem或xml文本密钥");
24
- // var rsa = new RSA_ForCore(RSA_PEM.FromPEM("pem文本密钥"));
25
- // var rsa = new RSA_ForCore(RSA_PEM.FromXML("xml文本密钥"));
26
-
27
- ForXxxxxxTest ( rsa , fast ) ;
28
- }
29
- static void RSA_ForWindowsTest ( bool fast ) {
30
- Console . WriteLine ( hr ) ;
31
- Console . WriteLine ( ht + " RSA_ForWindowsTest:仅限Windows系统可测试 " + ht ) ;
32
- Console . WriteLine ( hr ) ;
33
-
34
- Console . WriteLine ( "RSA_ForWindows:.NET Core、.NET Framework均可用,但由于使用的RSACryptoServiceProvider不支持跨平台,只支持在Windows系统中使用,要跨平台请使用仅支持.NET Core的RSA_ForCore。" ) ;
35
- Console . WriteLine ( ) ;
36
- if ( ! isWindows ) {
37
- Console . WriteLine ( "非Windows系统,不测试!" ) ;
38
- return ;
39
- }
40
-
41
- //新生成一个RSA密钥,也可以通过已有的pem、xml文本密钥来创建RSA
42
- var rsa = new RSA_ForWindows ( 512 ) ;
43
- // var rsa = new RSA_ForWindows("pem或xml文本密钥");
44
- // var rsa = new RSA_ForWindows(RSA_PEM.FromPEM("pem文本密钥"));
45
- // var rsa = new RSA_ForWindows(RSA_PEM.FromXML("xml文本密钥"));
46
-
47
- ForXxxxxxTest ( rsa , fast ) ;
48
- }
11
+ var rsa = new RSA_Util ( 512 ) ;
12
+ // var rsa = new RSA_Util("pem或xml文本密钥");
13
+ // var rsa = new RSA_Util(RSA_PEM.FromPEM("pem文本密钥"));
14
+ // var rsa = new RSA_Util(RSA_PEM.FromXML("xml文本密钥"));
49
15
50
-
51
-
52
- static void ForXxxxxxTest ( dynamic forXxxxxx , bool fast ) {
53
- dynamic rsa = forXxxxxx ;
54
- //两种rsa都有相同的方法,为什么没有抽象类,因为懒,实际使用应当有明确的类型,就像下面两行,解开注释就能恢复正常
55
- // RSA_ForWindows rsa = (RSA_ForWindows)forXxxxxx;
56
- // RSA_ForCore rsa = (RSA_ForCore)forXxxxxx;
16
+ if ( ! checkPlatform ( rsa ) ) return ;
57
17
58
18
//提取密钥pem字符串
59
19
string pem_pkcs1 = rsa . ToPEM ( ) . ToPEM_PKCS1 ( ) ;
60
20
string pem_pkcs8 = rsa . ToPEM ( ) . ToPEM_PKCS8 ( ) ;
61
21
//提取密钥xml字符串
62
22
string xml = rsa . ToXML ( ) ;
63
23
64
- Console . WriteLine ( "【" + rsa . KeySize + "私钥(XML)】:" ) ;
24
+ AssertMsg ( "【" + rsa . KeySize + "私钥(XML)】:" , rsa . KeySize == 512 ) ;
65
25
Console . WriteLine ( xml ) ;
66
26
Console . WriteLine ( ) ;
67
27
Console . WriteLine ( "【" + rsa . KeySize + "私钥(PKCS#1)】:" ) ;
@@ -93,14 +53,14 @@ static void ForXxxxxxTest(dynamic forXxxxxx, bool fast) {
93
53
Console . WriteLine ( ) ;
94
54
95
55
//用pem文本创建RSA
96
- var rsa2 = new RSA_ForWindows ( RSA_PEM . FromPEM ( pem_pkcs8 ) ) ;
56
+ var rsa2 = new RSA_Util ( RSA_PEM . FromPEM ( pem_pkcs8 ) ) ;
97
57
Console . WriteLine ( "【用PEM新创建的RSA是否和上面的一致】:" ) ;
98
58
Assert ( "XML:" , rsa2 . ToXML ( ) == rsa . ToXML ( ) ) ;
99
59
Assert ( "PKCS1:" , rsa2 . ToPEM ( ) . ToPEM_PKCS1 ( ) == rsa . ToPEM ( ) . ToPEM_PKCS1 ( ) ) ;
100
60
Assert ( "PKCS8:" , rsa2 . ToPEM ( ) . ToPEM_PKCS8 ( ) == rsa . ToPEM ( ) . ToPEM_PKCS8 ( ) ) ;
101
61
102
62
//用xml文本创建RSA
103
- var rsa3 = new RSA_ForWindows ( RSA_PEM . FromXML ( xml ) ) ;
63
+ var rsa3 = new RSA_Util ( RSA_PEM . FromXML ( xml ) ) ;
104
64
Console . WriteLine ( "【用XML新创建的RSA是否和上面的一致】:" ) ;
105
65
Assert ( "XML:" , rsa3 . ToXML ( ) == rsa . ToXML ( ) ) ;
106
66
Assert ( "PKCS1:" , rsa3 . ToPEM ( ) . ToPEM_PKCS1 ( ) == rsa . ToPEM ( ) . ToPEM_PKCS1 ( ) ) ;
@@ -121,7 +81,7 @@ static void ForXxxxxxTest(dynamic forXxxxxx, bool fast) {
121
81
}
122
82
//--------RSA_PEM公钥验证---------
123
83
{
124
- var rsaPublic = new RSA_ForWindows ( rsa . ToPEM ( true ) ) ;
84
+ var rsaPublic = new RSA_Util ( rsa . ToPEM ( true ) ) ;
125
85
RSA_PEM pem = rsaPublic . ToPEM ( ) ;
126
86
Console . WriteLine ( "【RSA_PEM仅公钥是否和原始RSA一致】:" ) ;
127
87
Console . WriteLine ( pem . KeySize + "位" ) ;
@@ -132,7 +92,7 @@ static void ForXxxxxxTest(dynamic forXxxxxx, bool fast) {
132
92
133
93
if ( ! fast ) {
134
94
RSA_PEM pem = rsa . ToPEM ( ) ;
135
- var rsa4 = new RSA_ForWindows ( new RSA_PEM ( pem . Key_Modulus , pem . Key_Exponent , pem . Key_D ) ) ;
95
+ var rsa4 = new RSA_Util ( new RSA_PEM ( pem . Key_Modulus , pem . Key_Exponent , pem . Key_D ) ) ;
136
96
Console . WriteLine ( "【用n、e、d构造解密】" ) ;
137
97
de = rsa4 . DecodeOrNull ( en ) ;
138
98
AssertMsg ( de , de == str ) ;
@@ -159,28 +119,55 @@ static void AssertMsg(string msg, bool check) {
159
119
Console . WriteLine ( msg ) ;
160
120
}
161
121
162
- static readonly string ht = "◆◆◆◆◆◆◆◆◆◆◆◆" ;
163
- static readonly string hr = "---------------------------------------------------------" ;
164
- static bool isWindows = true ;
165
- static void Main ( string [ ] _ ) {
122
+ static bool checkPlatform ( RSA_Util rsa ) {
123
+ Console . WriteLine ( hr ) ;
124
+ Console . WriteLine ( ht + " "
125
+ + ( RSA_Util . UseCore == RSA_Util . IS_CORE ? "【默认RSA实现】" : "【强制切换RSA实现类】" )
126
+ + "当前RSA实现类:" + rsa . RSAObject . GetType ( ) . Name
127
+ + " " + ht ) ;
128
+ Console . WriteLine ( hr ) ;
129
+ if ( RSA_Util . UseCore == RSA_Util . IS_CORE ) {
130
+ return true ;
131
+ }
132
+
133
+
134
+ var isWindows = true ;
166
135
#if ( NETCOREAPP || NETSTANDARD || NET ) //https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives
167
136
if ( ! System . Runtime . InteropServices . RuntimeInformation . IsOSPlatform ( System . Runtime . InteropServices . OSPlatform . Windows ) ) {
168
137
isWindows = false ;
169
138
}
170
139
#endif
171
140
172
- //for (var i = 0; i < 1000; i++) { Console.WriteLine("第"+i+"次>>>>>"); RSA_ForCoreTest(true); RSA_ForWindowsTest(true); }
141
+ //强制切换了RSA实现类,检查一下是否支持
142
+ if ( ! rsa . RSAIsUseCore ) { // RSACryptoServiceProvider实现类
143
+ if ( ! isWindows ) {
144
+ Console . WriteLine ( "强制切换了RSA实现类,当前使用的RSACryptoServiceProvider不支持跨平台,只支持在Windows系统中使用。" ) ;
145
+ Console . WriteLine ( "非Windows系统,不测试!" ) ;
146
+ return false ;
147
+ }
148
+ }
149
+ return true ;
150
+ }
151
+
152
+ static readonly string ht = "◆◆◆◆◆◆◆◆◆◆◆◆" ;
153
+ static readonly string hr = "---------------------------------------------------------" ;
154
+ static void Main ( string [ ] _ ) {
155
+ long startTime = DateTime . Now . Ticks ;
156
+
157
+ // for (var i = 0; i < 1000; i++) { Console.WriteLine("第" + i + "次>>>>>"); RSA_Util.UseCore = !RSA_Util.IS_CORE; RSATest(true); RSA_Util.UseCore = RSA_Util.IS_CORE; RSATest(true); }
173
158
174
- RSA_ForCoreTest ( false ) ;
159
+ RSATest ( false ) ;
175
160
176
161
Console . WriteLine ( hr ) ;
177
162
Console . WriteLine ( ) ;
178
163
179
- RSA_ForWindowsTest ( false ) ;
164
+ // 强制切换一下RSA实现类进行测试
165
+ RSA_Util . UseCore = ! RSA_Util . IS_CORE ;
166
+ RSATest ( false ) ;
180
167
Console . WriteLine ( ) ;
181
168
182
169
Console . WriteLine ( hr ) ;
183
- Console . WriteLine ( ht + " 回车退出... " + ht ) ;
170
+ Console . WriteLine ( ht + " 耗时:" + ( DateTime . Now . Ticks - startTime ) / 10000 + "ms 回车退出... " + ht ) ;
184
171
Console . WriteLine ( hr ) ;
185
172
Console . WriteLine ( ) ;
186
173
Console . ReadLine ( ) ;
0 commit comments