Реализация 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
и равным j
0, затем сгенерируйте поток ключей следующим образом:
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
(которая может быть отдельной записью, если хотите), если вы хотите «выиграть». :-)Python 2 -
373350326317 байтПиф, возможно, придет позже. Определяет одну функцию,
c(p,d,r,m)
которая принимает байтовые списки для парольной фразы и данных, и int для повторов и режим, который шифрует, когда 1, и дешифрует, когда 0. Это происходит потому, что единственная разница в них связана с IV. Возвращает список байтов.Вот некоторые тестовые коды / вспомогательные функции:
источник
else:v,d=d[:10],d[10:]
часть.Рубин - 263 символа
Это мой ответ Ruby на первоначальный вопрос о stackoverflow еще в 2010 году! Это кодер и декодер все в одной программе
Параметры являются:
е или г (для кодирования или декодирования)
ключевое
число раз
источник
C, 312 байтов
Принимает количество итераций ключа и ключа в командной строке, а затем шифрует все данные с stdin на stdout. При этом используется библиотечная функция BSD / Darwin
arc4random()
, которая является PRNG на основе RC4. Он автоматически запускается, поэтому результаты будут отличаться каждый раз.Tidier версия:
Пример:
источник
Питон - 266 символов
Это мой ответ Python на оригинальный вопрос о стекаповороте еще в 2010 году! Это кодер и декодер все в одной программе
Параметры являются:
е или г (для кодирования или декодирования)
ключевое
число раз
Эта версия пытается объединить 2 цикла rc4 в один (пока сохраняет 11 байт ...)
источник