简介:
1. RSA加密算法是一种非对称可逆加密算法。公钥公开,私钥保密,它的加密解密算法是公开的。公钥负责加密,私钥负责解密。
2. 它既能用于加密,也能用于数字签名。
2.1 数字签名 :签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过。数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。数字签名是个加密的过程,数字签名验证是个解密的过程。
/// <summary> /// 非对称加密算法RSA /// </summary> public static class RSA { /// <summary> /// 要使用的密钥的大小(以位为单位) /// </summary> public enum KeySize : int { Key1024 = 1024, Key2048 = 2048, Key3072 = 3072, Key7680 = 7680, Key15360 = 15360, } /// <summary> /// RSA秘钥 /// </summary> public class RSAKeys { /// <summary> /// 公钥 /// </summary> public string PublicKey; /// <summary> /// 私钥 /// </summary> public string PrivateKey; } /// <summary> /// 生成 RSA 公钥和私钥 /// </summary> /// <param name="keySize">要使用的密钥的大小(以位为单位)</param> /// <returns></returns> public static RSAKeys CreateRSAKeys(KeySize keySize) { RSAKeys rsaKeys = new RSAKeys(); using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider((int)keySize)) { rsaKeys.PublicKey = rsa.ToXmlString(false); rsaKeys.PrivateKey = rsa.ToXmlString(true); return rsaKeys; } } /// <summary> /// 生成 RSA 公钥和私钥XML文件 /// </summary> /// <param name="keySize">要使用的密钥的大小(以位为单位)</param> /// <param name="savePrivateFile">保存私钥文件的物理路径</param> /// <param name="savePublicFile">保存公钥文件的物理路径</param> /// <returns></returns> public static void CreateRSAKeysXml(KeySize keySize, string savePrivateFile, string savePublicFile) { RSAKeys rsaKeys = CreateRSAKeys(keySize); using (StreamWriter writer = new StreamWriter(savePrivateFile)) { writer.WriteLine(rsaKeys.PrivateKey); } using (StreamWriter writer = new StreamWriter(savePublicFile)) { writer.WriteLine(rsaKeys.PublicKey); } } /// <summary> /// RSA加密 /// </summary> /// <param name="publickey"> 公钥 </param> /// <param name="data"> 待加密的内容 </param> /// <param name="privatekey"> 以指定编码方式加载明文</param> /// <returns> 加密后的密文 </returns> public static string RSAEncrypt(string data, string publickey, Encoding dataEncoding) { using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(publickey); byte[] encryptBytes = rsa.Encrypt(dataEncoding.GetBytes(data), false); return Convert.ToBase64String(encryptBytes); } } /// <summary> /// RSA解密 /// </summary> /// <param name="data"> 要解密的密文 </param> /// <param name="privatekey"> 私钥 </param> /// <param name="privatekey"> 解密后以指定编码方式返回 </param> /// <returns> 解密后的明文 </returns> public static string RSADecrypt(string data, string privatekey, Encoding dataEncoding) { using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(privatekey); byte[] decryptBytes = rsa.Decrypt(Convert.FromBase64String(data), false); return dataEncoding.GetString(decryptBytes); } } }