【问题标题】:Problems with Padding.None in RijndaelManaged in CFB modeCFB 模式下 RijndaelManaged 中的 Padding.None 问题
【发布时间】:2014-05-03 16:45:12
【问题描述】:

我已经在互联网和 Stack Overflow 上进行了搜索,但我找不到以下问题的解决方案:

我想在 CFB 模式下使用 AES 算法加密和解密数据。据我所知,CFB 模式不需要填充,加密数据的大小与未加密数据的大小相同。但是,当我将 Padding 设置为 None 并将标准反馈大小保持在 128 位时,我收到一个异常,指出要写入/加密的数据长度无效。

当我将反馈大小更改为 8 位时,一切正常。但这是一个极其低效且因此缓慢的加密过程。据我了解,CFB 可以使用标准反馈大小并处理比块的全长短的数据。

初始化代码:

RijndaelManaged aes_algorithm = new RijndaelManaged();
ICryptoTransform crypto_transform;
CryptoStream crypto_stream;

aes_algorithm.Mode = CipherMode.CFB;
aes_algorithm.Padding = PaddingMode.None;
aes_algorithm.FeedbackSize = 128;
aes_algorithm.KeySize = aes_key.Length * 8;
aes_algorithm.BlockSize = aes_iv.Length * 8;
crypto_transform = aes_algorithm.CreateEncryptor(aes_key, aes_iv);

加密

MemoryStream Memory = new MemoryStream();
crypto_stream = new CryptoStream(Memory, crypto_transform, CryptoStreamMode.Write);
crypto_stream.Write(Input, 0, Input.Length);
crypto_stream.FlushFinalBlock();
crypto_stream.Dispose();
crypto_transform.Dispose();
byte[] Output = Memory.ToArray();
Memory.Dispose();

那么我做错了什么还是 .NET 中的错误?我刚刚找到这个话题C# AES-128 CFB Error,但也没有真正的解决方案,除了手动缩短加密数据(这不是一个很好的解决方案,而只是一种解决方法)。

【问题讨论】:

  • CFB模式每次加密FeedbackSize位,如果设置为128,肯定需要padding。但是即使使用FeedbackSize = 8 也无法让它工作,你能告诉我你是怎么做到的吗?

标签: c# encryption aes


【解决方案1】:

CFB模式通常实现为CFB-8,即一次加密8位。

参见维基百科:Cipher feedback

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多