【问题标题】:AES decryption The input data is not a complete blockAES解密 输入数据不是一个完整的块
【发布时间】:2017-02-04 04:05:00
【问题描述】:

我正在尝试加密 string 并使用 AES 对其进行解密。加密工作正常,但解密时出现The input data is not a complete block 错误。我的填充有问题吗?

var aes = System.Security.Cryptography.Aes.Create();
aes.GenerateKey();
aes.GenerateIV();
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;

var desEncrypter = aes.CreateEncryptor();
var buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(text);

finalV = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length));

var desDecrypter = aes.CreateDecryptor();
var buff = System.Text.Encoding.ASCII.GetBytes(finalV);

var origValue = desDecrypter.TransformFinalBlock(buff , 0, buff .Length);

【问题讨论】:

    标签: c# encryption aes


    【解决方案1】:

    您正在通过将字节转换为 Base64 来创建 finalV。为了将其转换回字节,您需要调用Convert.FromBase64String(finalV)

    您正在调用 ASCII.GetBytes(finalV),它会为您获取表示该 Base64 文本的字节,而不是原始字节。

    编辑

    不知道你在哪里卡住了,但这里是基于你的工作代码,所以你可以区分它,看看你在哪里得到错误:

    string text = "ABC";
    
    var aes = System.Security.Cryptography.Aes.Create();
    aes.GenerateKey();
    aes.GenerateIV();
    aes.Mode = CipherMode.CBC;
    aes.Padding = PaddingMode.PKCS7;
    
    var desEncrypter = aes.CreateEncryptor();
    var buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(text);
    
    var finalV = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length));
    
    var desDecrypter = aes.CreateDecryptor();
    var buff = Convert.FromBase64String(finalV);
    
    var origValue = desDecrypter.TransformFinalBlock(buff, 0, buff.Length);
    string result = Encoding.ASCII.GetString(origValue);
    Console.WriteLine(result);
    

    【讨论】:

    • 谢谢我已经解决了这个问题。现在我可以将解密后的值转换为byte[]。不过,我似乎无法将其转换为string。我试着打电话给System.Text.Encoding.UTF8.GetString(),它应该接受byte[],但我仍然收到这个错误。
    • 您的buff 作为字符串没有任何意义。这是加密的文本。假设你的加密代码没问题,那么origValue代表你的解密值。假设它最初是一个字符串,那就是你需要调用的那个:string decryptedText = Encoding.UTF8.GetString(origValue).
    • 是的,我已经尝试过了,但我收到了消息cannot implicitly convert from string to byte[]。我之前打印了origValue的类型进行验证,它是System.byte[]我不知道类型错误可能来自哪里。
    • 另外,我会查看 here 以获得更好的代码来简单地加密字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多