using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Threading.Tasks; namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt { public class RSAHelper { /// <summary> /// 从本地文件中读取用来签发 Token 的 RSA Key /// </summary> /// <param name="filePath">存放密钥的文件夹路径</param> /// <param name="withPrivate"></param> /// <param name="keyParameters"></param> /// <returns></returns> public static bool TryGetKeyParameters(string filePath, bool withPrivate, out RSAParameters keyParameters) { string filename = withPrivate ? "key.json" : "key.public.json"; string fileTotalPath = Path.Combine(filePath, filename); keyParameters = default(RSAParameters); if (!File.Exists(fileTotalPath)) { return false; } else { keyParameters = JsonConvert.DeserializeObject<RSAParameters>(File.ReadAllText(fileTotalPath)); return true; } } /// <summary> /// 生成并保存 RSA 公钥与私钥 /// </summary> /// <param name="filePath"></param> /// <param name="withPrivate"></param> /// <returns></returns> public static RSAParameters GenerateAndSaveKey(string filePath, bool withPrivate = true) { RSAParameters publicKeys, privateKeys; using (var rsa = new RSACryptoServiceProvider(2048))//即时生成 { try { privateKeys = rsa.ExportParameters(true); publicKeys = rsa.ExportParameters(false); } finally { rsa.PersistKeyInCsp = false; } } File.WriteAllText(Path.Combine(filePath, "key.json"), JsonConvert.SerializeObject(privateKeys)); File.WriteAllText(Path.Combine(filePath, "key.public.json"), JsonConvert.SerializeObject(publicKeys)); return withPrivate ? privateKeys : publicKeys; } } }