Erzeugung von Zufallszahlen IV für AES in Java
Ich bin Implementierung und AES-Verschlüsselungs-engine für PBE in android, und ich habe zwei Methoden zu implementieren, die Schaffung der IV und ich würde gerne wissen, welches ist besser und sicherer für die Anreise IvParameterSpec
:
Methode #1:
SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
Methode #2:
AlgorithmParameters params = cipher.getParameters();
byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV();
ivParams = new IvParameterSpec(iv2);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde verwenden Sie Methode #1, weil die Java-API gibt die folgenden für die
Cipher.init()
API, nur dauert die ver - /Entschlüsselung-Modus und Schlüssel:(Hervorhebung von mir).
So ist es nicht klar, was andere Anbieter tun, wenn Methode 2 gewählt wird. Blick auf die Android-source-code, es scheint, dass zumindest einige Versionen (einschließlich der version 21?) wird nicht eine zufällige IV - die random-IV Schöpfung scheint auskommentiert.
Methode 1 ist auch transparenter und es ist - meiner Meinung nach - leichter auf die Augen.
Beachten Sie, dass es ist in der Regel besser zu verwenden
new SecureRandom()
und lassen Sie das system herauszufinden, was RNG ist am besten."SHA1PRNG"
ist nicht gut definiert, möglicherweise unterscheiden sich die Implementierungen und ist bekannt gehabt zu haben, Schwächen in der implementation, besonders auf Android.Also das Endergebnis sollte so etwas wie:
Vorsicht, dass die GCM-Modus funktioniert am besten mit einem 12-byte-IV, statt der 16-byte-IV - die Blockgröße von AES.