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.
źródło
/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).Odpowiedzi:
GolfScript, 53 znaki
Jest to zadanie, do którego GolfScript wydaje się być idealnie dopasowany.
Aby kod był krótki, używam tego samego kodu zarówno do szyfrowania, jak i deszyfrowania: w celu odszyfrowania odejmuję klucz od tekstu zaszyfrowanego, podczas gdy w przypadku szyfrowania najpierw generuję losowy tekst zaszyfrowany, a następnie odejmuję od niego tekst jawny. Mimo to dodatkowy kod do implementacji trybu szyfrowania zajmuje nieco ponad połowę długości programu.
Wersja bez golfa z komentarzami:
źródło
Rubin (
200185)przykładowe przebiegi + wc:
źródło
s[k=(p=f).map{rand 26}],r[k,p,:-]
należy napisaćs[k=f.map{rand 26}],r[k,$_,:-]
$_
jest to tylko ostatni wiersz czytany przezgets
.f
robi to również.scan(/./).map{|b|b.ord-65}
po przeczytaniu linii.Haskell, 203 znaków
Przykład:
źródło
Perl,
220171 znakówPrzykładowy przebieg:
Uwaga: przynajmniej kiedy go uruchomię, na końcu ostatniego wyjścia dołącza się „Naciśnij dowolny klawisz, aby kontynuować ...”. Mam nadzieję, że jest to w porządku, ponieważ nie jest częścią programu. Jeśli nie, mogę to zrobić, aby pojawiło się w następnym wierszu.
To mój pierwszy prawdziwy program w Perlu i mój pierwszy golf w historii, więc naprawdę doceniłbym wskazówki. Znalazłem też
/(.)/g
w Internecie, ale nie mam pojęcia, jak to działa (czy to wyrażenie regularne? Jeszcze ich nie nauczyłem). Czy ktoś może mi to wytłumaczyć?EDYCJA: Dzięki Ilmari Karonen za pomoc przy regexpsie wykorzystałem moją nową wiedzę, aby uratować 7 postaci!
Rozszerzona, mało czytelna wersja:
źródło
/(.)/g
to wyrażenie regularne. Na pewno będziesz chciał się ich nauczyć, jeśli zamierzasz grać w golfa Perl. perldoc.perl.org/perlre.html nie jest złym miejscem początkowym.Python -
304295Uważam, że to dokładnie spełnia specyfikację
(w tymNie sprawdza poprawności danych wejściowych, więc myślę, że po prostu wyrzuci śmieci, jeśli podasz je poza znakami'>'
na początku monitów o wprowadzenie).[A-Z]
. Sprawdza także tylko pierwszą literę polecenia wejściowego. Wszystko, co zaczyna się od,D
spowoduje odszyfrowanie, a wszystko inne spowoduje szyfrowanie.źródło
>
, użyłem go tylko do zademonstrowania, które wiersze zostały wydrukowane. Nie musisz ich wdrażać.C ++ -
220241 znaków, 4 linieEdycja 1- Standardowa biblioteka MSVS wydaje się zawierać wiele niepotrzebnych plików, co oznaczało, że ios miał wszystkie potrzebne pliki, ale nie działało to z innymi kompilatorami. Zmieniono iOS dla rzeczywistych plików, które potrzebne funkcje pojawiają się w cstdlib i cstdio. Dzięki Ilmari Karonen za zwrócenie na to uwagi.
źródło
g++ otp.cpp
mówiotp.cpp: In function ‘int main()’: otp.cpp:3: error: ‘scanf’ was not declared in this scope otp.cpp:3: error: ‘rand’ was not declared in this scope otp.cpp:3: error: ‘puts’ was not declared in this scope otp.cpp:3: error: ‘puts’ was not declared in this scope
Python - 270
Przykładowe dane wyjściowe:
Liczba znaków:
źródło
J: 94 bajty
Wszystkie niezbędne białe pola zostały policzone.
Skomentowana wersja:
źródło
C # (
445416)Zapomniałem o agregacie. Odetnij trochę.
Nieco golfa:
}
Gra w golfa:
źródło
C (159 + 11 dla flag kompilatora)
Gra w golfa:
Nie golfowany:
Kompiluj z
-Dg=gets(s)
.Przykład:
źródło
JavaScript 239
Stosowanie:
źródło
Rubinowy -
184179177 znakówUruchom tak:
$ ruby pad-lock.rb
Oto wersja bez golfa, jeśli ktoś jest zainteresowany (nie jest to jednak do tej pory gra w golfa)
źródło