tło
Szyfr z kluczem jednorazowym jest formą szyfrowania, który okazał niemożliwe do zgryzienia, jeśli są prawidłowo stosowane.
Szyfrowanie odbywa się poprzez pobranie zwykłego tekstu (składającego się tylko z liter AZ) i wygenerowanie losowego ciągu o tej samej długości (również tylko liter). Ten ciąg działa jak klucz. Każdy znak w tekście jawnym jest następnie sparowany z odpowiednim znakiem w klawiszu. Tekst zaszyfrowany jest obliczany w następujący sposób: Dla każdej pary oba znaki są konwertowane na liczby (A = 0, B = 1, ... Z = 25). Dwie liczby są dodawane modulo 26. Liczba ta jest konwertowana z powrotem na znak.
Deszyfrowanie jest dokładnie odwrotne. Znaki w tekście zaszyfrowanym i kluczu są sparowane i zamienione na liczby. Klucz jest następnie odejmowany od modulo 26 zaszyfrowanego tekstu, a wynik jest konwertowany z powrotem na znak AZ.
Wyzwanie
Twoim wyzwaniem jest napisanie możliwie najkrótszego programu, który może zarówno szyfrować, jak i deszyfrować jednorazowy pad.
W pierwszym wierszu wprowadzania (do STDIN) będzie słowo „ENCRYPT” lub słowo „DECRYPT”.
Jeśli słowo jest szyfrowane, następnym wierszem będzie zwykły tekst. Twój program powinien wypisać dwa wiersze (do STDOUT), pierwszy to klucz, a drugi to zaszyfrowany tekst.
Jeśli słowo jest deszyfrowane, twój program otrzyma jeszcze dwa wiersze wprowadzania. Pierwsza linia będzie kluczem, a druga linia będzie zaszyfrowanym tekstem. Twój program powinien wypisać jeden wiersz, który będzie odszyfrowanym tekstem jawnym.
Tekst jawny, tekst zaszyfrowany i klucz powinny zawsze składać się z wielkich liter AZ. Zawsze będą pojedynczą linią i nie będą zawierały białych znaków.
Klucz powinien zawsze być losowy. Żadne duże części nie powinny się powtarzać między seriami i nie powinno być żadnych wzorów, które można by znaleźć w tekście.
Dwa proste przykłady:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
>
Reprezentuje które linie są wyprowadzane, więc nie trzeba drukować ten symbol jako wyjścia.
/dev/random
, haveged
), szyfruj przez xoring porządków bajtami i odszyfruj xoring kluczami. gist.github.com/5078264 klucz lub losowość można odczytać ze standardowego wejścia, wiadomość lub tekst alternatywny mogą być argumentem nazwy pliku.
/dev/hwrng
zamiast pseudolosowego (co technicznie czyni go zepsutym).