2011-02-09 8 views
7

z tego, co wiem, tryb CTR nie wykorzystuje początkowego wektora. Po prostu bierze licznik, szyfruje go za pomocą danego klucza, a następnie XOR jest wynikiem z tekstem jawnym w celu uzyskania zaszyfrowanego tekstu.Tryb CTR z użyciem wektora początkowego (IV)

Inne tryby szyfrowania blokowego, takie jak CBC, przed wykonaniem szyfrowania XOR tekst jawny z początkowym wektorem.

Oto mój problem. Mam następujący kod w Javie (przy użyciu biblioteki bouncycastle):

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); 

cipher.init(Cipher.ENCRYPT_MODE, key); 

byte[] result = cipher.doFinal("Some plaintext"); 

Każde inne połączenie powyższego kodu z tym samym kluczem daje inne wyjście! Ale kiedy wykonuję:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); 

cipher.init(Cipher.ENCRYPT_MODE, key, IV); 

byte[] result = cipher.doFinal("Some plaintext"); 

Podejmuję ten sam wynik w każdym wywołaniu powyższego kodu. Ale dlaczego tak jest? Chodzi mi o to, że CTR nie potrzebuje IV, więc dlaczego, gdy nie podaję IV w każdym wywołaniu, otrzymuję inny wynik i kiedy podaję IV, to zwraca ten sam wynik? Jeśli zawsze korzystam z powyższego IV (wszystkie zera) podczas używania CTR, czy to będzie bezpieczne?

Wszelkie pomysły byłyby bardzo pomocne. Dziękujemy

+2

[Jeśli wpisujesz litery AES do kodu, robisz to źle.] (Http://chargen.matasano.com/chargen/2009/7/22/if-youre-typing-the -letters-aes-into-your-code-youre-doing.html) –

+0

Crypto * naprawdę łatwo * zepsuć. I zepsuć sposoby, które są całkowicie niewidoczne, dopóki ktoś ich nie wykorzysta. Zamiast tego należy użyć uznanej biblioteki z trudnym do zerwania interfejsem. –

+2

@Anon. Nawet wybieram własną IV, proszę przyjdź i zabij mnie teraz. (Podpowiedź: niektórzy ludzie wiedzą, co robią, ta ogólna rada nie wpisywania AES do twojego kodu jest głupia.) – Luc

Odpowiedz

5

najważniejszym zastrzeżenie w trybie CTR jest to, że nigdy, przenigdy ponownie użyć tej samej wartości licznika z tym samym kluczem. Jeśli to zrobisz, skutecznie oddałeś swój tekst jawny.

Aby temu zaradzić, w niektórych rzeczywistych implementacjach trybu CTR blok przekazywany do szyfru blokowego jest podzielony na dwie części, oznaczone jako IV i licznik (zamiast wywoływania całego problemu licznika)). Wartość IV generowana jest losowo, a licznik rozpoczyna się od 0.

Umożliwia to uruchomienie części "licznika" na zero dla wielu wiadomości, o ile nie użyjesz części "IV".

Pamiętaj jednak, że jest to tylko konwencja dotycząca etykietowania. Matematycznie jest to to samo, co wywołanie całej rzeczy jako "licznika" i uruchomienie licznika losowej wielokrotności pewnej liczby całkowitej dla każdej wiadomości.

Nie jestem pewien, w jaki sposób działa dmuchanie w Zamku, może to być ustawienie całego początkowego bloku, licznika i wszystkich, z wartością IV. Najwyraźniej generuje sensowną IV dla ciebie, jeśli jej nie dostarczysz, dlatego uzyskujesz różne wyniki z tym samym sygnałem wejściowym. Najważniejsze jest to, że jest to dobre, a dokładnie to, czego chcesz - dostarczanie wszystkich zer jest złe, a nie to, co chcesz.

+0

Dziękuję :) Teraz to rozumiem – Antonys

0

Tryb CTR używa czegoś, co jest zasadniczo równoważne z IV i jest to początkowa wartość licznika.

2

CTR działa poprzez szyfrowanie kolejnych wartości licznika. Pierwsza wartość dla tej sekwencji to IV (IV oznacza "wartość początkowa" ...). CTR naprawdę używa IV.

Jeśli używasz trybu CTR, używając tego samego klawisza i ponownie używasz wartości licznika, która była już użyta do innego szyfrowania (z tym samym kluczem), otrzymasz niesławny dwukrotny pad i zabezpieczenia spadł do dna. W szczególności używanie stałego IV dla wszystkich wiadomości jest pewną receptą na katastrofę.

„łatwą” sposobem na uniknięcie powtórzenia licznik jest zawsze wybrać IV ze kryptograficznego generatora liczb losowych (myślę „java.security.SecureRandom”) spośród zestawu możliwych IV, czyli wszystkich sekwencji 16-bajtowych. Ta przestrzeń jest wystarczająco duża, aby można było zaniedbać ryzyko ponownego użycia wartości licznika.

Aby być kompletnym, stały IV jest do przyjęcia, jeśli upewnisz się, że użyjesz danego klucza tylko raz. Problemy bezpieczeństwa pojawiają się, gdy ponownie używasz tego samego licznika z tym samym kluczem. Jednak posiadanie nowego klucza dla każdej wiadomości jest co najmniej tak samo trudne, jak posiadanie nowego IV dla każdej wiadomości.

Powiązane problemy