Реалізуйте програму шифрування 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 / ні
Під час шифрування повідомлення повинно бути отримано 10 випадкових байтів, таких як via /dev/urandom
, і записати їх у перші 10 байт зашифрованого виводу. При розшифровці повідомлення першими 10 байтами вводу є IV, який використовується для його шифрування.
Етап налаштування ключа RC4 / Arcfour виконується passphrase || IV
як ключ, де passphrase
вказана користувачем парольна фраза, IV
як описано вище, і ||
є конкатенацією. Отже, фразу "Привіт, світ!" І IV "суперкаліф" (однак малоймовірно, що це :-P) призведе до ключа "Привіт, світ! суперкаліф".
Кілька ітерацій налаштування ключів
Для того, щоб запобігти вразливості, яка зробила шифрування WEP повністю порушеним, цикл переміщення на етапі налаштування ключа RC4 виконує вказану користувачем кількість разів. Значення j
має зберігатися між ітераціями.
2. Тестові вектори
Ось кілька тестових векторів, які ви можете використовувати для тестування своїх програм. Крім того, гидливо гриф створив шифрування і дешифрування інструменту CipherSaber , який можна використовувати для перевірки результатів.
Вам потрібно лише реалізувати програму шифрування. Вам не потрібно надавати програму дешифрування, але результат вашої програми шифрування повинен правильно повернути вихідний вхід при обробці за допомогою правильно реалізованої програми дешифрування за допомогою правильного ключа.
urandom
(яка може бути окремим записом, якщо вам подобається), якщо ви дбаєте про "перемогу". :-)