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
[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) –
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. –
@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