C# 使用AES解密少量字节
我正在尝试解密通过TCP套接字接收的一些数据。这是在CFB模式下使用C# 使用AES解密少量字节,c#,.net,aes,C#,.net,Aes,我正在尝试解密通过TCP套接字接收的一些数据。这是在CFB模式下使用RijndaelManaged类完成的。我的问题是,我不确定应该如何解密数据,因为我只处理几个字节(8到20个字节,取决于消息)。当我用一个10字节的byte[]调用TransformFinalBlock时,我得到一个异常消息:“要解密的数据长度无效。”如果我用这10个字节调用TransformBlock,我得到:“值无效”。因此,我的问题如下: 我收到的消息在前4个字节中具有消息其余部分的长度。如何解密这些字节以确定继续读取的
RijndaelManaged
类完成的。我的问题是,我不确定应该如何解密数据,因为我只处理几个字节(8到20个字节,取决于消息)。当我用一个10字节的byte[]调用TransformFinalBlock
时,我得到一个异常消息:“要解密的数据长度无效。”如果我用这10个字节调用TransformBlock
,我得到:“值无效”。因此,我的问题如下:
我收到的消息在前4个字节中具有消息其余部分的长度。如何解密这些字节以确定继续读取的长度
即使我临时将要读取的字节数硬编码为10(对于此特定消息)并从网络中读取,我如何解密这10个字节
我还尝试使用加密流
直接从我的网络流
读取它。然而,对它的任何读调用似乎都会无限期地阻塞。我有一种感觉,它期望发送更多的数据(可能是一个字节大小的完整块)
我无法访问在网络上发送此数据的其他节点,因此我无法更改协议,使其在开头包含未加密的字节,以指示长度或任何内容。另外,假定还有其他人成功地与此通信,因此这一定是可能的。当您处理TCP流时,如果您使用长度前缀,通常必须以某种形式缓冲您的数据,读取时有一个阶段“读取长度”,当满足该长度时,您将切换到“读取数据”,您将已读取的字节发送出去,然后切换回“读取长度”
请记住,您可能不会在一次读取中收到发送的所有信息,或者您可能会在一次读取中收到多个发送信息
长度也是加密的吗?可能是长度是以未加密的方式预先结束的,然后有效负载被加密了吗。。。如果在解密数据之前不知道要读多少,那么知道要读多少就会变得更加困难
建议:
4字节(还有其他方法)表示加密有效负载的长度
读取字节,直到接收到刚刚读取的长度
(解密有效负载)
4字节
N字节
(解密)
连接流时重复此操作
如果您可以控制加密端
函数接收输入字节
Encrypt返回已加密的字节
发送加密字节长度(4字节)
发送加密字节
对每个输入块重复此操作。当使用特定块大小为N的密码系统时,输出中的每一位取决于输入中至少N位的状态。在许多现代系统(如AES)中,块大小将为128或256位(即16或32字节)。尽管有一些加密文件的方案,其长度不是块大小的倍数,而不需要填充(例如,如果文件是256位的倍数,加上额外的32位,通常的方案是通过加密最后224个加密位和剩余32个未加密位组成的块来结束加密)通常不可能加密比块小的任何内容
您要么必须加密文件的前16/32字节,使用长度,然后将读取的“额外”12或28字节视为第一个数据项的一部分,要么要求数据项的最小长度为16或32字节,并单独加密,使长度不加密。我能够部分解决此问题(我的第2个问题)使用BouncyCastle库而不是内置的.NET AES类
我首先尝试使用PKCS7手动填充加密数据(我相信这是AES支持的唯一填充方案)。在手动填充的数据上使用RijndaelManaged
类会导致“填充无效且无法删除”异常。因此,我尝试使用BouncyCastle库:
CfbBLockCipher cipher = new CfbBlockCipher(new AesEngine(), 128);
cipher.Init(false, new ParametersWithIV(new KeyParameters(key), iv));
cipher.DecryptBlock(encrypted, 0, decrypted, 0);
它工作得很好。我不知道这是不是.NET中的一个bug或者什么,但希望这能帮助其他遇到这个问题的人
现在,如果我能找出如何解密前四个字节,这样我就能知道消息的长度…(我的#1问题)
编辑:
如果我使用BouncyCastle的PaddedBufferBlockCipher
解密时会出现“pad block corrupted”错误。这些数据有些奇怪,我只能在单个块中手动解密,只能使用BouncyCastle进行解密。(NET的TransformBlock
只为解密值提供零字节).我真的不知道答案,但这与加密填充有关。实际上,可以使用块密码对不完整的块进行加密,而不会产生任何开销。为什么不等待剩余的字节?@usr是的,我认为某种类型的手动填充可以帮助我解决#2,但我仍然不知道如何处理#1。你确定吗长度字段已编码?@sprinter252-我如何知道在网络流上是否有更多的字节可读取?
?如何仅解密前4个字节(或所有字节,假设我能计算出所有字节的数量)?在我的10字节消息示例中,所有10个字节都是加密的。通常我希望读取前4个字节以确定剩余的字节数,但前4个字节也是加密的。理想情况下,我希望解密这些字节,然后根据解密的值读取剩余的字节,然后解密剩余的字节。但我不能t似乎一次只解密4个字节(也不是6或10个)。您“真的”需要加密长度吗?