【问题标题】:AES-ECB block-decryption in C#C# 中的 AES-ECB 块解密
【发布时间】:2020-01-16 20:17:18
【问题描述】:

我编写了完全解密输入字符串的代码。但由于这是一种 ECB 模式,我想以某种方式解密的不是整个输入文本,而是一个单独的块。

据我了解,ECB AES 以 8 字节块进行加密。例如,如何将AES_Decrypt 函数添加到它,以便它只解密输入字符串的最后 8 个字节。

    byte[] bytesToBeDecrypted = new byte[32];

    byte[] 8_bytesToBeDecrypted = new byte[8];  // Only 8 bytes of bytesToBeDecrypted

    public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;

            string salt = "12345678";
            Encoding unicode = Encoding.Unicode;
            byte[] saltBytes = unicode.GetBytes(salt);

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;
                    AES.Padding = PaddingMode.Zeros;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 65535);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.ECB;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }
                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }

【问题讨论】:

  • AES 的块大小为 16 字节。你使用 Rijndael 和 Rijndael != AES。
  • 但是 AES 控制示例与我使用 Rijndael 得到的匹配
  • AES 具有 128 位的固定块大小和 128、192 或 256 位的密钥大小,而 Rijndael 可以指定 32 位的任意倍数的块和密钥大小,最小128 位,最大 256 位。
  • 如果使用 8 字节进行加密,剩下的就是填充。你使用 PaddingMode.Zeros 用 0 填充其余部分
  • 谢谢!使用 Rijndael 代替 AES 会降低工作速度吗?据我了解,Rijndael 比 AES 更通用?

标签: c# encryption aes


【解决方案1】:

您可能只是 Seek the MemoryStream 从开头开始使用 16 个字节的倍数(或者显然甚至是从流的最后部分开始的 16 个字节),然后然后连接 CryptoStream 以解密任何内容离开了。使用 CBC 会有点棘手,因为您必须将 IV 设置为前一个密文块,但使用 ECB 这应该是一件轻而易举的事。


注意事项:

  • 当然,您不需要为 ECB 模式设置 IV,这不应该是必需的。
  • 块大小为 128 的 Rijndael 实际上是 AES。顺便说一句,C#/.NET 只支持 Rijndael 的一个子集:如果我没记错的话,只支持 64 个块大小和密钥大小的增量。
  • 我仍然会使用 aes = Aes.Create() 而不是 aes = new RijndaelManaged(),因为这会将 AES 实现的选择留给系统,并且它可能会选择硬件加速的而不是托管的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多