//需要添加BouncyCastle引用
public class RSAEncryptAndDecrypt
{
public static bool Login()
{
try
{
string userpwd = "a123456";
string publickey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCicdRcD669oTrlnnqQL6GD8pbnMjgOW2zUAA2qvRn+IQ7QtkPtCYzbdxSEomg8M49zMYZLb3547IPTAmBJw3PDgHiSFgHSWDq851N8eQgi6vWuDI+X+/1nxJ84rlM2c0GGOU761GQDll1vUxuFEORpJg6/MCyluBOEfkvLcMN5YwIDAQAB";
string privatekey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKJx1FwPrr2hOuWeepAvoYPylucyOA5bbNQADaq9Gf4hDtC2Q+0JjNt3FISiaDwzj3Mxhktvfnjsg9MCYEnDc8OAeJIWAdJYOrznU3x5CCLq9a4Mj5f7/WfEnziuUzZzQYY5TvrUZAOWXW9TG4UQ5GkmDr8wLKW4E4R+S8tww3ljAgMBAAECgYEAhuB6kWHYFc1cCLF4VGWn9tWipB4XWxxgFPpiXqSag13RXkwnxBWM5eBOof3zDCFHdz7koZfWa/L9VWOArV5iq9J86okA7KEPygO9Jkk582JKKDD7TQsxxPvnaYAonGPXmrVBg3RGHxsVGXj9KLuLsDUdzHOUADyZbPyBHkeuB/kCQQD//498ZgeWy/x8Bqc2hS5vs1hvksAWNkEexmO253J8BZdffcM5MCsFu3/lWvFcBKaoNdv10IrNr97evICBW3v9AkEAonIbwX3rbJ8AYojjD7EGLdLlCCfirs94+F963JEQyOh4mNiMXqlFRw58ey5NpuZDO8VzRqCRL5+eRml82NnY3wJANIq0XXjnd9jYMnB/I16EYGKz9PpuuGBcTz+yuZiZU8EmB3BdgEBVpDCOmHlo7lT6C646PiKWSo8dNCQGUAaB1QJAE79pbmE/YGoH4vKfH8Y2aRWtMAuhO/0OyKraxbuA3duc5X/VuKA9QsEZEuRzHin53GdJdzmHzNFLrWWffsEk4wJBAPcsbafg740NKy7duPHtZJCA9/WI1nWHrkLR1DZqrl7eSXXCN5XQvpB4Q+38WgvLogmQ2+4AqrT5/VAaesPd8YU=";
string publickey2xml = RSAPublicKey2xml(publickey); //公钥转换成xml格式
string xml2publickey = RSAxml2PublicKey(publickey2xml); //xml格式转换为公钥
string password = Encrypt(userpwd, publickey2xml); //公钥加密
string privatekey2xml = RSAPrivateKey2xml(privatekey); //公钥转换成xml格式
string xml2privatekey = RSAxml2PrivateKey(privatekey2xml); //xml格式转换成公钥
string upwd = Decrypt(password, privatekey2xml); //私钥解密
return userpwd == upwd;
}
catch (Exception ex)
{
return false;
}
}
static string RSAPublicKey2xml(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
}
static string RSAxml2PublicKey(string publickey2xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(publickey2xml);
BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
RsaKeyParameters pub = new RsaKeyParameters(false, m, p);
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return Convert.ToBase64String(serializedPublicBytes);
}
static string Encrypt(string content, string key)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(key);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
return Convert.ToBase64String(cipherbytes);
}
static string RSAPrivateKey2xml(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
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>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
}
static string RSAxml2PrivateKey(string privatekey2xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(privatekey2xml);
BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
return Convert.ToBase64String(serializedPrivateBytes);
}
static string Decrypt(string content, string key)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(key);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
return Encoding.UTF8.GetString(cipherbytes);
}
}