Strings Verschlüsseln mit AES 256

Manchmal möchte man gewisse Sachen für sich behalten und dafür kann eine Verschlüsselung / Entschlüsselung mit dem Algorithmus „AES“ von Nöten sein.

Dazu gibt des von Apache eine gute Bibliothek, die „Apache Commons Codec„.

Bevor wir eine Zeichenkette verschlüsseln bzw. entschlüsseln können, müssen wir einen Key für den Algorithmus erstellen, dieses geschieht mit der Klasse GenKey, welche auf der Konsole einen gültigen AES Key ausgibt.

public class GenKey {

  public static void main(String[] args) throws NoSuchAlgorithmException {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    kgen.init(128);

    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();

    String key = Hex.encodeHexString(raw);
    System.out.println(key);
  }
}

Diesen Key benötigen wir später für das Verschlüsseln und Entschlüsseln und ist soetwas wie ein Passwort für den Algorythmus.

Unser generierte KEY und eine Statische Variable der Klasse Cipher.

private static final String KEY = "714b03ce9b884dc7defc9a9043fdfa67";
private static Cipher cipher;

Nun wird mit dem KEY eine Instanz der Klasse Cipher generiert, hier ist auch erkennbar warum diese Statisch ist da wir ja immer auf das gleiche Objekt zugreifen wollen.

try {
   SecretKeySpec skeySpec = new SecretKeySpec(Hex.decodeHex(KEY.toCharArray()), "AES");   
   cipher = Cipher.getInstance("AES");
   cipher.init(Cipher.DECRYPT_MODE, skeySpec);
} catch (Exception e) {
   e.printStackTrace();
}

Nachdem wir nun einen gültigen AES Key und die Instanz der Klasse Cipher erstellt haben , können wir mit dem verschlüsseln anfangen.

Erstellen wir uns für die nächsten Methoden eine Klasse „EncoderDecoder“ welche folgenden Konstruktor hat.

private EncoderDecoder() {
   try {
     skeySpec = new SecretKeySpec(Hex.decodeHex(KEY.toCharArray()), "AES");
     deCryptCipher = Cipher.getInstance("AES");
     deCryptCipher.init(Cipher.ENCRYPT_MODE, skeySpec);
     
     enCryptCipher = Cipher.getInstance("AES");
     enCryptCipher.init(Cipher.DECRYPT_MODE, skeySpec);
} catch (Exception e) {
   e.printStackTrace();
}
	}

Und nachfolgende Instanzvariablen

private static final String KEY = "714b03ce9b884dc7defc9a9043fdfa67";

private SecretKeySpec skeySpec;
private static Cipher deCryptCipher, enCryptCipher;
private static EncoderDecoder instance;

Die Methode zum Verschlüsseln.

public String decrypt(String code) {
   String ecryptedText = null;
   try {
     byte[] encrypted = deCryptCipher.doFinal(code.getBytes());
     ecryptedText = Hex.encodeHexString(encrypted);
   } catch (Exception e) {
     e.printStackTrace();
   }
return ecryptedText;
}

Die Methode zum Entschlüsseln.

public String encrypt(String code) throws IllegalBlockSizeException, BadPaddingException, DecoderException {
   boolean isHexCode = testForCode(code);
   String result = "-undefined-";
   if (isHexCode) {
     byte[] clearText =  enCryptCipher.doFinal(Hex.decodeHex(code.toCharArray()));
     result =  new String(clearText);
   }
return result;
}

Eine Hilfemethode zum Prüfen ob ein gültiger Hexcode übergeben wurde.
Wird kein gültiger Hexcode der Methode encrypt Übergeben so wird eine Exception geworfen.

private boolean testForCode(String code) {
   boolean result = true;
   for (int i = 0; i < code.length(); i++) {
     char ch = code.charAt(i);
     int digit = Character.digit(ch, 16);
     if (digit == -1) {
        result = false;
     }
}
return result;
}

Das fertige Eclipse Projekt hier zum Download.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.