Реализация CipherSaber программы шифрования, как описано ниже. Методические рекомендации:
- Наименьшая запись в байтах побеждает.
- Тем не менее, отклоняясь от норм код-гольфа , вы можете размещать интересные записи, даже если они не являются серьезными.
- Запись обычно представляет собой программу, которая берет открытый текст из стандартного ввода и записывает зашифрованный текст в стандартный вывод с ключом, заданным (пользователем), каким вы предпочитаете.
- Однако, если вы хотите реализовать это как процедуру, это тоже хорошо.
- IV должен исходить из криптографически безопасного генератора псевдослучайных чисел. Если ваш язык этого не поддерживает, выберите другой. ;-)
- Пожалуйста, не используйте крипто-специфичные библиотеки, системные вызовы или инструкции (кроме PRNG, как указано выше). Конечно, обычные побитовые операции низкого уровня в порядке.
CipherSaber - это вариант RC4 / Arcfour, поэтому я начну с описания последнего, а затем внесенных в него изменений CipherSaber.
0. RC4 / Arcfour
Arcfour полностью указан в другом месте , но для полноты я опишу его здесь. (В случае любых расхождений между интернет-проектом и данным описанием, первое является нормативным.)
Настройка ключа
Настройка два массивов, Sи S2, как длины 256, где k_1находятся первые байты ключа, и k_nявляется последним.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2заполняется байтами ключа снова и снова, пока все 256 байтов не будут заполнены.)
Затем инициализируйте jдо 0 и перемешайте 256 раз:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
На этом настройка ключа завершена. Не S2массив больше не используется здесь, и может быть извлечен.
Генерация потока шифров
Инициализируйте iи равным j0, затем сгенерируйте поток ключей следующим образом:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
Шифрование / дешифрование данных
- Чтобы зашифровать, XOR вывод потока ключей с открытым текстом
- Чтобы расшифровать, XOR вывод ключевого потока с зашифрованным текстом
1. CipherSaber
CipherSaber (это то, что мы реализуем в этом вопросе) представляет собой вариант RC4 / Arcfour двумя способами:
10-байтовый IV / nonce
При шифровании сообщения необходимо получить 10 случайных байтов, например, через /dev/urandom, и записать их в первые 10 байтов зашифрованного вывода. При дешифровании сообщения первые 10 байтов ввода - это IV, используемый для его шифрования.
Этап настройки ключа RC4 / Arcfour запускается с passphrase || IVключом, в котором passphraseзаданная пользователем парольная фраза IVсоответствует описанной выше и ||представляет собой конкатенацию. Итак, фраза «Привет, мир!» и IV "supercalif" (хотя маловероятно, что это :-P) приведет к ключу "Hello, world! supercalif".
Несколько итераций настройки ключа
Чтобы предотвратить уязвимость, из-за которой шифрование WEP было полностью нарушено, цикл перестановки на этапе настройки ключа RC4 выполняется указанное пользователем число раз. Значение jдолжно сохраняться между итерациями.
2. Тестовые векторы
Вот несколько тестовых векторов, которые вы можете использовать для тестирования своих программ. Кроме того, брезгливо гриф создал шифрование и дешифрование инструмента CipherSaber , который можно использовать для проверки результатов.
Вам нужно только реализовать программу шифрования. Вам не нужно предоставлять программу дешифрования, но выходные данные вашей программы шифрования должны корректно возвращаться к исходному вводу при обработке с помощью правильно реализованной программы дешифрования с использованием правильного ключа.
urandom(которая может быть отдельной записью, если хотите), если вы хотите «выиграть». :-)