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.
Modifier and Type | Field and Description |
---|---|
private int |
_authTagBits
Länge des GCM authentication tag
|
private javax.crypto.Cipher |
_decryptionCipher
Cipher-Objekt zum entschlüsseln
|
private javax.crypto.SecretKey |
_decryptionKey
Schlüssel zum entschlüsseln (eingehende Nachrichten)
|
private byte[] |
_decryptionNonce
Nonce/GCM-Zähler zum entschlüsseln (eingehende Nachrichten)
|
private byte[] |
_decryptTmp
Puffer
|
private javax.crypto.Cipher |
_encryptionCipher
Cipher-Objekt zum verschlüsseln
|
private javax.crypto.SecretKey |
_encryptionKey
Schlüssel zum verschlüsseln (ausgehende Nachrichten)
|
private byte[] |
_encryptionNonce
Nonce/GCM-Zähler zum verschlüsseln (ausgehende Nachrichten)
|
private byte[] |
_encryptTmp
Puffer
|
private static int |
NONCE_BYTES
Länge des AES-IV
|
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.
|
private javax.crypto.spec.GCMParameterSpec |
nonce(byte[] bytes)
Gibt die nächste GCM-Nonce zurück.
|
private final int _authTagBits
Länge des GCM authentication tag
private static final int NONCE_BYTES
Länge des AES-IV
private final javax.crypto.SecretKey _encryptionKey
Schlüssel zum verschlüsseln (ausgehende Nachrichten)
private final byte[] _encryptionNonce
Nonce/GCM-Zähler zum verschlüsseln (ausgehende Nachrichten)
private final javax.crypto.Cipher _encryptionCipher
Cipher-Objekt zum verschlüsseln
private final byte[] _encryptTmp
Puffer
private final javax.crypto.SecretKey _decryptionKey
Schlüssel zum entschlüsseln (eingehende Nachrichten)
private final byte[] _decryptionNonce
Nonce/GCM-Zähler zum entschlüsseln (eingehende Nachrichten)
private final javax.crypto.Cipher _decryptionCipher
Cipher-Objekt zum entschlüsseln
private final byte[] _decryptTmp
Puffer
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üsselnprivate javax.crypto.spec.GCMParameterSpec nonce(byte[] bytes)
Gibt die nächste GCM-Nonce zurück. Die bisherige Nonce wird um 1 inkrementiert.
bytes
- bisherige Noncepublic 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