面试题答案
一键面试-
步骤简述:
- 生成或获取密钥和初始化向量(IV):密钥和IV是对称加密的关键参数,对于AES加密,密钥长度通常为128、192或256位,IV长度一般为128位。密钥和IV需要妥善管理,例如可以通过安全的随机数生成器生成,并且密钥要保密。
- 创建加密算法对象:在C#中,可以使用
System.Security.Cryptography.Aes
类来创建AES加密算法对象。 - 设置加密模式和填充模式:常见的加密模式有CBC(Cipher Block Chaining)、ECB(Electronic Codebook)等,填充模式有PKCS7、ZeroPadding等。一般推荐使用CBC模式和PKCS7填充模式。
- 创建加密器:使用密钥和IV初始化加密算法对象,并创建加密器。
- 准备数据:将需要加密的字符串转换为字节数组。
- 执行加密操作:使用加密器对字节数组进行加密,得到加密后的字节数组。
- 可选:将加密后的字节数组转换为合适的格式:例如Base64字符串,以便于存储或传输。
-
关键代码示例:
using System;
using System.Security.Cryptography;
using System.Text;
public class AesEncryptionExample
{
public static string EncryptString(string plainText, string key, string iv)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Encoding.UTF8.GetBytes(key);
aesAlg.IV = Encoding.UTF8.GetBytes(iv);
aesAlg.Mode = CipherMode.CBC;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (System.IO.MemoryStream msEncrypt = new System.IO.MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (System.IO.StreamWriter swEncrypt = new System.IO.StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
byte[] encrypted = msEncrypt.ToArray();
return Convert.ToBase64String(encrypted);
}
}
}
}
}
可以使用以下方式调用:
class Program
{
static void Main()
{
string plainText = "Hello, World!";
string key = "ThisIsASecretKey123456";//注意实际应用中要妥善管理密钥
string iv = "ThisIsIV12345678";//注意实际应用中要妥善管理IV
string encryptedText = AesEncryptionExample.EncryptString(plainText, key, iv);
Console.WriteLine("Encrypted Text: " + encryptedText);
}
}
在实际应用中,密钥和IV不应该像示例中这样以明文硬编码,而应该通过安全的方式生成和存储,例如使用密钥管理服务(KMS)。