c#對(duì)稱加密的初始化向量如何設(shè)置

c#
小樊
81
2024-09-20 05:48:24

在C#中,使用對(duì)稱加密算法(如AES)進(jìn)行加密時(shí),初始化向量(IV)的設(shè)置是非常重要的。初始化向量是加密過(guò)程中的一個(gè)關(guān)鍵組成部分,它確保了相同的數(shù)據(jù)塊不會(huì)產(chǎn)生相同的加密結(jié)果,從而提高了加密的安全性。

以下是使用C#進(jìn)行AES對(duì)稱加密時(shí)設(shè)置初始化向量的方法:

  1. 創(chuàng)建一個(gè)字節(jié)數(shù)組,用于存儲(chǔ)初始化向量。IV的長(zhǎng)度取決于所使用的加密算法。對(duì)于AES,IV的長(zhǎng)度通常是16字節(jié)(128位)。
  2. 使用隨機(jī)數(shù)生成器創(chuàng)建一個(gè)填充了隨機(jī)數(shù)據(jù)的字節(jié)數(shù)組。這可以通過(guò)System.Security.Cryptography.RandomNumberGenerator類來(lái)實(shí)現(xiàn)。
  3. 將生成的隨機(jī)字節(jié)數(shù)組轉(zhuǎn)換為Base64編碼的字符串,以便于存儲(chǔ)和傳輸。

以下是一個(gè)示例代碼,展示了如何在C#中設(shè)置AES加密的初始化向量:

using System;
using System.Text;
using System.Security.Cryptography;

public class AesEncryptionHelper
{
    private static readonly byte[] Key = Encoding.UTF8.GetBytes("your-secret-key");

    public static string Encrypt(string plainText)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;

            // 創(chuàng)建隨機(jī)初始化向量
            byte[] iv = GenerateRandomIV();
            aesAlg.IV = iv;

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (var msEncrypt = new System.IO.MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (var swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                }
                return Convert.ToBase64String(msEncrypt.ToArray());
            }
        }
    }

    public static string Decrypt(string cipherText)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;

            // 從Base64字符串中獲取初始化向量
            byte[] iv = Convert.FromBase64String(cipherText.Substring(0, cipherText.Length - 16));
            aesAlg.IV = iv;

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (var msDecrypt = new System.IO.MemoryStream(Convert.FromBase64String(cipherText)))
            {
                using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (var srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }

    private static byte[] GenerateRandomIV()
    {
        using (var rng = RandomNumberGenerator.Create())
        {
            var buffer = new byte[16]; // AES的IV長(zhǎng)度為16字節(jié)
            rng.GetBytes(buffer);
            return buffer;
        }
    }
}

請(qǐng)注意,上述代碼中的密鑰(“your-secret-key”)應(yīng)替換為您自己的密鑰。此外,加密和解密過(guò)程中使用的初始化向量應(yīng)保持一致,以確保數(shù)據(jù)的安全解密。

0