using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using WX.CRM.Common;
namespace WX.CRM.BLL.Util
{
public class MSecurityHelper
{
public MSecurityHelper()
{
}
///
/// 内容根据公钥加密
///
///
///
public string content(string plainText, string publicKeyXml)
{
//string publicKeyXml = PemToXml(publicKey, false);
// 创建 RSA 实例
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKeyXml);
// 将明文转换为字节数组
var plainBytes = Encoding.UTF8.GetBytes(plainText);
// 使用公钥加密
var encryptedBytes = rsa.Encrypt(plainBytes, false);
// 将加密后的字节数组转换为 Base64 字符串
var encryptedText = Convert.ToBase64String(encryptedBytes);
return encryptedText;
}
}
///
/// 根据加密内容 私钥 生成签名
///
///
///
public string sign(string content, string privateKeyXml)
{
//string privateKeyXml = PemToXml(privateKey, true);
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKeyXml);
//签名返回
using (var sha256 = new SHA256CryptoServiceProvider())
{
var signData = rsa.SignData(Encoding.UTF8.GetBytes(content), sha256);
return Convert.ToBase64String(signData);
}
}
///
/// 根据私钥解密出key
///
///
///
public string decyptContent(string plainText, string privateKeyXml)
{
//string privateKeyXml = PemToXml(privateKey, true);
// 创建 RSA 实例
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKeyXml);
// 将明文转换为字节数组
var plainBytes = Convert.FromBase64String(plainText);
// 使用公钥加密
var encryptedBytes = rsa.Decrypt(plainBytes, false);
Encoding encoding = Encoding.UTF8; // 使用UTF-8编码方式
string str = encoding.GetString(encryptedBytes);
return str.ToString();
}
}
///
/// 根据公钥验证签名
///
///
///
///
public string decyptSign(string sign, string content, string publicKeyXml, string privateKeyXml)
{
//string publicKeyXml = PemToXml(publicKey, false);
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKeyXml);
//签名返回
using (var sha256 = new SHA256CryptoServiceProvider())
{
var cipherbytes = rsa.VerifyData(Encoding.UTF8.GetBytes(content), sha256, Convert.FromBase64String(sign));
if (cipherbytes)
{
return decyptContent(content, privateKeyXml);
}
throw new Exception("验证参数失败");
}
}
///
/// Pem格式密钥转换成Xml格式密钥
///
/// Pem格式密钥(公钥或私钥)
/// 是否是私钥
/// 转换后的Xml格式密钥(公钥或私钥)
public string PemToXml(string pemKey, bool isPrivateKey)
{
string rsaKey = string.Empty;
object pemObject = null;
RSAParameters rsaPara = new RSAParameters();
using (StringReader sReader = new StringReader(pemKey))
{
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(sReader);
pemObject = pemReader.ReadObject();
}
//私钥
if (isPrivateKey)
{
RsaPrivateCrtKeyParameters key = (RsaPrivateCrtKeyParameters)((AsymmetricCipherKeyPair)pemObject).Private;
rsaPara = new RSAParameters
{
Modulus = key.Modulus.ToByteArrayUnsigned(),
Exponent = key.PublicExponent.ToByteArrayUnsigned(),
D = key.Exponent.ToByteArrayUnsigned(),
P = key.P.ToByteArrayUnsigned(),
Q = key.Q.ToByteArrayUnsigned(),
DP = key.DP.ToByteArrayUnsigned(),
DQ = key.DQ.ToByteArrayUnsigned(),
InverseQ = key.QInv.ToByteArrayUnsigned(),
};
}
//公钥
else
{
RsaKeyParameters key = (RsaKeyParameters)pemObject;
rsaPara = new RSAParameters
{
Modulus = key.Modulus.ToByteArrayUnsigned(),
Exponent = key.Exponent.ToByteArrayUnsigned(),
};
}
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaPara);
using (StringWriter sw = new StringWriter())
{
sw.Write(rsa.ToXmlString(isPrivateKey ? true : false));
rsaKey = sw.ToString();
}
return rsaKey;
}
}
public class SignReturnData
{
public string content { get; set; }
public string sign { get; set; }
}
public class MidData
{
public int? code { get; set; }
public string data { get; set; }
public string message { get; set; }
}
}