mh_jy_safe/APT.Utility/RSAHelper.cs
2025-08-25 09:56:57 +08:00

163 lines
6.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace APT.Utility
{
public static class RSAHelper
{
public static (byte[] PublicKey, byte[] PrivateKey) GenerateRsaKeysByte()
{
using var rsa = RSA.Create(2048); // 推荐2048位密钥
var privateKey = rsa.ExportRSAPrivateKey();// rsa.ExportRSAPrivateKeyPem(); // 私钥PEM格式
var publicKey = rsa.ExportRSAPublicKey();//.ExportRSAPublicKeyPem(); // 公钥PEM格式
return (publicKey, privateKey);
}
public static (string PublicKey, string PrivateKey) GenerateRsaKeys()
{
// 推荐2048位密钥
using var rsa = RSA.Create(2048);
//var privateKey = Encoding.UTF8.GetString(rsa.ExportRSAPrivateKey());// 私钥PEM格式
//var publicKey = Encoding.UTF8.GetString(rsa.ExportRSAPublicKey()); // 公钥PEM格式
var privateKey = rsa.ExportRSAPrivateKeyPem();
var publicKey = rsa.ExportRSAPublicKeyPem();
//签名
byte[] dataBytes = Encoding.UTF8.GetBytes("13245");
byte[] signatureBytes = rsa.SignData(
dataBytes,
HashAlgorithmName.SHA256, // 推荐SHA256
RSASignaturePadding.Pkcs1 //.Pkcs1 // 或RSASignaturePadding.Pss
);
string strSignData = Convert.ToBase64String(signatureBytes);
// //验证 true
// byte[] dataBytes2 = Encoding.UTF8.GetBytes(strSignData);
// byte[] signatureBytes2 = Encoding.UTF8.GetBytes("13245");
// var rrr = rsa.VerifyData(
// dataBytes2,
// signatureBytes2,
// HashAlgorithmName.SHA256,
// RSASignaturePadding.Pkcs1 //.Pkcs1 // 必须与签名时一致
//);
// //验证 false
// byte[] signatureBytes3 = Encoding.UTF8.GetBytes("1324235");
// var rrr3 = rsa.VerifyData(
// dataBytes2,
// signatureBytes3,
// HashAlgorithmName.SHA256,
// RSASignaturePadding.Pkcs1 // 必须与签名时一致
//);
return (publicKey, privateKey);
}
/// <summary>
/// 使用RSA私钥对数据进行签名
/// </summary>
public static byte[] SignData(byte[] data, string privateKey)
{
using (var rsa = RSA.Create())
{
rsa.FromXmlString(privateKey);
// 使用SHA256作为哈希算法PKCS#1 v1.5填充模式
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
}
/// <summary>
/// 使用RSA公钥验证签名
/// </summary>
public static bool VerifyData(byte[] data, byte[] signature, string publicKey)
{
using (var rsa = RSA.Create())
{
rsa.FromXmlString(publicKey);
return rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
}
public static string ExportPublicKeyPem(this RSA rsa)
{
var exported = rsa.ExportSubjectPublicKeyInfo();
return $"-----BEGIN PUBLIC KEY-----\n{Convert.ToBase64String(exported, Base64FormattingOptions.InsertLineBreaks)}\n-----END PUBLIC KEY-----";
}
public static string ExportPrivateKeyPem(this RSA rsa)
{
var exported = rsa.ExportPkcs8PrivateKey();
return $"-----BEGIN PRIVATE KEY-----\n{Convert.ToBase64String(exported, Base64FormattingOptions.InsertLineBreaks)}\n-----END PRIVATE KEY-----";
}
public static void ImportPublicKeyPem(this RSA rsa, string pem)
{
var base64 = pem.Replace("-----BEGIN PUBLIC KEY-----", "")
.Replace("-----END PUBLIC KEY-----", "")
.Replace("\n", "");
var bytes = Convert.FromBase64String(base64);
rsa.ImportSubjectPublicKeyInfo(bytes, out _);
}
public static void ImportPrivateKeyPem(this RSA rsa, string pem)
{
var base64 = pem.Replace("-----BEGIN PRIVATE KEY-----", "")
.Replace("-----END PRIVATE KEY-----", "")
.Replace("\n", "");
var bytes = Convert.FromBase64String(base64);
rsa.ImportPkcs8PrivateKey(bytes, out _);
}
/// <summary>
/// 扩展方法导出PEM格式的私钥
/// </summary>
/// <param name="rsa"></param>
/// <returns></returns>
public static string ExportRSAPrivateKeyPem(this RSA rsa)
{
var privateKey = rsa.ExportRSAPrivateKey();
//return Convert.ToBase64String(privateKey, Base64FormattingOptions.InsertLineBreaks);
return Encoding.UTF8.GetString(privateKey);
//return "-----BEGIN PRIVATE KEY-----\n" +
// Encoding.UTF8.GetString(privateKey)
// //Convert.ToBase64String(privateKey, Base64FormattingOptions.InsertLineBreaks)
// + "\n-----END PRIVATE KEY-----";
//return "-----BEGIN PRIVATE KEY-----" +
// Encoding.UTF8.GetString(privateKey)
// //Convert.ToBase64String(privateKey, Base64FormattingOptions.InsertLineBreaks)
// + "-----END PRIVATE KEY-----";
}
/// <summary>
/// 扩展方法导出PEM格式的公钥
/// </summary>
/// <param name="rsa"></param>
/// <returns></returns>
public static string ExportRSAPublicKeyPem(this RSA rsa)
{
var publicKey = rsa.ExportRSAPublicKey();
//return Convert.ToBase64String(publicKey, Base64FormattingOptions.InsertLineBreaks);
return Encoding.UTF8.GetString(publicKey);
//return "-----BEGIN PUBLIC KEY-----\n" +
// Encoding.UTF8.GetString(publicKey)
// //Convert.ToBase64String(publicKey, Base64FormattingOptions.InsertLineBreaks)
// + "\n-----END PUBLIC KEY-----";
//return "-----BEGIN PUBLIC KEY-----" +
// Encoding.UTF8.GetString(publicKey)
// //Convert.ToBase64String(publicKey, Base64FormattingOptions.InsertLineBreaks)
// + "-----END PUBLIC KEY-----";
}
}
}