【发布时间】:2019-11-03 13:28:21
【问题描述】:
我正在尝试创建要作为 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)
我在这里错过了什么?
P.S:我使用的是tink版本1.3.0-rc1
【问题讨论】:
-
generateNew生成一个 new 密钥。由于您在encrypt和decrypt中都调用了generateNew,因此加密和解密使用不同的 密钥。因此解密失败。
标签: java encryption tink