2012-07-26 12 views
7

Sto provando a testare la crittografia/decodifica PBE. Ho scoperto che PBE genera la stessa chiave con diversi conteggi di sale e iterazione. Naturalmente, la password utilizzata è la stessa. Come ho capito, la stessa password e diverse sale/iterazione dovrebbero ottenere chiavi diverse. Qui di seguito è il mio codice di prova:Perché PBE genera la stessa chiave con un numero di sale e iterazione diverso?

import java.security.Key; 
import java.security.SecureRandom; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.PBEKeySpec; 

public class PBETest 
{ 
    public static void main(String[] args) 
     throws Exception 
    { 
     String algo = "PBEWithSHA1andDESede"; 
     System.out.println("====== " + algo + " ======"); 

     char[] password = "password".toCharArray(); 
     SecureRandom rand = new SecureRandom(); 
     byte[] salt = new byte[32]; 
     rand.nextBytes(salt); 
     int iterationCount = rand.nextInt(2048); 

     //encryption key 
     PBEKeySpec   encPBESpec = new PBEKeySpec(password, salt, iterationCount); 
     SecretKeyFactory encKeyFact = SecretKeyFactory.getInstance(algo); 
     Key encKey = encKeyFact.generateSecret(encPBESpec); 
     System.out.println("encryptioin iteration: " + iterationCount); 

     //decryption key 
     rand.nextBytes(salt); 
     iterationCount = rand.nextInt(2048); 
     PBEKeySpec   decPBESpec = new PBEKeySpec(password, salt, iterationCount); 
     SecretKeyFactory decKeyFact = SecretKeyFactory.getInstance(algo); 
     Key decKey = decKeyFact.generateSecret(decPBESpec); 
     System.out.println("decryptioin iteration: " + iterationCount); 

     System.out.println("encryption key is same as decryption key? " + encKey.equals(decKey)); 

    } 

} 

mi aspetto il risultato finale è un false. Ho fatto qualcosa di sbagliato?

risposta

4

Sei stato incredibilmente fortunato, e il tuo numero casuale di sali e iterazioni è appena coinciso. Vai direttamente a Las Vegas. Adesso. ;)

I Googled per PBEWithSHA1andDESede e rintracciato questo esempio: http://cryptofreek.org/2010/06/04/encrypting-and-decrypting-files-with-java cui si specifica la chiave sola con new PBEKeySpec(password) e crea un separato PBEParameterSpec utilizzando il sale e iterazione count che viene quindi passato al Cipher.init().

Quindi, no, non hai fatto nulla di male, ti sei appena fermato prima che il sale e il conteggio siano stati inseriti nel codice.

+0

Grazie a tbroberg per la risposta. 1, "i conteggi di sali e iterazioni sono appena coincisi". I conteggi di sale e di iterazione sono generati casualmente e non penso che possano corrispondere per ogni corsa in questo test. 2, "ti sei appena fermato prima che il sale e il conteggio si riempissero del codice". Intendi dire che il conteggio di sale e iterazione ha effetto solo quando viene eseguita la crittografia/decrittografia? 3, ho trovato le chiavi sono sempre "70 61 73 73 77 6f 72 64". Penso che sia per "password", e non è legato al conteggio di sale o iterazione. È un risultato corretto? – Michael

+0

# 2 e # 3 sembrano spiegare la situazione. Ho provato ad andare avanti per crittografare del testo, e i dati crittografati sono diversi ogni volta. Quindi la mia conclusione ora è: la chiave generata da SecretKeyFactory.generateSecret() è solo correlata alla password. Questo è vero almeno dal punto di vista del confronto, cioè key.getEncoded() è lo stesso. Il conteggio di sale e iterazione ha effetto quando si crittografa il testo normale. Grazie ancora per il vostro aiuto! – Michael

+0

Eccellente! (Il n. 1 era uno scherzo). Se hai trovato la risposta utile, contrassegnala per favore. : ^) – tbroberg

3

Se si utilizza PBKDF2WithHmacSHA1 anziché PBEWithSHA1andDESede, l'assunzione funziona in quanto supporta il sale. Hai solo bisogno di aggiungere un parametro del keyLength-PBEKeySpec:

 String algo = "PBKDF2WithHmacSHA1"; 

...

 PBEKeySpec decPBESpec = new PBEKeySpec(password, salt, iterationCount, 128); 

Ho eseguito un test e il risultato è: false.

Tuttavia, tenere presente che per il corretto funzionamento della crittografia e della decodifica è necessario utilizzare lo stesso conteggio di sale e iterazione durante la generazione della chiave.

Problemi correlati