Zaimplementuj program szyfrujący CipherSaber , jak opisano poniżej. Wytyczne:
- Najmniejszy wpis w bajtach wygrywa.
- Jednak w odejściu od norm kodowania golfa możesz publikować ciekawe wpisy, nawet jeśli nie są to poważne wpisy w golfa.
- Wpis zwykle oznacza program, który pobiera zwykły tekst ze standardowego wejścia i zapisuje tekst zaszyfrowany na standardowym wyjściu, z kluczem określonym (przez użytkownika) w dowolny sposób.
- Jeśli jednak chcesz zastosować to jako procedurę, to też jest w porządku.
- IV musi pochodzić z kryptograficznie bezpiecznego generatora liczb pseudolosowych. Jeśli Twój język tego nie obsługuje, wybierz inny. ;-)
- Nie używaj żadnych bibliotek, wywołań systemowych ani instrukcji specyficznych dla kryptografii (innych niż PRNG, jak określono powyżej). Oczywiście ogólne operacje bitowe niskiego poziomu są w porządku.
CipherSaber jest odmianą RC4 / Arcfour, więc zacznę od opisania tego drugiego, a następnie zmian wprowadzonych przez CipherSaber.
0. RC4 / Arcfour
Arcfour jest w pełni określony gdzie indziej , ale dla kompletności opiszę go tutaj. (W przypadku jakichkolwiek rozbieżności między szkicem internetowym a tym opisem ten pierwszy ma charakter normatywny).
Konfiguracja klucza
Skonfigurować dwie tablice, S
i S2
, oba o długości 256, gdzie k_1
znajduje się pierwszy bajt klucza i k_n
jest ostatnim.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
jest wypełniony bajtami klucza, raz po raz, aż wszystkie 256 bajtów zostaną wypełnione).
Następnie zainicjuj wartość j
0 i potasuj 256 razy:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
To kończy konfigurację klucza. S2
Tablica nie jest już używana tutaj i może być usunięty.
Generowanie strumienia szyfrów
Zainicjuj i
i j
na 0, a następnie wygeneruj strumień kluczy w następujący sposób:
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
Szyfrowanie / deszyfrowanie danych
- Aby zaszyfrować, XOR wyjściowy strumień kluczy za pomocą zwykłego tekstu
- Aby odszyfrować, XOR wyjście klucza z tekstem zaszyfrowanym
1. CipherSaber
CipherSaber (który implementujemy w tym pytaniu) jest odmianą RC4 / Arcfour na dwa sposoby:
10 bajtów IV / nonce
Podczas szyfrowania wiadomości należy uzyskać 10 losowych bajtów, takich jak via /dev/urandom
, i zapisać je w pierwszych 10 bajtach zaszyfrowanego wyjścia. Podczas odszyfrowywania wiadomości pierwsze 10 bajtów wejścia to IV użyte do ich zaszyfrowania.
Etap konfiguracji klucza RC4 / Arcfour jest uruchamiany z passphrase || IV
kluczem, gdzie passphrase
jest określone przez użytkownika hasło, IV
jest jak opisano powyżej i ||
jest konkatenacją. Więc hasło „Witaj, świecie!” a IV „superkalifa” (jakkolwiek mało prawdopodobne jest to :-P) skutkowałoby kluczem „Witaj, świecie! superkalif”.
Wiele iteracji konfiguracji klucza
Aby zapobiec usterce, która spowodowała całkowite złamanie szyfrowania WEP, pętla tasowania etapu konfiguracji klucza RC4 jest uruchamiana określoną liczbę razy. Wartość j
należy zachować między iteracjami.
2. Wektory testowe
Oto kilka wektorów testowych, których możesz użyć do przetestowania swoich programów. Ponadto, Squeamish ossifrage stworzył narzędzie do szyfrowania i deszyfrowania CipherSaber , którego można użyć do sprawdzania poprawności wyników.
Wystarczy zaimplementować program szyfrujący. Nie trzeba dostarczać programu deszyfrującego, ale dane wyjściowe programu szyfrującego muszą poprawnie przechodzić do oryginalnego wejścia, gdy są przetwarzane za pomocą poprawnie zaimplementowanego programu deszyfrującego przy użyciu właściwego klucza.
źródło
urandom
(która może być osobnym wpisem, jeśli chcesz), jeśli zależy ci na „wygraniu”. :-)Python 2 -
373350326317 bajtówPyth może przyjdzie później. Definiuje jedną funkcję,
c(p,d,r,m)
która pobiera listy bajtów dla hasła i danych oraz int dla powtórzeń i trybu, który szyfruje, gdy 1, i odszyfrowuje, gdy 0. Jest tak, ponieważ jedyną różnicą w nich jest IV. Zwraca listę bajtów.Oto niektóre funkcje kodu testowego / pomocnika:
źródło
else:v,d=d[:10],d[10:]
część.Rubin - 263 znaków
To jest moja Rubinowa odpowiedź na oryginalne pytanie dotyczące stackoverflow w 2010 roku! Jest to enkoder i dekoder w jednym programie
Parametry są następujące:
E lub D (do kodowania lub dekodowania)
klucza
liczbę razy
źródło
C, 312 bajtów
Akceptuje klucz i liczenie iteracji mieszania kluczy w wierszu poleceń, a następnie szyfruje wszystko na standardowym wejściu na standardowe wyjście. Korzysta z funkcji biblioteki BSD / Darwin
arc4random()
, która jest PRNG opartym na RC4. Automatycznie się wysiewa, więc wyniki będą za każdym razem inne.Wersja Tidier:
Przykład:
źródło
Python - 266 znaków
To jest moja odpowiedź Pythona na pierwotne pytanie dotyczące stackoverflow w 2010 roku! Jest to enkoder i dekoder w jednym programie
Parametry są następujące:
E lub D (do kodowania lub dekodowania)
klucza
liczbę razy
Ta wersja próbuje połączyć 2 pętle rc4 w jedną (zapisuje do tej pory 11 bajtów ...)
źródło