Расшифровка erorr при использовании тинка в Java - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь создать зашифрованный токен, который должен быть отправлен как ответ REST API. Затем конечный пользователь может отправить тот же токен во время следующего запроса к этому API, и я могу проанализировать его и получить некоторую контекстную информацию (из предыдущего).

Поскольку я новичок в криптографии, я почувствовал, что этоЛучше взять Google tink вместо того, чтобы писать код шифрования / дешифрования самостоятельно. Однако я не могу правильно расшифровать.

Я делаю шифрование / дешифрование следующим образом:

public class CipherUtils {

    public static byte[] encrypt(byte[] plainText, 
                                 byte[] associatedData) throws GeneralSecurityException {
        KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);
        Aead aead = keysetHandle.getPrimitive(Aead.class);
        return aead.encrypt(plainText, associatedData);
    }

    public static byte[] decrypt(byte[] cipherText, 
                                 byte[] associatedData) throws GeneralSecurityException {
        KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);
        Aead aead = keysetHandle.getPrimitive(Aead.class);
        return aead.decrypt(cipherText, associatedData);
    }
}

Вот как я генерирую токен:

String associatedData = "somethingUnique";
String data = "tokenToBeEncrypted";

byte[] ciphered = CipherUtils.encrypt(data.getBytes(), associatedData.getBytes());
String finalToken = Base64.getEncoder().encodeToString(ciphered);

Этот finalToken отправляется обратно как ответ и также извлекается из следующего запроса.

Вот я пытаюсь расшифровать:

String associatedData = "somethingUnique"; // same one used for encrypting
String token = // retrieved from http request
byte[] decodedText = Base64.getDecoder().decode(token);
byte[] deciphered = CipherUtils.decrypt(decodedText, associatedData.getBytes());

Это всегда приводит к следующему исключению:

java.security.GeneralSecurityException: decryption failed
    at com.google.crypto.tink.aead.AeadWrapper$WrappedAead.decrypt(AeadWrapper.java:82)
    at CipherUtils.decrypt(CipherUtils.java:22)

Что мне здесь не хватает?

PS: я использую tink версию 1.3.0-rc1

1 Ответ

0 голосов
/ 03 ноября 2019

Вы инициализируете два отдельных экземпляра набора ключей AEAD. Вам нужно инициализировать один набор ключей и Aead и ссылаться на один и тот же объект для шифрования и дешифрования

@Test
public void testEnc() throws GeneralSecurityException {
    AeadConfig.register();
    String associatedData = "somethingUnique";
    String data = "tokenToBeEncrypted";
    KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);
    Aead aead = keysetHandle.getPrimitive(Aead.class);
    byte[] ciphered = aead.encrypt(data.getBytes(), associatedData.getBytes());
    byte[] deciphered = aead.decrypt(ciphered, associatedData.getBytes());
    assertEquals(data, new String(deciphered));

}
...