-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRSA.cs
146 lines (126 loc) · 3.72 KB
/
RSA.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System.Security.Cryptography;
using System.Xml.Serialization;
using System.Text;
namespace Cryptography
{
class RSA
{
public RSACryptoServiceProvider? RSACSP = null;
public RSAParameters? RSAPrivateKey = null;
public RSAParameters? RSAPublicKey = null;
public Encoding DefaultEncoding = Encoding.Unicode;
public RSA(int keySize = 4096)
{
try
{
RSACSP = new(keySize);
RSAPrivateKey = RSACSP.ExportParameters(true);
RSAPublicKey = RSACSP.ExportParameters(false);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public byte[]? Encrypt(byte[] data, bool doOAEPPadding = true)
{
if (RSACSP == null || RSAPublicKey == null)
{
return null;
}
try
{
RSACSP.ImportParameters((RSAParameters)RSAPublicKey);
return RSACSP.Encrypt(data, doOAEPPadding);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
public byte[]? EncryptAsString(string data, bool doOAEPPadding = true)
{
try
{
return Encrypt(DefaultEncoding.GetBytes(data), doOAEPPadding);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
public byte[]? Decrypt(byte[] data, bool doOAEPPadding = true)
{
if (RSACSP == null || RSAPrivateKey == null)
{
return null;
}
try
{
RSACSP.ImportParameters((RSAParameters)RSAPrivateKey);
return RSACSP.Decrypt(data, doOAEPPadding);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
public string DecryptAsString(byte[] data, bool doOAEPPadding = true)
{
var dataAsBytes = Decrypt(data, doOAEPPadding);
if (dataAsBytes == null)
{
return "";
}
try
{
return DefaultEncoding.GetString(dataAsBytes);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return "";
}
}
private string GetKey(bool publicKey = true)
{
try
{
StringWriter stringWriter = new();
XmlSerializer xmlSerializer = new(typeof(RSAParameters));
xmlSerializer.Serialize(stringWriter, (publicKey ? RSAPublicKey : RSAPrivateKey));
return stringWriter.ToString();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return "";
}
}
public string GetKeyPublicAsString()
{
return GetKey();
}
public string GetKeyPrivateAsString()
{
return GetKey(false);
}
public static RSAParameters? StringToKeys(string str)
{
try
{
StringReader stringReader = new(str);
XmlSerializer xmlSerializer = new(typeof(RSAParameters));
return (RSAParameters?)xmlSerializer.Deserialize(stringReader);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
}
}