首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# AES-128 CFB错误

C# AES-128 CFB错误
EN

Stack Overflow用户
提问于 2012-08-02 19:11:05
回答 2查看 2.8K关注 0票数 0

我目前以这种方式设置RijndaelManaged (由于服务器处理加密的方式,IV和密钥是相同的)。服务器也使用CFB8作为模式,我的设置正确吗?

代码语言:javascript
复制
    public static RijndaelManaged GenerateAES(byte[] key)
    {
        RijndaelManaged cipher = new RijndaelManaged();
        cipher.Mode = CipherMode.CFB;
        cipher.Padding = PaddingMode.None;
        cipher.KeySize = 128;
        cipher.Key = key;
        cipher.IV = key;

        return cipher;
    }

我这样写数据: ICryptoTransform e= GenerateAES(key).CreateEncryptor();

代码语言:javascript
复制
        using(CryptoStream stream = new CryptoStream(BaseStream, e, CryptoStreamMode.Write))
        {
            stream.WriteByte(b);
            stream.FlushFinalBlock();
        }

BaseStream是我打开的NetworkStream,'b‘是我发送给函数的值。

当我尝试对流执行0x00 (作为测试)时,我得到以下错误:

代码语言:javascript
复制
System.Security.Cryptography.CryptographicException: Length of the data to encrypt is invalid.
at System.Security.Cryptography.RijndaelManagedTransform.EncryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()

我只是测试这个函数是否可以在不依赖任何外部库的情况下与服务器通信。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-02 20:16:16

您已经将PaddingMode设置为None,并试图加密比完整数据块更少的字节。加密更多的数据(cipher.BlockSize的倍数),或者将填充模式设置为None以外的其他值,以便自动填充到适当的长度。

编辑:

RijndaelManaged的默认FeedbackSize是128位,但您希望使用CFB8。如果将cipher.FeedbackSize设置为8,则可以将其用作流密码而无需填充,写入CryptoStream的每个字节都将立即加密并写入输出流。不应在每次写入后调用FlushFinalBlock,因为这会终止加密过程。

票数 6
EN

Stack Overflow用户

发布于 2015-03-14 02:09:05

这里提供了一个解决方案:https://stackoverflow.com/a/29038974/725903

其思想是包装传递给CryptoStream ctor的ICryptoTransform,该ctor处理TransformFinalBlock,在加密/解密之前添加所需的字节,并在返回时删除它们

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11776227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档