RSA加密的概念
-
RSA加密是一种非对称加密算法。非对称加密算法使用一对密钥,公钥(Public Key)和私钥(Private Key)。公钥可以公开发布,用于加密数据;私钥则由接收者自己保存,用于解密数据。这就好比有一个特殊的盒子,任何人都可以用公钥这个锁将物品锁在这个盒子里,但是只有拥有私钥的人才能打开这个盒子获取物品。
-
RSA加密算法基于大数质因数分解的困难性原理。简单来说,就是将两个大素数相乘很容易,但是将它们的乘积分解回原来的两个素数却非常困难。例如,给你两个很大的素数p和q,计算出它们的乘积n = p*q很容易,但是如果只是给你n,要找出p和q就很困难,这个特性使得RSA加密算法具有很高的安全性。
RSA加密的用法
-
密钥生成:首先需要生成一对公钥和私钥。这一过程涉及到选择两个大素数p和q,计算它们的乘积n,然后计算欧拉函数φ(n) =(p - 1)*(q - 1)。接着选择一个与φ(n)互质的整数e作为公钥的指数部分,再计算出与e同余的模逆元d,作为私钥的指数部分。公钥可以表示为(e,n),私钥可以表示为(d,n)。
-
加密过程:发送方使用接收方的公钥(e,n)对明文m进行加密。加密公式为c = m^e mod n,其中c是加密后的密文。
-
解密过程:接收方使用自己的私钥(d,n)对接收到的密文c进行解密。解密公式为m = c^d mod n,这样就可以得到原始的明文m。
C#代码实现
-
首先,需要引用相关的命名空间,例如
System.Security.Cryptography
,它提供了用于加密和解密的类。 -
RSA加密解密示例代码:
csusing System; using System.Security.Cryptography; using System.Text; class RSACryptoExample { static void Main() { // 创建RSA加密服务提供者 using (RSA rsa = RSA.Create()) { // 生成密钥对 // 一般 RSA 密钥大小建议使用 2048 位或更高,这里为了演示简单,可能使用较小的默认值 // 获取公钥 string publicKey = rsa.ToXmlString(false); // false表示只导出公钥 // 获取私钥 string privateKey = rsa.ToXmlString(true); // true表示导出公钥和私钥 // 明文 string plainText = "Hello RSA Encryption!"; // 加密 byte[] encryptedData = EncryptStringToBytes_RSA(plainText, publicKey); Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData)); // 解密 string decryptedText = DecryptBytesToString_RSA(encryptedData, privateKey); Console.WriteLine("Decrypted Text: " + decryptedText); } } // 加密方法 static byte[] EncryptStringToBytes_RSA(string plainText, string publicKey) { byte[] encryptedBytes = null; // 使用 RSA 从公钥字符串创建加密服务提供者 using (RSA rsa = RSA.Create()) { try { // 导入公钥 rsa.FromXmlString(publicKey); // 将明文字符串转换为字节数组 byte[] dataToEncrypt = Encoding.UTF8.GetBytes(plainText); // 使用公钥加密数据 encryptedBytes = rsa.Encrypt(dataToEncrypt, RSAEncryptionPadding.OaepSHA256); } catch (CryptographicException e) { Console.WriteLine("Error encrypting: {0}", e.Message); } } return encryptedBytes; } // 解密方法 static string DecryptBytesToString_RSA(byte[] encryptedData, string privateKey) { string decryptedText = null; // 使用 RSA 从私钥字符串创建解密服务提供者 using (RSA rsa = RSA.Create()) { try { // 导入私钥 rsa.FromXmlString(privateKey); // 使用私钥解密数据 byte[] decryptedBytes = rsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256); // 将解密后的字节数组转换为字符串 decryptedText = Encoding.UTF8.GetString(decryptedBytes); } catch (CryptographicException e) { Console.WriteLine("Error decrypting: {0}", e.Message); } } return decryptedText; } }
代码详细解释
-
在代码中,首先创建了一个RSA加密服务提供者对象
RSA rsa = RSA.Create()
。这个对象用于生成密钥对以及进行加密和解密操作。 -
通过调用
rsa.ToXmlString(false)
和rsa.ToXmlString(true)
分别获取公钥和私钥的XML字符串形式。这是为了方便存储和传输密钥。例如,在网络通信中,可以将公钥发送给发送方,而私钥由接收方自己保存。 -
在加密方法
EncryptStringToBytes_RSA
中,使用公钥对明文进行加密。首先将明文字符串转换为字节数组,然后调用rsa.Encrypt
方法,传入加密数据和加密填充模式(这里使用OAEPSHA256填充模式)。加密填充模式是为了防止某些攻击,如选择密文攻击等。加密后的结果是一个字节数组。 -
在解密方法
DecryptBytesToString_RSA
中,使用私钥对密文进行解密。调用rsa.Decrypt
方法,传入加密后的字节数组和解密填充模式,得到解密后的字节数组,然后再将其转换为字符串。 -
在主方法中,首先生成密钥对,然后对明文进行加密,并将加密后的数据打印出来。接着对加密后的数据进行解密,并打印解密后的明文,从而验证加密解密过程的正确性。