Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用AES解密少量字节_C#_.net_Aes - Fatal编程技术网

C# 使用AES解密少量字节

C# 使用AES解密少量字节,c#,.net,aes,C#,.net,Aes,我正在尝试解密通过TCP套接字接收的一些数据。这是在CFB模式下使用RijndaelManaged类完成的。我的问题是,我不确定应该如何解密数据,因为我只处理几个字节(8到20个字节,取决于消息)。当我用一个10字节的byte[]调用TransformFinalBlock时,我得到一个异常消息:“要解密的数据长度无效。”如果我用这10个字节调用TransformBlock,我得到:“值无效”。因此,我的问题如下: 我收到的消息在前4个字节中具有消息其余部分的长度。如何解密这些字节以确定继续读取的

我正在尝试解密通过TCP套接字接收的一些数据。这是在CFB模式下使用
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个)。您“真的”需要加密长度吗?