Почему TransformBlock(byte[1]) дважды отличается от TransformBlock(byte[2])?

В реализации C# salsa20, если я вызываю метод TransformBlock два раза для блока размера 1, это отличается от вызова его один раз для блока размера 2, это проблематично, когда вы используете этот класс для шифрования объектов отправлено через BinaryFormatter.

Это по замыслу?

Чтобы исправить это, я поместил salsa20 в другой класс (шаблон проектирования декоратора), который генерирует и кэширует блоки по 64 байта за раз, в основном так (в упрощенном псевдокоде):

private Queue<byte> queue;
private ICryptoTransform salsa20CryptoTransform;
public int TransformBlock(byte[] input, byte[] output){
    while(input.Length > queue.Count){
        byte[] temp1 = new byte[64];
        byte[] temp2 = new byte[64];
        salsa20CryptoTransform.TransformBlock(temp1, temp2);
        foreach(byte b in  temp2){
            queue.Enqueue(b);
        }
    }
    for(int i = 0;i<input.Length;i++){
        output[i] = intput[i] ^ queue.Dequeue();
    }
}

Есть ли что-то, что меня должно беспокоить здесь с точки зрения безопасности?

1 ответ

Блоки - это блоки; Многие процессы сжатия и шифрования имеют специальное разграничение блоков, где они по существу сбрасывают несколько вещей - делая блок единицей (потенциально также минимальную единицу, которую можно расшифровать, что является важным соображением для потоковых API). Важный вопрос, однако, заключается не в том, "зашифрованы ли данные" - честно говоря, это не обязательно. Во многих случаях было бы вполне законно, если бы он каждый раз по- разному шифровал его (посредством некоторой внутренней рандомизации). Единственный важный вопрос:

Если я расшифрую это соответствующим образом, с правильными ключами: я верну исходные данные?

Другие вопросы по тегам