【问题标题】:C# AES PKCS #7 wrong padding bytes?C# AES PKCS #7 错误的填充字节?
【发布时间】:2013-11-14 19:56:37
【问题描述】:

我在 C# 中设置了一个简单的对称 AES-en/解密,但我遇到了填充问题。根据MSDN,PKCS #7 的填充字节应该是0x07,但在我的情况下它只是零字节(0x00)。

这怎么可能?似乎这在 .NET 中没有正确实现...

这是我的代码:

Aes aes = new AesManaged();
aes.Key = new byte[] { /* ...  */ };
aes.IV = new byte[] { /* ... */ };
// Debugging shows:
// aes.Padding = PaddingMode.PKCS7

// the data to encrypt (1 byte only, to demonstrate padding)
byte[] plainData = new byte[1] { 0xFF };
byte[] encData;

// (encrypt)
using (MemoryStream encStream = new MemoryStream())
{
    using (CryptoStream cryptoStream = new CryptoStream(encStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
    {
        cryptoStream.Write(plainData, 0, plainData.Length);
    }
    encData = encStream.ToArray();
}

// (new length is 16 bytes (128 bits), incl. padding)
plainData = new byte[16];

// (decrypt)
using (MemoryStream decrStream = new MemoryStream(encData))
{
    using (CryptoStream cryptoStream = new CryptoStream(decrStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
    {
        cryptoStream.Read(plainData, 0, plainData.Length);
    }
}

// output:
// 16 bytes,
// 1st byte = 0xFF,
// other 15 bytes = 0x00 (instead of 0x07!)

【问题讨论】:

  • 你能不能不要把你的问题标题和关键词叠加起来?没有必要——这就是标签部分的用途。你能花点时间把它编辑成可读的东西吗?
  • 提个建议,不知道还能选什么。

标签: c# aes padding pkcs#7


【解决方案1】:

解密器正确删除了加密器应用的填充,因此输出中的零字节只是原始 plainData 数组中未触及的字节。 cryptoStream.Read(...) 调用返回一个整数,指示已读取的字节数(在本例中为 1),您应该使用它来确定输出数组中有多少字节是有效数据。

如果出于某种原因您有兴趣查看填充字节,您可以设置aes.Padding = PaddingMode.None;执行加密之后,但创建解密器之前。然后你会发现cryptoStream.Read(...) 返回16,而plainData 的第一个字节是0xff,然后是15 个字节的0x0f 填充(不知道为什么你的问题表明你期待0x07) .

【讨论】:

  • 这绝对有道理!我一定是瞎了眼……谢谢!
【解决方案2】:

对于 PKCS7 模式,它应该是 blocksize - contentsize,即在您的情况下为 16 - 1 = 15。您的错误是您希望在解密后进行填充,但在加密之前在内部进行填充。不保证plainData 将根据选择的模式包含填充字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-01-27
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多