1

好吧,这对我来说很奇怪。我有这个代码,它有效:

using (MemoryStream memStream = new MemoryStream(inBytes))
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
using (CryptoStream cs = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read))
{
    byte[] buffer;
    if (inBytes.Length < (1024 * 10)) buffer = new byte[inBytes.Length];
    else buffer = new byte[(1024 * 10)];
    long readBytes = 0;
    long totalBytes = inStream.Length;
    int currBytes;

    while (readBytes < totalBytes)
    {
        currBytes = cs.Read(buffer, 0, buffer.Length);
        fs.Write(buffer, 0, currBytes);
        readBytes += currBytes;
    }
}

这会将解密的数据写入文件。

然后我有这段代码做同样的事情,除了它写入(并返回) a MemoryStream

using(MemoryStream memStream = new MemoryStream(inBytes))
using(MemoryStream ms = new MemoryStream())
using (CryptoStream cs = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read))
{
    byte[] buffer;
    if (inBytes.Length < (1024 * 10)) buffer = new byte[inBytes.Length];
    else buffer = new byte[(1024 * 10)];
    long readBytes = 0;
    long totalBytes = inStream.Length;
    int currBytes;

    while (readBytes < totalBytes)
    {
        currBytes = cs.Read(buffer, 0, buffer.Length);
        ms.Write(buffer, 0, currBytes);
        readBytes += currBytes;
    }

    return ms;
}

在该行上,currBytes = cs.Read(buffer, 0, buffer.Length)我收到错误“要解密的数据长度无效”,但仅在第二组上,而不是在第一组上。“ICryptoTransform解密器”是从一种通用方法创建的,我知道它使用相同的密钥。

谁能告诉我为什么我不会在第一次出现这个错误,但会在第二次出现,以及(更重要的是)如何修复它。

而且,是的,我知道 DES 并不是最好的加密方法。这是概念验证性质的东西,在生产环境中永远不会出现。

4

2 回答 2

1

我今天遇到了这个错误,结果是我在一个函数中使用 ASCII 将一个源字符串转换为字节数组,而在另一个函数中使用 Base64 将另一个源字符串转换为字节数组。

可能是尽管您的输入长度正确,但它们没有使用相同的编码。

于 2012-09-27T08:27:35.470 回答
0

尝试将这些检查添加到两段代码中。我强烈怀疑其中一项或两项都失败了:

if ( inStream.Length != inBytes.Length )
  throw new Exception("inBytes read incorrectly");
if ( inBytes.Length % 8 == 0 )
  throw new Exception("inBytes is not a valid DES encryption");
于 2012-02-16T18:41:58.333 回答