加密和解密时出错。无法找到异常的原因


诸葛神侯
2025-03-12 05:47:12 (12天前)
  1. 0x.Length);
  2. // 完成


加密
</跨度>
处理
//cryptoStream.FlushFinalBlock();

  1. y = memoryStream.ToArray();
  2. }
  3. 回归y;
  4. }
  5. catch 使用the来加密对称公钥和Iv


非对称
</跨度>
我已创建的公钥。然后我尝试解密加密的字符串。

问题1
的目的是什么?

4 条回复
  1. 0# 一号位 | 2019-08-31 10-32



    问题1:这是您的代码,因此您应该知道为什么要编写代码(或者您可以提供从中获取代码的链接)。绝对不清楚为什么在读取数据时需要刷新流。



    问题2:在字节数组上创建MemoryStream时,流不可调整大小是合理的。在这种情况下,流不能改变其大小(通常用于读取,如您的情况)。正如我在问题1中所说,目前尚不清楚为什么你会在阅读时做Flush。



    问题3:您缺少在CryptoStream周围使用,因此很可能不会存储最后一部分数据。调用

    cryptoStream.FlushFinalBlock()

    在写入部分之前

    MemoryStream.ToArray()

    电话是一种选择,但是

    using

    会产生更清洁的代码。


  2. 1# 威斯特 | 2019-08-31 10-32



    奇怪的是,在解密时我只能进行写操作。就像是:




    1. var decryptMemoryStream = new MemoryStream();
      var decryptStream = new CryptoStream(decryptMemoryStream, iCryptoTransform , CryptoStreamMode.Write);

    2. //write the unencrypted data array to the stream
      decryptStream.Write(y, 0, y.Length);
      decryptStream.Flush();
      decryptStream.Close();

    3. var decryptedData = decryptMemoryStream.ToArray();

    4. </code>

  3. 2# 纾潆锦袖迷子 | 2019-08-31 10-32



    您正在使用PKCS填充进行加密(这是默认设置)。 AES / Rijndael是一个块密码,这意味着它一次只能加密16个字节的块。为了允许块密码加密任意大小的数据,我们使用填充算法。 PKCS填充的工作原理是在加密时加入1-16个字节,并在解密时删除它们。填充的长度在填充本身中编码。



    你需要的

    FlushFinalBlock

    加密时让CryptoStream知道没有更多的传入数据,它应该添加填充。在Read-mode中使用CryptoStream时,没有必要也不应该使用它。



    第一个例外是因为您使用明文数组作为MemoryStream的后备存储。由于填充,加密将大于明文。



    第二个例外是因为你删除了

    FlushFinalBlock

    语句,因为不允许MemoryStream调整大小以使数组具有正确的长度。加密数据应始终是16个字节的倍数,但由于MemoryStream将重用

    x



    y

    将具有相同的长度

    x

    ,这并不总是有效的长度。



    解决方案是:




    1. 使用

      FlushFinalBlock

      在SymmetricEncrypt中。


    2. 更换

      using (MemoryStream memoryStream = new MemoryStream(x))



      using (MemoryStream memoryStream = new MemoryStream(y))



      using (MemoryStream memoryStream = new MemoryStream())

      。这将允许

      MemoryStream

      s自由调整大小。

    3. </醇>

登录 后才能参与评论