Come ipotizzato correttamente CodeInChaos, l'istanza SecureRandom è usato per derivare una IV casuale quando l'istanza AESCipher
viene creato con Cipher.ENCRYPT_MODE
. Tuttavia, lo si fornisce come parametro durante la creazione di un'istanza Cipher in modalità decrittografia. Questo piccolo frammento di codice senza senso mostra un esempio.
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);
}
Inoltre, la tua affermazione che si inizializza l'istanza SecureRandom con un seme statica suggeriscono un equivoco di quella classe. SecureRandom non garantisce che otterrai lo stesso risultato quando fornisci lo stesso seme. Se osservi attentamente lo Javadocs vedrai che tenta di fornire qualche vera entropia da altre fonti, se possibile.
EDIT 1:
Grazie a owlstead per la sua solita meticolosità nel rivedere le risposte. Vedere il suo answer a una domanda correlata per ulteriori discussioni. Il codice sorgente per SHA1PRNG è disponibile online here. È un po 'difficile da seguire, ma se fornisci un seme prima del chiedendo l'istanza per ogni byte casuale, l'output sarà completamente deterministico. Quindi la mia affermazione precedente non è corretta.
fonte
2013-01-02 19:37:51
Perché si passa un RNG all'operazione di decrittografia? Immagino che l'RNG sia usato per generare l'IV, quindi per la decrittografia probabilmente devi passare nella IV e non in un RNG. – CodesInChaos
Grazie. Quindi perché init ottiene un secRandom in primo luogo? È il modo corretto per ottenere alcuni byte dal secRandom, salvarli come IV e quindi usarli come se si usasse un nuovo IvParameterSpec? Successivamente passare la IV alla decrittografia nello stesso modo? – user54000
Probabilmente prende l'RNG in modo che possa creare la IV stessa invece di infastidirla. Ma non ho familiarità con le API di java crypto. – CodesInChaos