CryptoStream: длина данных для расшифровки недопустима.Один и тот же код не генерирует ошибку на тех же данных - PullRequest
1 голос
/ 16 февраля 2012

Хорошо, это странно для меня.У меня есть этот код, который работает:

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 не самый лучший метод шифрования.Это нечто вроде доказательства концепции, которое никогда не увидит свет в производственной среде.

Ответы [ 2 ]

1 голос
/ 27 сентября 2012

Сегодня я столкнулся с этой ошибкой, и оказалось, что я преобразовал одну исходную строку в байтовый массив, используя ASCII в одной функции, а другую - Base64 в другой функции.

Возможно, что ваши входные данные имеют правильную длину, но они не используют одинаковую кодировку.

0 голосов
/ 16 февраля 2012

Попробуйте добавить эти проверки к обеим частям кода.Я сильно подозреваю, что один или оба из этих сбоев:

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");
...