Class SrpTelegramEncryption

java.lang.Object
de.bsvrz.dav.daf.communication.srpAuthentication.SrpTelegramEncryption

public class SrpTelegramEncryption
extends java.lang.Object
Klasse, die die Verschlüsselung von Telegrammen nach einer erfolgreichen SRP-Authentifikation ermöglicht. In Konstruktor der Klasse wird der SRP-Sitzungsschlüssel übergeben (oder zwei Schlüssel bei Dav-Dav-Verbindungen), daraus berechnet diese Klasse je einen AES-Schlüssel für beide Richtungen sowie GCM-Noncen gemäß RFC5288.

Jeder Kommunikationspartner sollte eine Instanz dieser Klasse (pro Verbindung) erzeugen und kann dann mit encrypt(byte[]) Daten vor dem Versand verschlüsseln und mit decrypt(byte[]) empfangene Daten entschlüsseln.

Es ist wichtig, dass die Reihenfolge der Telegramme beibehalten wird und kein Telegramm ausgelassen wird, da die GCM-Noncen durch einen einfachen Zähler realisiert werden, der auf beiden Seiten der Verbindung denselben Wert annehmen muss.

Diese Klasse ist nur eingeschränkt threadsafe, es dürfen nicht mehrere Verschlüsselungen oder Entschlüsselungen gleichzeitig durchgeführt werden, was allerdings sowieso verboten ist, da es eine fest definierte Telegramm-Reihenfolge geben muss. Es ist kein Problem, parallel eine Verschlüsselung und eine Entschlüsselung durchzuführen.

  • Constructor Summary

    Constructors
    Constructor Description
    SrpTelegramEncryption​(byte[] sessionKey, boolean isClient, SrpCryptoParameter srpCryptoParameter)
    Erstellt eine neue SrpTelegramEncryption-Instanz für eine Verbindung.
  • Method Summary

    Modifier and Type Method Description
    static byte[] computeHash​(int outputMinimumSize, java.lang.String hashAlgorithm, byte[] data)
    Berechnet einen Hashwert der angegebenen Länge aus den übergebenen Daten
    byte[] decrypt​(byte[] telegram)
    Entschlüsselt ein Telegramm von der Gegenseite
    byte[] encrypt​(byte[] telegram)
    Verschlüsselt ein Telegramm zum Versand an die Gegenseite
    java.lang.String getCipherName()
    Gibt den Namen der verwendeten Verschlüsselung zurück
    static void increment​(byte[] bytes)
    Inkrementiert ein Byte-Array wie einen Integer.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • SrpTelegramEncryption

      public SrpTelegramEncryption​(byte[] sessionKey, boolean isClient, SrpCryptoParameter srpCryptoParameter) throws SrpNotSupportedException
      Erstellt eine neue SrpTelegramEncryption-Instanz für eine Verbindung. Der AES-Key wird aus dem Sitzungsschlüssel bestimmt.
      Parameters:
      sessionKey - Sitzungsschlüssel (z.B. aus SRP-Authentifizierung)
      isClient - Handelt es sich hierbei um den Client?
      srpCryptoParameter - Cryptographische Verschlüsselungsparameter
      Throws:
      SrpNotSupportedException
  • Method Details

    • increment

      public static void increment​(byte[] bytes)
      Inkrementiert ein Byte-Array wie einen Integer. Der erste Wert den Arrays ist am signifikantesten.
      Parameters:
      bytes - Byte-Array
    • computeHash

      public static byte[] computeHash​(int outputMinimumSize, java.lang.String hashAlgorithm, byte[] data) throws java.security.NoSuchAlgorithmException, java.security.DigestException
      Berechnet einen Hashwert der angegebenen Länge aus den übergebenen Daten
      Parameters:
      outputMinimumSize - Mindestlänge in Bytes des Ergebniswerts. Das zurückgegebene Array kann größer sein, aber nicht kleiner.
      hashAlgorithm - Algorithmus zum Hashen
      data - Byte-Array, das zu hashende Daten enthält. Leere Arrays sind nicht zulässig.
      Returns:
      Byte-Array mit Hashwerten
      Throws:
      java.security.NoSuchAlgorithmException - Der Algorithmus existiert nicht
      java.security.DigestException - Fehler beim Hashwert berechnen
    • encrypt

      public byte[] encrypt​(byte[] telegram) throws java.io.IOException
      Verschlüsselt ein Telegramm zum Versand an die Gegenseite
      Parameters:
      telegram - Telegramm
      Returns:
      Verschlüsselte Daten
      Throws:
      java.io.IOException - Fehler beim Verschlüsseln
    • decrypt

      public byte[] decrypt​(byte[] telegram) throws java.io.IOException
      Entschlüsselt ein Telegramm von der Gegenseite
      Parameters:
      telegram - Verschlüsselte Daten
      Returns:
      Entschlüsseltes Telegramm
      Throws:
      java.io.IOException - Fehler beim Entschlüsseln
    • getCipherName

      public java.lang.String getCipherName()
      Gibt den Namen der verwendeten Verschlüsselung zurück
      Returns:
      Name der Verschlüsselung