// Abstrakte Klasse (Schnittstelle) für AES
// AES ist symmetrisch, d.h. ein Schlüssel und dessen Berechnung,
// bei der Entschlüsselung werden die Vorgänge umgekehrt durchlaufen
// mit Inversen Operationen oder Matrizen, wobei XOR dies auto. erfüllt.
// Klasse abstract, weil bei interface alle Methode public und dies auch nicht mehr
// reduzierbar z.B. auf private; Variable hin gibt an, ob Hin- oder
// Rücktransformation zu machen ist.

public abstract class AES_Ss
{
  // abhängig von Schlüssel-, Blocklänge die Anzahl Runden bestimmen
  protected abstract void bestimmeAnzahlRunden ();  

  // die Rundenschlüssel wurden vorher bestimmt, jetzt wird ein
  // konkreter Block verschlüsselt
  public abstract void verschluesseln (byte [] block, byte [] erg) throws Exception;
  public abstract void entschluesseln (byte [] block, byte [] erg) throws Exception;

  // Ausgehend von einem Startschlüssel r(#Runden)+1 Rundenschlüssel berechnen
  public abstract void rundenSchluesselBerechnen (byte [] initial) throws Exception;

  // Die ByteSub-Transformation
  protected abstract byte berechneByteSub (byte x, boolean hin);

  // Die ShiftRow-Transformation
  protected abstract void berechneShiftRow (int nr, boolean hin);

  // Die MixColumn-Transformation
  protected abstract void berechneMixColumn (int nr, boolean hin);

}
