引言
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准与技术研究院(NIST)于2001年发布。AES以其高效、安全的特点,在数据加密领域占据了重要地位。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
// 硬编码的密钥和IV(仅为示例,请勿在生产环境中使用)
byte[] key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");
// 输入的15位数字
string input = "123456789012345";
// 加密
string encryptedText = Encrypt(input, key, iv);
Console.WriteLine($"Encrypted: {encryptedText}");
//string encryptedText = "iQNJPVM+M+DzzMQH5l9pmQ==";
// 解密(可选,以验证加密是否正确)
string decryptedText = Decrypt(encryptedText, key, iv);
Console.WriteLine($"Decrypted: {decryptedText}");
}
static string Encrypt(string plainText, byte[] Key, byte[] IV)
{
byte[] encrypted;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
return Convert.ToBase64String(encrypted);
}
static string Decrypt(string cipherText, byte[] Key, byte[] IV)
{
cipherText = cipherText.Replace(" ", "+"); // 处理Base64中的空格问题
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(cipherBytes))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
}
}
}
该程序加密和解密的原理主要基于AES(Advanced Encryption Standard)加密算法,这是一种广泛使用的对称密钥加密算法。在AES中,加密和解密使用相同的密钥,但过程在逻辑上是相反的。下面是该程序加密和解密的具体原理:
加密原理
- 密钥和初始化向量(IV):
- 密钥(Key)是用于加密和解密数据的秘密值。
- 初始化向量(IV)是一个随机或伪随机的值,用于增加加密的随机性,使得即使相同的明文块在多次加密时也会产生不同的密文块。
- 在这个程序中,密钥和IV被硬编码为字符串,然后转换为字节数组。然而,在实际应用中,密钥和IV应该安全地生成和存储。
- AES算法:
- AES算法将明文数据分成固定大小的块(AES的块大小是128位或16字节)。
- 对于每个块,AES算法使用密钥和可能的IV(在CBC、CFB等模式下)来生成一个密文块。
- 如果明文长度不是块大小的整数倍,则需要进行填充(如PKCS#7填充),以确保最后一个块的大小正确。
- 加密过程:
- 创建一个
Aes
对象,并设置其密钥和IV。 - 使用
CreateEncryptor
方法创建一个加密器对象。 - 将明文数据写入一个
MemoryStream
中,然后将该流包装在一个CryptoStream
中,该CryptoStream
使用加密器进行加密。 - 将加密后的数据从
MemoryStream
中读取出来,并转换为字节数组。 - 最后,将字节数组转换为Base64字符串以便于存储或传输。
- 创建一个
解密原理
解密是加密的逆过程:
- 读取密文:
- 首先,将Base64编码的密文字符串转换回字节数组。
- AES算法:
- 同样,创建一个
Aes
对象,并设置与加密时相同的密钥和IV。 - 使用
CreateDecryptor
方法创建一个解密器对象。
- 同样,创建一个
- 解密过程:
- 将密文字节数组包装在一个
MemoryStream
中,然后将该流包装在一个CryptoStream
中,该CryptoStream
使用解密器进行解密。 - 从
CryptoStream
中读取解密后的数据,并将其转换回明文。
- 将密文字节数组包装在一个
- 处理填充:
- 如果加密时使用了填充(如PKCS#7),解密时会自动移除这些填充字节,以恢复原始明文数据。