c#实现非对称加密双向RSA + AES加密
时间: 2023-11-18 07:04:19 浏览: 220
双向 RSA + AES 加密是一种常见的加密方式,其中使用 RSA 算法加密 AES 密钥,然后使用 AES 算法加密数据。在 C# 中,可以使用 `RSACryptoServiceProvider` 类和 `AesCryptoServiceProvider` 类来实现此加密方式。以下是一个简单的示例:
```csharp
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program {
static void Main(string[] args) {
string plainText = "Hello, world!";
byte[] encryptedData = Encrypt(plainText);
string decryptedText = Decrypt(encryptedData);
Console.WriteLine("Original text: {0}", plainText);
Console.WriteLine("Encrypted data: {0}", Convert.ToBase64String(encryptedData));
Console.WriteLine("Decrypted text: {0}", decryptedText);
}
static byte[] Encrypt(string plainText) {
byte[] aesKey = GenerateAesKey();
using (var rsa = new RSACryptoServiceProvider()) {
rsa.PersistKeyInCsp = false;
byte[] encryptedAesKey = rsa.Encrypt(aesKey, true); // 使用 RSA 加密 AES 密钥
using (var aes = new AesCryptoServiceProvider()) {
aes.Key = aesKey;
aes.GenerateIV();
using (var memoryStream = new MemoryStream()) {
memoryStream.Write(aes.IV, 0, aes.IV.Length);
using (var cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write)) {
byte[] plainData = Encoding.UTF8.GetBytes(plainText);
cryptoStream.Write(plainData, 0, plainData.Length);
cryptoStream.FlushFinalBlock();
}
byte[] encryptedData = memoryStream.ToArray();
byte[] result = new byte[encryptedAesKey.Length + encryptedData.Length];
Buffer.BlockCopy(encryptedAesKey, 0, result, 0, encryptedAesKey.Length);
Buffer.BlockCopy(encryptedData, 0, result, encryptedAesKey.Length, encryptedData.Length);
return result;
}
}
}
}
static string Decrypt(byte[] encryptedData) {
byte[] encryptedAesKey = new byte[128]; // RSA 加密 AES 密钥得到的密文长度为 128 字节
byte[] encryptedDataOnly = new byte[encryptedData.Length - encryptedAesKey.Length];
Buffer.BlockCopy(encryptedData, 0, encryptedAesKey, 0, encryptedAesKey.Length);
Buffer.BlockCopy(encryptedData, encryptedAesKey.Length, encryptedDataOnly, 0, encryptedDataOnly.Length);
using (var rsa = new RSACryptoServiceProvider()) {
rsa.PersistKeyInCsp = false;
byte[] aesKey = rsa.Decrypt(encryptedAesKey, true); // 使用 RSA 解密 AES 密钥
using (var aes = new AesCryptoServiceProvider()) {
aes.Key = aesKey;
aes.IV = encryptedDataOnly.Take(aes.IV.Length).ToArray();
using (var memoryStream = new MemoryStream()) {
using (var cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write)) {
cryptoStream.Write(encryptedDataOnly, aes.IV.Length, encryptedDataOnly.Length - aes.IV.Length);
cryptoStream.FlushFinalBlock();
}
byte[] decryptedData = memoryStream.ToArray();
return Encoding.UTF8.GetString(decryptedData);
}
}
}
}
static byte[] GenerateAesKey() {
using (var aes = new AesCryptoServiceProvider()) {
aes.GenerateKey();
return aes.Key;
}
}
}
```
上面的代码中,首先调用 `GenerateAesKey` 方法生成 AES 密钥,然后使用 RSA 算法加密 AES 密钥。加密时,先将 AES 密钥使用 RSA 加密,然后使用 AES 算法加密数据。具体来说,将 AES 密钥和 IV 都写入 `MemoryStream` 对象中,然后使用 `CryptoStream` 对象将数据写入 `MemoryStream` 对象中。最后将密文和 RSA 加密的 AES 密钥一起返回。
解密时,先从密文中取出 RSA 加密的 AES 密钥,然后使用 RSA 算法解密 AES 密钥。解密时,先从密文中取出 AES 的 IV 值,然后使用 `CryptoStream` 对象将数据解密。最后将解密后的文本返回。
注意,上面的示例仅用于演示 RSA + AES 加密的基本原理,实际使用中还需要考虑安全性等因素。
阅读全文