Jak prawidłowo przypuszczać przez CodeInChaos instancja SecureRandom jest stosowany w celu uzyskania losowego IV, jeśli przykład AESCipher
jest tworzony Cipher.ENCRYPT_MODE
. Jednak podajesz go jako parametr podczas tworzenia instancji Cipher w trybie deszyfrowania. Ten mały, bezsensowny fragment kodu pokazuje przykład.
public static void main(String[] args) throws Exception {
SecureRandom secRandom = SecureRandom.getInstance("SHA1PRNG");
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128, secRandom);
Key secretKey = kg.generateKey();
Cipher AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AESCipher.init(Cipher.ENCRYPT_MODE, secretKey, secRandom);
IvParameterSpec iv = new IvParameterSpec(AESCipher.getIV());
AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AESCipher.init(Cipher.DECRYPT_MODE, secretKey,iv, secRandom);
}
Również Twoje twierdzenie, że inicjujesz instancję SecureRandom ze statycznym nasieniem, sugeruje nieporozumienie tej klasy. SecureRandom nie gwarantuje, że otrzymasz te same dane wyjściowe, gdy dostarczysz ten sam materiał siewny. Jeśli przyjrzysz się uważnie Javadocs, zobaczysz, że próbuje dostarczyć prawdziwej entropii z innych źródeł, jeśli to w ogóle możliwe.
EDIT 1:
Dzięki owlstead na swoim zwykłym sumienności w przeglądzie odpowiedzi. Zobacz jego answer na pokrewne pytanie w celu dodatkowej dyskusji. Kod źródłowy SHA1PRNG jest dostępny online pod numerem here. Trochę to trudne, ale jeśli dostarczysz ziarno , zanim zapyta instancję o dowolne losowe bajty, wynik będzie całkowicie deterministyczny. Moje wcześniejsze stwierdzenie jest nieprawidłowe.
Dlaczego przekazujesz RNG do operacji deszyfrowania? Przypuszczam, że RNG jest używany do generowania IV, więc do odszyfrowania prawdopodobnie musisz przejść w IV, a nie RNG. – CodesInChaos
Dzięki. Dlaczego więc init dostaje secRandom w pierwszej kolejności? Czy to właściwy sposób, aby najpierw pobrać trochę bajtów z secRandom, zapisać je jako IV, a następnie użyć ich jako nowego parametru IvParameterSpec? Później przekazywanie IV do deszyfrowania w ten sam sposób? – user54000
To prawdopodobnie wymaga RNG, aby mógł sam utworzyć IV, zamiast zawracać sobie tym głowę. Ale nie jestem zaznajomiony z API Java Crypto. – CodesInChaos