自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起聊聊 C# AES 加密與解密

開發(fā) 前端
AES(Advanced Encryption Standard)是一種對稱加密算法,廣泛用于數(shù)據(jù)的加密和解密。在C#中,我們可以使用AesManaged類來實現(xiàn)AES加密和解密。

常用屬性與方法

AesManaged類提供了許多屬性和方法,以下是一些常用的:

  • Key:獲取或設(shè)置加密算法的密鑰。
  • IV:獲取或設(shè)置加密算法的初始化向量。
  • BlockSize:獲取加密算法的塊大?。ㄒ晕粸閱挝唬?。
  • KeySize:獲取或設(shè)置加密算法的密鑰大?。ㄒ晕粸閱挝唬?。
  • Padding:獲取或設(shè)置加密算法的填充模式。
  • CreateEncryptor():創(chuàng)建用于加密數(shù)據(jù)的ICryptoTransform對象。
  • CreateDecryptor():創(chuàng)建用于解密數(shù)據(jù)的ICryptoTransform對象。

基本用法

以下是一個簡單的示例代碼,演示了如何使用AES加密和解密數(shù)據(jù):

static void Main()
{
    // 原始文本
    string plainText = "Hello, world!";


    // 生成隨機的密鑰和初始化向量
    byte[] key = GenerateRandomKey();
    byte[] iv = GenerateRandomIV();


    // 加密數(shù)據(jù)
    byte[] encryptedData = Encrypt(Encoding.UTF8.GetBytes(plainText), key, iv);


    // 解密數(shù)據(jù)
    string decryptedText = Decrypt(encryptedData, key, iv);


    // 輸出結(jié)果
    Console.WriteLine("Original Text: " + plainText);
    Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
    Console.WriteLine("Decrypted Text: " + decryptedText);
}


// 生成隨機的密鑰
static byte[] GenerateRandomKey()
{
    using (AesManaged aes = new AesManaged())
    {
        aes.GenerateKey();
        return aes.Key;
    }
}


// 生成隨機的初始化向量
static byte[] GenerateRandomIV()
{
    using (AesManaged aes = new AesManaged())
    {
        aes.GenerateIV();
        return aes.IV;
    }
}


// 使用指定的密鑰和初始化向量加密數(shù)據(jù)
static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
    using (AesManaged aes = new AesManaged())
    {
        aes.Key = key;
        aes.IV = iv;


        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cryptoStream.Write(data, 0, data.Length);
                cryptoStream.FlushFinalBlock();
                return memoryStream.ToArray();
            }
        }
    }
}


// 使用指定的密鑰和初始化向量解密數(shù)據(jù)
static string Decrypt(byte[] data, byte[] key, byte[] iv)
{
    using (AesManaged aes = new AesManaged())
    {
        aes.Key = key;
        aes.IV = iv;


        using (MemoryStream memoryStream = new MemoryStream(data))
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
            {
                byte[] decryptedData = new byte[data.Length];
                int bytesRead = cryptoStream.Read(decryptedData, 0, decryptedData.Length);
                return Encoding.UTF8.GetString(decryptedData, 0, bytesRead);
            }
        }
    }
}

圖片圖片

AES通用類

public class AesHelper
{
    private byte[] key;
    private byte[] iv;


    public AesHelper(byte[] key, byte[] iv)
    {
        this.key = key;
        this.iv = iv;
    }


    public byte[] Encrypt(byte[] data)
    {
        using (AesManaged aes = new AesManaged())
        {
            aes.Key = key;
            aes.IV = iv;


            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(data, 0, data.Length);
                    cryptoStream.FlushFinalBlock();
                    return memoryStream.ToArray();
                }
            }
        }
    }


    public byte[] Decrypt(byte[] data)
    {
        using (AesManaged aes = new AesManaged())
        {
            aes.Key = key;
            aes.IV = iv;


            using (MemoryStream memoryStream = new MemoryStream(data))
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    byte[] decryptedData = new byte[data.Length];
                    int bytesRead = cryptoStream.Read(decryptedData, 0, decryptedData.Length);
                    return decryptedData[..bytesRead];
                }
            }
        }
    }
}






static void Main()
{
    byte[] key = Encoding.UTF8.GetBytes("MySecretKey12345");
    byte[] iv = Encoding.UTF8.GetBytes("1234567890ABCDEF");


    AesHelper aesHelper = new AesHelper(key, iv);


    string plainText = "Hello, world!";
    byte[] encryptedData = aesHelper.Encrypt(Encoding.UTF8.GetBytes(plainText));
    byte[] decryptedData = aesHelper.Decrypt(encryptedData);
    string decryptedText = Encoding.UTF8.GetString(decryptedData);


    Console.WriteLine("Original Text: " + plainText);
    Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
    Console.WriteLine("Decrypted Text: " + decryptedText);
}

注意:iv長度

System.Security.Cryptography.CryptographicException: 'Specified initialization vector (IV) does not match the block size for this algorithm.'

這個異常通常是因為指定的初始化向量(IV)的長度與所使用的算法的塊大小不匹配導(dǎo)致的。AES算法的塊大小為128位(16字節(jié)),因此初始化向量的長度應(yīng)為16字節(jié)。

圖片圖片

總結(jié)

使用C#中的AesManaged類,我們可以輕松地實現(xiàn)AES加密和解密。本文介紹了基本的用法,包括生成隨機密鑰和IV、加密和解密數(shù)據(jù)等操作。此外,還介紹了一些常用的屬性和方法,以便更好地理解和使用AesManaged類。根據(jù)實際需求和場景,我們可以靈活地使用這些功能來保護敏感數(shù)據(jù)的安全性。

責(zé)任編輯:武曉燕 來源: 技術(shù)老小子
相關(guān)推薦

2024-11-28 09:57:50

C#事件發(fā)布器

2025-02-13 09:32:12

C#重寫override

2023-10-10 08:00:07

2024-09-09 08:53:56

2024-08-30 11:00:22

2022-04-06 08:23:57

指針函數(shù)代碼

2025-01-09 07:54:03

2023-06-28 07:56:46

2024-12-23 10:20:50

2024-02-26 00:00:00

架構(gòu)老化重構(gòu)

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開發(fā)模式

2024-05-29 13:18:12

線程Thread?方式

2023-07-04 08:06:40

數(shù)據(jù)庫容器公有云

2024-01-29 09:01:20

React列表模式
點贊
收藏

51CTO技術(shù)棧公眾號