Ich möchte eine Zeichenfolge mit AES mit meinem eigenen Schlüssel verschlüsseln. Aber ich habe Probleme mit der Bitlänge des Schlüssels. Können Sie meinen Code überprüfen und sehen, was ich reparieren / ändern muss?
public static void main(String[] args) throws Exception {
String username = "[email protected]";
String password = "Password1";
String secretID = "BlahBlahBlah";
String SALT2 = "deliciously salty";
// Get the Key
byte[] key = (SALT2 + username + password).getBytes();
System.out.println((SALT2 + username + password).getBytes().length);
// Need to pad key for AES
// TODO: Best way?
// Generate the secret key specs.
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encrypted = cipher.doFinal((secrectID).getBytes());
System.out.println("encrypted string: " + asHex(encrypted));
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] original = cipher.doFinal(encrypted);
String originalString = new String(original);
System.out.println("Original string: " + originalString + "\nOriginal string (Hex): " + asHex(original));
}
Im Moment erhalte ich die Ausnahme " Ungültige AES-Schlüssellänge: 86 Byte ". Muss ich meinen Schlüssel auffüllen? Wie soll ich das machen
Muss ich auch etwas für EZB oder CBC einstellen?
Vielen Dank
Antworten:
Bearbeiten:
Wie in den Kommentaren geschrieben, ist der alte Code keine "Best Practice". Sie sollten einen Schlüsselgenerierungsalgorithmus wie PBKDF2 mit einer hohen Iterationszahl verwenden. Sie sollten auch zumindest teilweise ein nicht statisches (dh für jedes exklusive "Identitäts" -Salz) Salz verwenden. Wenn möglich zufällig generiert und zusammen mit dem Chiffretext gespeichert.
===========
Alte Antwort
Sie sollten SHA-1 verwenden, um einen Hash aus Ihrem Schlüssel zu generieren und das Ergebnis auf 128 Bit (16 Byte) zu kürzen.
Generieren Sie außerdem keine Byte-Arrays aus Strings über getBytes (), es wird der Plattform-Standardzeichensatz verwendet. Das Passwort "blaöä" führt also zu unterschiedlichen Byte-Arrays auf unterschiedlichen Plattformen.
Bearbeiten: Wenn Sie 256-Bit-Schlüsselgrößen benötigen, müssen Sie den Oracle-Download-Link "JCE-Richtliniendateien mit unbegrenzter Gerichtsbarkeit für Java Cryptography Extension (JCE)" herunterladen . Verwenden Sie SHA-256 als Hash und entfernen Sie die Zeile Arrays.copyOf . "ECB" ist der Standard-Verschlüsselungsmodus und "PKCS5Padding" das Standard-Padding. Sie können verschiedene Verschlüsselungs- und Auffüllmodi über die Zeichenfolge Cipher.getInstance im folgenden Format verwenden: "Verschlüsselung / Modus / Auffüllen"
Für AES mit CTS und PKCS5Padding lautet die Zeichenfolge: "AES / CTS / PKCS5Padding"
quelle
Sie sollten einen KeyGenerator verwenden, um den Schlüssel zu generieren.
Die AES-Schlüssellängen betragen je nach verwendeter Verschlüsselung 128, 192 und 256 Bit.
Schauen Sie sich das Tutorial hier an
Hier ist der Code für die kennwortbasierte Verschlüsselung. Hierbei wird das Kennwort über System eingegeben. Sie können dies ändern, um ein gespeichertes Kennwort zu verwenden, wenn Sie möchten.
quelle
SecretKeyFactory
eine aktuellere Verschlüsselung.quelle
keyValue
mit dem Byte-Array? Ich sehe, dass es verwendet wird, um den Schlüssel herzustellen. Warum? Kann etwas stattdessen mit like gemachtSecretKey
werden? Wenn das so ist, wie?Das wird funktionieren.
quelle
MD5, AES, keine Polsterung
quelle
quelle