MST
星途 面试题库

面试题:C#中如何使用对称加密算法进行数据加密

在C#中,简述使用对称加密算法(如AES)对一段字符串进行加密的步骤,并给出关键代码示例。需要考虑密钥管理、加密模式等因素。
17.4万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
  1. 步骤简述

    • 生成或获取密钥和初始化向量(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字符串,以便于存储或传输。
  2. 关键代码示例

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)。