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 and Description |
---|
SrpTelegramEncryption(byte[] sessionKey,
boolean isClient,
SrpCryptoParameter srpCryptoParameter)
Erstellt eine neue SrpTelegramEncryption-Instanz für eine Verbindung.
|
Modifier and Type | Method and 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.
|
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.
sessionKey
- Sitzungsschlüssel (z.B. aus SRP-Authentifizierung)isClient
- Handelt es sich hierbei um den Client?srpCryptoParameter
- Cryptographische VerschlüsselungsparameterSrpNotSupportedException
public byte[] encrypt(byte[] telegram) throws java.io.IOException
Verschlüsselt ein Telegramm zum Versand an die Gegenseite
telegram
- Telegrammjava.io.IOException
- Fehler beim Verschlüsselnpublic byte[] decrypt(byte[] telegram) throws java.io.IOException
Entschlüsselt ein Telegramm von der Gegenseite
telegram
- Verschlüsselte Datenjava.io.IOException
- Fehler beim Entschlüsselnpublic static void increment(byte[] bytes)
Inkrementiert ein Byte-Array wie einen Integer. Der erste Wert den Arrays ist am signifikantesten.
bytes
- Byte-Arraypublic 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
outputMinimumSize
- Mindestlänge in Bytes des Ergebniswerts. Das zurückgegebene Array kann größer sein, aber nicht kleiner.hashAlgorithm
- Algorithmus zum Hashendata
- Ein oder mehrere Byte-Arrays die zu hashende Daten enthalten. Die Arrays werden aneinander gehängt. Leere Arrays sind nicht zulässig.java.security.NoSuchAlgorithmException
- Der Algorithmus existiert nichtjava.security.DigestException
- Fehler beim Hashwert berechnenpublic java.lang.String getCipherName()
Gibt den Namen der verwendeten Verschlüsselung zurück