Получить длину CryptoStream в .Net - PullRequest
5 голосов
/ 26 октября 2011

Я работаю над программным обеспечением, которое шифрует / дешифрует файлы. Я хотел бы иметь возможность угадать длину данных после шифрования, но я не могу использовать CryptoStream.Length (он генерирует исключение NotSupportedException). Есть ли способ угадать это?

Я использую RijndaelManaged (.Net Framework 4.0)

Ответы [ 4 ]

4 голосов
/ 26 октября 2011

Это говорит о том, что это намного лучше, чем я могу http://www.obviex.com/Articles/CiphertextSize.aspx

Оттуда:

В наиболее общем случае размер зашифрованного текста можно рассчитать как:

CipherText = PlainText + Block - (Блок PlainText MOD)

где CipherText, PlainText и Block указывают размеры зашифрованного текста, открытого текста и блока шифрования соответственно. По существу, результирующий размер зашифрованного текста вычисляется как размер открытого текста, расширенного до следующего блока. Если используется заполнение и размер открытого текста является точным кратным размеру блока, будет добавлен один дополнительный блок, содержащий информацию заполнения.

Допустим, вы хотите зашифровать девятизначный номер социального страхования (SSN), используя алгоритм шифрования Rijndael с 128-битным (16-байтовым) размером блока и заполнением PKCS # 7. (В целях иллюстрации предположим, что тире удаляются из значения SSN перед шифрованием, так что «123-45-6789» становится «123456789», а значение обрабатывается как строка, а не как число.) Если цифры в SSN определены как символы ASCII, размер зашифрованного текста можно рассчитать как:

CipherText = 9 + 16 - (9 MOD 16) = 9 + 16 - 9 = 16 (байт)

Обратите внимание, что если размер значения открытого текста является точным кратным размеру блока, к зашифрованному тексту будет добавлен дополнительный блок, содержащий информацию о заполнении. Например, если вы хотите зашифровать 16-значный номер кредитной карты (определяется как 16-символьная строка ASCII), размер зашифрованного текста будет:

CipherText = 16 + 16 - (16 MOD 16) = 16 + 16 - 0 = 32 (байт)

0 голосов
/ 26 июля 2017

Вы можете использовать эту функцию для получения длины и данных.

public static int GetLength(CryptoStream cs, out byte[] data)
{
    var bytes = new List<byte>();

    int b;
    while ((b = cs.ReadByte()) != -1)
        bytes.Add((byte)b);

    data = bytes.ToArray();

    return data.Length;
}
0 голосов
/ 30 июня 2013

Это мой код с RijndaelManaged:

MemoryStream textBytes = new MemoryStream();

string password = @"myKey123"; // Your Key Here

UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);

FileStream fsInput = new FileStream(@"C:\myEncryptFile.txt", FileMode.Open);

RijndaelManaged RMCrypto = new RijndaelManaged();

CryptoStream cs = new CryptoStream(fsInput, RMCrypto.CreateDecryptor(key, key),
                                    CryptoStreamMode.Read);
cs.CopyTo(textBytes);

cs.Close();
fsInput.Close();

string myDecriptText = Encoding.UTF8.GetString(textBytes.ToArray());
0 голосов
/ 26 октября 2011

Это зависит от используемого вами шифра ... обычно длина равна длине исходного потока ... в худшем случае он дополняется кратным длине блока шифра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...