Java AES / GCM / NoPadding - Was gibt mir cipher.getIV ()?

Ich bin mit AES/GCM/NoPadding Verschlüsselung in Java 8 und ich Frage mich, ob mein code hat eine Sicherheitslücke. Mein code scheint Arbeitdass es verschlüsselt und entschlüsselt text, aber ein paar details sind noch unklar.

Meine wichtigste Frage ist diese:

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] iv = cipher.getIV(); //?????

Tut, IV erfüllen die Anforderungen der "Für einen bestimmten Schlüssel, der IV DARF sich NICHT wiederholen." aus RFC 4106?

Ich würde auch schätzen, alle Antworten /Erkenntnisse für meine Fragen (siehe unten), aber, die erste Frage, die nervt mich am meisten. Ich weiß nicht, wo zu finden, Quellcode oder Dokumentation, die Antworten.


Hier ist der vollständige code, etwa. Ich entschuldige mich, falls ich die eingeführte Fehler beim schreiben von diesem post:

class Encryptor {
  Key key;

  Encryptor(byte[] key) {
    if (key.length != 32) throw new IllegalArgumentException();
    this.key = new SecretKeySpec(key, "AES");
  }

  //the output is sent to users
  byte[] encrypt(byte[] src) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] iv = cipher.getIV(); //See question #1
    assert iv.length == 12; //See question #2
    byte[] cipherText = cipher.doFinal(src);
    assert cipherText.length == src.length + 16; //See question #3
    byte[] message = new byte[12 + src.length + 16]; //See question #4
    System.arraycopy(iv, 0, message, 0, 12);
    System.arraycopy(cipherText, 0, message, 12, cipherText.length);
    return message;
  }

  //the input comes from users
  byte[] decrypt(byte[] message) throws Exception {
    if (message.length < 12 + 16) throw new IllegalArgumentException();
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    GCMParameterSpec params = new GCMParameterSpec(128, message, 0, 12);
    cipher.init(Cipher.DECRYPT_MODE, key, params);
    return cipher.doFinal(message, 12, message.length - 12);
  }
}

Angenommen, dass die Nutzer cracking my secret key = Spiel über.


Detailliertere Fragen /Fragen:

  1. Ist die IV zurückgegeben Chiffre.getIV() sicher für mich zu gebrauchen?
    • Tut es vermeiden die Katastrophe, die der Wiederverwendung der IV,Tastenkombination im Galois/Counter-Mode?
    • Ist es noch sicherer, wenn ich mehrere Anwendungen ausführen dieses Codes auf einmal, alle anzeigen, verschlüsselte Nachrichten an Benutzer aus der gleichen src-Daten (möglicherweise in der gleichen Millisekunde)?
    • Was ist der zurückgegebene IV aus? Ist es eine Atomare Zähler plus einige zufällige Rauschen?
    • Muss ich vermeiden cipher.getIV() und konstruieren eine IV-mich selbst, mit meinen eigenen counter?
    • Ist der Quell-code der Implementierung cipher.getIV() online verfügbar irgendwo, vorausgesetzt, ich bin mit Oracle JDK 8 + JCE Unlimited Strength-Erweiterung?
  2. Ist, dass IV immer 12 bytes lang?
  3. Ist die Authentifizierung tag immer 16 bytes (128 bits) lang ist?
  4. Mit #2 und #3, und der Mangel an Polsterung, bedeutet das, dass meine verschlüsselte Nachrichten sind immer 12 + src.length + 16 bytes lang? (Und so kann ich sicher, dass du Sie in ein byte-array, die ich weiß, die richtige Länge?)
  5. Ist es sicher für mich zu Anzeige eine unbegrenzte Anzahl von src-Daten-Verschlüsselung, um die Benutzer, VORGEGEBENE Konstante src-Daten, die der Nutzer wissen?
  6. Ist es sicher für mich zu Anzeige eine unbegrenzte Anzahl von src-Daten-Verschlüsselung, um die Benutzer, wenn Sie die src-Daten ist jedes mal anders (z.B. mit der System.currentTimeMillis() oder Zufallszahlen)?
  7. Würde es helfen, wenn ich tappste Sie die src-Daten mit Zufallszahlen vor der Verschlüsselung? Also 8 zufällige bytes in front und Rücken, oder nur an einem Ende? Oder würde das nicht helfen /machen meiner Verschlüsselung schlimmer?

(Denn diese Fragen sind alle über den gleichen block von meinem eigenen code, und Sie sind stark miteinander verwandt, und andere könnten/sollten, haben die gleichen Fragen bei der Umsetzung der gleichen Funktionalität, es fühlte sich falsch aufteilen der Fragen in mehrere Beiträge. Kann ich re-poste Sie separat, wenn das ist besser geeignet für StackOverflow-format. Lassen Sie mich wissen!)

InformationsquelleAutor der Frage Michael Hixson | 2015-08-06

Schreibe einen Kommentar