Repository navigation
Expand file tree
/
Copy pathRsaKeyExtensions.cs
More file actions
137 lines (123 loc) · 6.8 KB
/
Copy pathRsaKeyExtensions.cs
File metadata and controls
137 lines (123 loc) · 6.8 KB
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.Xml;
using Newtonsoft.Json;
using NETCore.Encrypt.Shared;
using NETCore.Encrypt.Internal;
namespace NETCore.Encrypt.Extensions.Internal
{
/// <summary>
/// RSA参数格式化扩展
/// </summary>
internal static class RSAKeyExtensions
{
#region JSON
/// <summary>
/// RSA导入key
/// </summary>
/// <param name="rsa">RSA实例<see cref="RSA"/></param>
/// <param name="jsonString">RSA的Key序列化JSON字符串</param>
internal static void FromJsonString(this RSA rsa, string jsonString)
{
Check.Argument.IsNotEmpty(jsonString, nameof(jsonString));
RSAParameters parameters = new RSAParameters();
try
{
var paramsJson = JsonConvert.DeserializeObject<RSAParametersJson>(jsonString);
parameters.Modulus = paramsJson.Modulus != null ? Convert.FromBase64String(paramsJson.Modulus) : null;
parameters.Exponent = paramsJson.Exponent != null ? Convert.FromBase64String(paramsJson.Exponent) : null;
parameters.P = paramsJson.P != null ? Convert.FromBase64String(paramsJson.P) : null;
parameters.Q = paramsJson.Q != null ? Convert.FromBase64String(paramsJson.Q) : null;
parameters.DP = paramsJson.DP != null ? Convert.FromBase64String(paramsJson.DP) : null;
parameters.DQ = paramsJson.DQ != null ? Convert.FromBase64String(paramsJson.DQ) : null;
parameters.InverseQ = paramsJson.InverseQ != null ? Convert.FromBase64String(paramsJson.InverseQ) : null;
parameters.D = paramsJson.D != null ? Convert.FromBase64String(paramsJson.D) : null;
}
catch
{
throw new Exception("Invalid Json RSA key.");
}
rsa.ImportParameters(parameters);
}
/// <summary>
/// 获取RSA Key序列化Json
/// </summary>
/// <param name="rsa">RSA实例<see cref="RSA"/></param>
/// <param name="includePrivateParameters">是否包含私钥</param>
/// <returns></returns>
internal static string ToJsonString(this RSA rsa, bool includePrivateParameters)
{
RSAParameters parameters = rsa.ExportParameters(includePrivateParameters);
var parasJson = new RSAParametersJson()
{
Modulus = parameters.Modulus != null ? Convert.ToBase64String(parameters.Modulus) : null,
Exponent = parameters.Exponent != null ? Convert.ToBase64String(parameters.Exponent) : null,
P = parameters.P != null ? Convert.ToBase64String(parameters.P) : null,
Q = parameters.Q != null ? Convert.ToBase64String(parameters.Q) : null,
DP = parameters.DP != null ? Convert.ToBase64String(parameters.DP) : null,
DQ = parameters.DQ != null ? Convert.ToBase64String(parameters.DQ) : null,
InverseQ = parameters.InverseQ != null ? Convert.ToBase64String(parameters.InverseQ) : null,
D = parameters.D != null ? Convert.ToBase64String(parameters.D) : null
};
return JsonConvert.SerializeObject(parasJson);
}
#endregion
#region XML
/// <summary>
/// RSA导入key
/// </summary>
/// <param name="rsa">RSA实例<see cref="RSA"/></param>
/// <param name="jsonString">RSA的Key序列化XML字符串</param>
public static void FromLvccXmlString(this RSA rsa, string xmlString)
{
RSAParameters parameters = new RSAParameters();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
{
foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
{
switch (node.Name)
{
case "Modulus": parameters.Modulus = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "Exponent": parameters.Exponent = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "P": parameters.P = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "Q": parameters.Q = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "DP": parameters.DP = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "DQ": parameters.DQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "InverseQ": parameters.InverseQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "D": parameters.D = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
}
}
}
else
{
throw new Exception("Invalid XML RSA key.");
}
rsa.ImportParameters(parameters);
}
/// <summary>
/// 获取RSA Key序列化XML
/// </summary>
/// <param name="rsa">RSA实例<see cref="RSA"/></param>
/// <param name="includePrivateParameters">是否包含私钥</param>
/// <returns></returns>
public static string ToLvccXmlString(this RSA rsa, bool includePrivateParameters)
{
RSAParameters parameters = rsa.ExportParameters(includePrivateParameters);
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
parameters.Modulus != null ? Convert.ToBase64String(parameters.Modulus) : null,
parameters.Exponent != null ? Convert.ToBase64String(parameters.Exponent) : null,
parameters.P != null ? Convert.ToBase64String(parameters.P) : null,
parameters.Q != null ? Convert.ToBase64String(parameters.Q) : null,
parameters.DP != null ? Convert.ToBase64String(parameters.DP) : null,
parameters.DQ != null ? Convert.ToBase64String(parameters.DQ) : null,
parameters.InverseQ != null ? Convert.ToBase64String(parameters.InverseQ) : null,
parameters.D != null ? Convert.ToBase64String(parameters.D) : null);
}
#endregion
}
}