用C#实现AES加密和解密

本文介绍了一种用于保护电子数据的AES加密算法实现方法。AES是一种对称密钥分组密码,支持128、192和256位密钥长度。文中提供了使用C#实现的AES加密和解密代码示例,包括密钥生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

需要加入引用   using System.Security.Cryptography;

/// <summary>
/// 有密码的AES加密
/// </summary>
/// <param name="text">加密字符</param>
/// <param name="password">加密的密码</param>
/// <param name="iv">密钥</param>
/// <returns></returns>
public static string AESEncrypt(string text, string password, string iv)
{
RijndaelManaged rijndaelCipher
= new RijndaelManaged();

rijndaelCipher.Mode
= CipherMode.CBC;

rijndaelCipher.Padding
= PaddingMode.PKCS7;

rijndaelCipher.KeySize
= 128;

rijndaelCipher.BlockSize
= 128;

byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);

byte[] keyBytes = new byte[16];

int len = pwdBytes.Length;

if (len > keyBytes.Length) len = keyBytes.Length;

System.Array.Copy(pwdBytes, keyBytes, len);

rijndaelCipher.Key
= keyBytes;


byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
rijndaelCipher.IV
= ivBytes;

ICryptoTransform transform
= rijndaelCipher.CreateEncryptor();

byte[] plainText = Encoding.UTF8.GetBytes(text);

byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);

return Convert.ToBase64String(cipherBytes);

}

/// <summary>
/// 随机生成密钥
/// </summary>
/// <returns></returns>
public static string GetIv(int n)
{
char[] arrChar = new char[]{
'a','b','d','c','e','f','g','h','i','j','k','l','m','n','p','r','q','s','t','u','v','w','z','y','x',
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','Q','P','R','T','S','V','U','W','X','Y','Z'
};

StringBuilder num
= new StringBuilder();

Random rnd
= new Random(DateTime.Now.Millisecond);
for (int i = 0; i < n; i++)
{
num.Append(arrChar[rnd.Next(
0, arrChar.Length)].ToString());

}

return num.ToString();
}

/// <summary>
/// AES解密
/// </summary>
/// <param name="text"></param>
/// <param name="password"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string AESDecrypt(string text, string password, string iv)
{
RijndaelManaged rijndaelCipher
= new RijndaelManaged();

rijndaelCipher.Mode
= CipherMode.CBC;

rijndaelCipher.Padding
= PaddingMode.PKCS7;

rijndaelCipher.KeySize
= 128;

rijndaelCipher.BlockSize
= 128;

byte[] encryptedData = Convert.FromBase64String(text);

byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);

byte[] keyBytes = new byte[16];

int len = pwdBytes.Length;

if (len > keyBytes.Length) len = keyBytes.Length;

System.Array.Copy(pwdBytes, keyBytes, len);

rijndaelCipher.Key
= keyBytes;

byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
rijndaelCipher.IV
= ivBytes;

ICryptoTransform transform
= rijndaelCipher.CreateDecryptor();

byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);

return Encoding.UTF8.GetString(plainText);

}
C#中,你可以使用.NET框架内置的`System.Security.Cryptography.Aes`类来进行AES(Advanced Encryption Standard)对称加密,并结合`Newtonsoft.Json`库来处理JSON数据的加密解密。以下是基本步骤: 1. **安装依赖**: 首先,确保已添加`System.Security.Cryptography.Algorithms``Newtonsoft.Json`命名空间到项目中。如果你还没有安装`Newtonsoft.Json`,可以使用NuGet包管理器安装:`Install-Package Newtonsoft.Json`。 2. **生成随机密钥初始化向量**: Aes加密需要一个密钥一个初始化向量(IV)。例如: ```csharp using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes("your_secret_key"); // 用实际的密钥替换 aes.IV = new byte[16]; // IV通常长度为16字节,这里留空,但最好从安全源获取 } ``` 3. **加密JSON字符串**: 使用`AesCryptoServiceProvider``ICryptoTransform`实现加密: ```csharp string jsonToEncrypt = "{\"key\":\"value\"}"; // JSON待加密内容 byte[] encryptedData; using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV)) { using (var memoryStream = new MemoryStream()) { using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) using (var streamWriter = new StreamWriter(cryptoStream)) { streamWriter.Write(jsonToEncrypt); encryptedData = memoryStream.ToArray(); } } } string base64EncryptedJson = Convert.ToBase64String(encryptedData); // 输出加密后的Base64字符串 ``` 4. **解密AES加密的JSON**: 解密过程类似,只是方向相反: ```csharp byte[] encryptedBytes = Convert.FromBase64String(base64EncryptedJson); using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes("your_secret_key"); // 依然使用相同的密钥 aes.IV = ...; // 从之前保存的地方恢复IV byte[] decryptedData; using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV)) { using (var memoryStream = new MemoryStream(encryptedData)) { using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) using (var streamReader = new StreamReader(cryptoStream)) { string decryptedJson = streamReader.ReadToEnd(); // 返回解密后的原始JSON } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值