arrow_back

AES 加解密

print
  1. AES 加解密

    提供通过 AES(百度百科 | Wikipedia) 算法加密和解密的功能。

    可以使用该加密功能加密数据库连接字符串,在配置文件中使用加密后的连接字符串。在 .NET 中可以使用如下的 C# 代码解密连接字符串:

    using System;
    using System.IO;
    using System.Security.Cryptography;
    
    ...
    
    // 将 BASE64 格式的 cipher 密文转换为字节数组
    var bytes = Convert.FromBase64String(cipher);
    // 解密后的连接字符串明文
    var connString = "";
    
    // AES 算法
    using (var aes = Aes.Create())
    {
        // 此前已经获得初始化向量
        aes.IV = iv;                            
        // 此前已经获得解密密钥
        aes.Key = key;                            
        // 使用 CBC 模式
        aes.Mode = CipherMode.CBC;                            
        // 使用 PKCS7 填充
        aes.Padding = PaddingMode.PKCS7;
    
        using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
        {
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader reader = new StreamReader(cs))
                    {
                        connString = reader.ReadToEnd();
                    }
                }
            }
        }
    }
    
    return connString;
    
    1. 加密

      将指定的明文字符串按照 UTF-8 编码转换为字节数组,并使用给定的密钥、初始化向量和 AES/CBC/PKCS7Padding 算法加密字节数组,加密结果使用 BASE64 字符串格式表示。

      密钥和初始化向量都必须是 16 字节(128 比特),格式可以为:

      • BASE64

        长度为 24 的 BASE64 格式的字符串,比如 SzyDWPhsvCSxdAFvaUv9GA==

      • 十六进制字符串

        长度为 32 的十六进制格式的字符串,比如 4b3c8358f86cbc24b174016f694bfd18

      • 字节数组

        前缀为 {[ 或没有前缀,后缀为 }] 或没有后缀的字节数组。数组中每一个元素格式为:hh、0xhh、(byte)0xhh,其中 h 表示一个十六进制数字。比如:

        • {0x4b, 0x3c, 0x83, 0x58, 0xf8, 0x6c, 0xbc, 0x24, 0xb1, 0x74, 0x01, 0x6f, 0x69, 0x4b, 0xfd, 0x18},.NET 中适用此格式。

        • [0x4b, 0x3c, 0x83, 0x58, 0xf8, 0x6c, 0xbc, 0x24, 0xb1, 0x74, 0x01, 0x6f, 0x69, 0x4b, 0xfd, 0x18]

        • 0x4b, 0x3c, 0x83, 0x58, 0xf8, 0x6c, 0xbc, 0x24, 0xb1, 0x74, 0x01, 0x6f, 0x69, 0x4b, 0xfd, 0x18

        • 4b, 3c, 83, 58, f8, 6c, bc, 24, b1, 74, 01, 6f, 69, 4b, fd, 18

        • (byte)0x4b, (byte)0x3c, (byte)0x83, (byte)0x58, (byte)0xf8, (byte)0x6c, (byte)0xbc, (byte)0x24, (byte)0xb1, (byte)0x74, (byte)0x01, (byte)0x6f, (byte)0x69, (byte)0x4b, (byte)0xfd, (byte)0x18,Java 中适用此格式。

        前后和中间的空白符号会被自动去除。

    2. 解密

      将 BASE64 格式的密文使用给定的密钥、初始化向量和 AES/CBC/PKCS7Padding 算法进行解密,解密后的字节数组按 UTF-8 编码转换为字符串。

      密钥和初始化向量都必须是 16 字节(128 比特),格式可以为:

      • BASE64

        长度为 24 的 BASE64 格式的字符串,比如 SzyDWPhsvCSxdAFvaUv9GA==

      • 十六进制字符串

        长度为 32 的十六进制格式的字符串,比如 4b3c8358f86cbc24b174016f694bfd18

      • 字节数组

        前缀为 {[ 或没有前缀,后缀为 }] 或没有后缀的字节数组。数组中每一个元素格式为:hh、0xhh、(byte)0xhh,其中 h 表示一个十六进制数字。比如:

        • {0x4b, 0x3c, 0x83, 0x58, 0xf8, 0x6c, 0xbc, 0x24, 0xb1, 0x74, 0x01, 0x6f, 0x69, 0x4b, 0xfd, 0x18},.NET 中适用此格式。

        • [0x4b, 0x3c, 0x83, 0x58, 0xf8, 0x6c, 0xbc, 0x24, 0xb1, 0x74, 0x01, 0x6f, 0x69, 0x4b, 0xfd, 0x18]

        • 0x4b, 0x3c, 0x83, 0x58, 0xf8, 0x6c, 0xbc, 0x24, 0xb1, 0x74, 0x01, 0x6f, 0x69, 0x4b, 0xfd, 0x18

        • 4b, 3c, 83, 58, f8, 6c, bc, 24, b1, 74, 01, 6f, 69, 4b, fd, 18

        • (byte)0x4b, (byte)0x3c, (byte)0x83, (byte)0x58, (byte)0xf8, (byte)0x6c, (byte)0xbc, (byte)0x24, (byte)0xb1, (byte)0x74, (byte)0x01, (byte)0x6f, (byte)0x69, (byte)0x4b, (byte)0xfd, (byte)0x18,Java 中适用此格式。

        前后和中间的空白符号会被自动去除。