xXxRevolutionxXx Ответов: 1

Алгоритм шифрования с выходной длиной, идентичной входной длине


- Привет ! Поэтому мне нужно зашифровать AOB(массив байтов), но дело в том, что из того, что я читал о шифровании... заключается в том, что выход будет больше, чем вход. Возможно ли, чтобы длина зашифрованного AOB была одинаковой с незашифрованным AOB ?

Что я уже пробовал:

Я не мог найти решение этой конкретной проблемы.

F-ES Sitecore

Если вам нужно, чтобы зашифрованные данные были той же длины, что и исходные данные, то это требование возникло из-за плохого дизайна, и именно ваш дизайн должен быть изменен.

xXxRevolutionxXx

Ну ... поскольку это не большой проект.. и это только для меня... я хочу написать как можно меньше кода... и если есть способ иметь такую же длину... тогда это избавит меня от некоторых неприятностей.

F-ES Sitecore

Вы можете использовать алгоритм подстановки (всегда заменяйте одну букву на другую, например, "а" становится "м", и для расшифровки вы меняете все "м"на "А"), но это, вероятно, одна из самых слабых форм шифрования.

Wessel Beulink

1-способ incryption или 2-полосная incryption. Возможен 1-й путь. 2-не возможно шифрование всегда длиннее(если сохранять зашифрованные)

xXxRevolutionxXx

Это двустороннее шифрование. Можно ли тогда вычислить точную выходную длину на основе объема незашифрованных данных ?

Dave Kreskowiak

Не совсем.

Почему такое требование? Все, что вы делаете, имея это ограничение, - это даете полезную информацию злоумышленнику.

1 Ответов

Рейтинг:
9

Rob Philpott

Да. Если вы подумаете об этом, то для шифрования массива байтов вам нужно перевернуть примерно половину битов этих байтов, чтобы сделать числа совершенно разными. Вы можете сделать это, зафиксировав свой массив с равным размером массива хорошо распределенных псевдослучайных чисел, которые воспроизводимы с помощью некоторого секрета в качестве семени. Тот же процесс расшифровывает их снова-это симметричное шифрование.

Итак, в качестве простого небезопасного примера рассмотрим следующее:

Random r = new Random(<your secret seed, hashed from a password or like>);
byte[] yourData = .....
byte[] flips = new byte[yourData.Length];
r.NextBytes(flips);

// encrypt/decrypt
for (int i = 0; i < yourData.Length; i++) yourData[i] ^= flips[i];


Случайный класс недостаточно случайен для шифрования, вам нужно углубиться в пространство имен crypto для правильного кодирования силы шифрования.

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


xXxRevolutionxXx

@Rob Philpott я сделал что-то в этом роде. Моя функция шифрования запрашивает (строковый)пароль. Затем он получает байты для пароля, а затем использует байты пароля для шифрования сообщения. Хорошо в моем решении то, что нет необходимости иметь ключ с той же длиной, что и данные. Ключ может быть любым, каким вы хотите, и он не меняет размер файла. Я приму ваш ответ, потому что это почти то, что я сделал, и это единственное решение этой проблемы.