我正在编写一个简单的 AES 实现,并希望使用在线 AES 加密器进行验证。 但是,当输入相同的配置(相同的密钥、ECB 模式、256 密钥大小)时,我总是得到不同的字符串输出(对于 Base64 和十六进制)。然而,所有在线加密器都输出相同的加密字符串,因此它们是对齐的。我错过了什么?
参考在线工具:https://devglan.com/online-tools/aes-encryption-decryption 和 https://anycript.com/crypto
我的代码
using System;
using System.IO;
using System.Security.Cryptography;
namespace AesApp
{
internal class Program
{
static void Main(string[] args)
{
using (Aes myAes = Aes.Create())
{
myAes.Mode = CipherMode.ECB;
myAes.Key = Convert.FromBase64String("gHyP6i8mXqmdFK4rKsKP7EqvzfxwbtyE");
string plaintext = "test";
Console.WriteLine($"Plaintext : {plaintext}");
ICryptoTransform encryptor = myAes.CreateEncryptor();
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plaintext);
}
byte[] encrypted = msEncrypt.ToArray();
string encryptedString = Convert.ToBase64String(encrypted);
Console.WriteLine($"Encrypted : {encryptedString}");
}
}
}
}
}
}
配置:
ECB mode,
256 key size,
sample key string = "gHyP6i8mXqmdFK4rKsKP7EqvzfxwbtyE",
sample plaintext to encrypt = "test",
My output = "/Ylo00TXuzmuBNYPZy5YOA=="
Online output = "yyO1N4G9uxXJlQ8FLU3KfQ=="
256 密钥大小表示密钥长度为 256 位(32 字节)。由于示例密钥字符串的长度已经是 32 字节,因此使用 Base64 进行解码将导致密钥大小变为 192 位(24 字节)长。因此,您应该使用
Encoding.UTF8.GetBytes
等方法将键字符串转换为字节数组,而不是使用FromBase64String
。