使用AES加密时,结果不一样

Posted on 2024-07-29 14:30  云起  阅读(304)  评论(0编辑  收藏  举报

使用AES加密时,发现得到的结果不一致。
python示例

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes
import base64

def encrypt_ecb(plaintext, key):
    # 创建AES的ECB模式加密器
    cipher = AES.new(key, AES.MODE_ECB)
    
    # 对明文进行填充,使其长度符合AES的要求
    ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
    
    # 返回加密后的密文
    return ciphertext

# 明文字符串
plaintext = b'temp'

# 密钥,AES需要16字节(128位),这里使用'test'并填充到16字节
key = b'你的key' + b'\0' * (16 - len(b'test'))

# 加密
ciphertext = encrypt_ecb(plaintext, key)

# 将密文转换为Base64编码的字符串以便于显示
ciphertext_base64 = base64.b64encode(ciphertext).decode('utf-8')

print(f"Encrypted text: {ciphertext_base64}")

C# 示例代码

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

class Program
{
    static void Main(string[] args)
    {
        string plainText = "temp"; // 要加密的字符串
        string key = "你的key"; // 密钥

        byte[] encryptedBytes = EncryptStringToBytes_Aes(plainText, key);
        string encryptedString = Convert.ToBase64String(encryptedBytes);

        Console.WriteLine($"Encrypted String: {encryptedString}");
    }

    private static byte[] EncryptStringToBytes_Aes(string plainText, string key)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key.PadRight(16, '\0'));
            aesAlg.Mode = CipherMode.ECB;
            aesAlg.Padding = PaddingMode.PKCS7;

            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);
                    }
                    return msEncrypt.ToArray();
                }
            }
        }
    }
}

经过比对和排查,发现是key不一致导致的。
AES在应用的时候,最终采用的是byte数组,可以验证下数组值是否一致。当然,也要保证模式是一样的,之后才是验证key的一致性。
一方面要注意key比较短的时候,是否使用的同样的填充策略,保持空位填充的byte一致。
另一方面要注意key比较长的时候是否会发生截断,比如python使用不同编码的字符串时,得到的byte[]是长短不一样的,尽量都转成统一字符集处理,例如utf8。

Copyright © 2025 云起
Powered by .NET 9.0 on Kubernetes