数据加密-AES数据加密及C#实现

引言

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中,加密和解密使用相同的密钥,但过程在逻辑上是相反的。下面是该程序加密和解密的具体原理:

加密原理

  1. 密钥和初始化向量(IV)
    • 密钥(Key)是用于加密和解密数据的秘密值。
    • 初始化向量(IV)是一个随机或伪随机的值,用于增加加密的随机性,使得即使相同的明文块在多次加密时也会产生不同的密文块。
    • 在这个程序中,密钥和IV被硬编码为字符串,然后转换为字节数组。然而,在实际应用中,密钥和IV应该安全地生成和存储。
  2. AES算法
    • AES算法将明文数据分成固定大小的块(AES的块大小是128位或16字节)。
    • 对于每个块,AES算法使用密钥和可能的IV(在CBC、CFB等模式下)来生成一个密文块。
    • 如果明文长度不是块大小的整数倍,则需要进行填充(如PKCS#7填充),以确保最后一个块的大小正确。
  3. 加密过程
    • 创建一个Aes对象,并设置其密钥和IV。
    • 使用CreateEncryptor方法创建一个加密器对象。
    • 将明文数据写入一个MemoryStream中,然后将该流包装在一个CryptoStream中,该CryptoStream使用加密器进行加密。
    • 将加密后的数据从MemoryStream中读取出来,并转换为字节数组。
    • 最后,将字节数组转换为Base64字符串以便于存储或传输。

解密原理

解密是加密的逆过程:

  1. 读取密文
    • 首先,将Base64编码的密文字符串转换回字节数组。
  2. AES算法
    • 同样,创建一个Aes对象,并设置与加密时相同的密钥和IV。
    • 使用CreateDecryptor方法创建一个解密器对象。
  3. 解密过程
    • 将密文字节数组包装在一个MemoryStream中,然后将该流包装在一个CryptoStream中,该CryptoStream使用解密器进行解密。
    • CryptoStream中读取解密后的数据,并将其转换回明文。
  4. 处理填充
    • 如果加密时使用了填充(如PKCS#7),解密时会自动移除这些填充字节,以恢复原始明文数据。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值