我正在尝试执行以下测试以返回应返回特定密码的结果。它们提供Key,IV和Plaintext字符串,如下所示。
但我得到“指定的初始化向量(IV)与此算法的块大小不匹配。”
我已经坚持了一段时间,找不到一个好的简单例子并尝试了一些组合。
下面是我的C#代码。我试着让它变得非常简单。
string AesPlainText = "1654001d3e1e9bbd036a2f26d9a77b7f";
string AesKey = "3ccb6039c354c9de72adc9ffe9f719c2c8257446c1eb4b86f2a5b981713cf998";
string AesIV = "ce7d4f9679dfc3930bc79aab81e11723";
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.KeySize = 256;
aes.IV = HexToByteArray(AesIV);
aes.Key = HexToByteArray(AesKey);
aes.Mode = CipherMode.CBC;
// Convert string to byte array
byte[] src = Encoding.Unicode.GetBytes(AesPlainText);
// encryption
using (ICryptoTransform encrypt = aes.CreateEncryptor())
{
byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
// Convert byte array to Base64 strings
Console.WriteLine(Convert.ToBase64String(dest));
}
更新每次答案:
谢谢,很好的观察。我在上面的例子中更改了Encoding.UTF8.GetBytes以使用HexToByteArray,它现在可以正常工作。
public static byte[] HexToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}
答案 0 :(得分:3)
您的明文,密钥和IV似乎以十六进制指定,因此您需要解码十六进制以获取基础字节而不是执行UTF8编码。
您可以从十六进制here获取一个字节数组。请注意,方法的名称应该包含十六进制内容,不要将其称为StringToByteArray
或atoi
或类似的傻事。