我目前以这种方式设置RijndaelManaged (由于服务器处理加密的方式,IV和密钥是相同的)。服务器也使用CFB8作为模式,我的设置正确吗?
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();
using(CryptoStream stream = new CryptoStream(BaseStream, e, CryptoStreamMode.Write))
{
stream.WriteByte(b);
stream.FlushFinalBlock();
}BaseStream是我打开的NetworkStream,'b‘是我发送给函数的值。
当我尝试对流执行0x00 (作为测试)时,我得到以下错误:
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()我只是测试这个函数是否可以在不依赖任何外部库的情况下与服务器通信。
发布于 2012-08-02 20:16:16
您已经将PaddingMode设置为None,并试图加密比完整数据块更少的字节。加密更多的数据(cipher.BlockSize的倍数),或者将填充模式设置为None以外的其他值,以便自动填充到适当的长度。
编辑:
RijndaelManaged的默认FeedbackSize是128位,但您希望使用CFB8。如果将cipher.FeedbackSize设置为8,则可以将其用作流密码而无需填充,写入CryptoStream的每个字节都将立即加密并写入输出流。不应在每次写入后调用FlushFinalBlock,因为这会终止加密过程。
发布于 2015-03-14 02:09:05
这里提供了一个解决方案:https://stackoverflow.com/a/29038974/725903
其思想是包装传递给CryptoStream ctor的ICryptoTransform,该ctor处理TransformFinalBlock,在加密/解密之前添加所需的字节,并在返回时删除它们
https://stackoverflow.com/questions/11776227
复制相似问题