gpt4 book ai didi

java - Java 中 AES 加解密的首选方法

转载 作者:行者123 更新时间:2023-12-01 14:44:01 26 4
gpt4 key购买 nike

我编写了以下两种加密和解密给定 token 的方法:

private static final String ALGORITHM_TYPE = "AES";
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static byte[] INITIALIZATION_VECTOR = new byte[] {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
public String encrypt(String token) {
Cipher cipher = null;
SecretKey key = null;
String tokenAsHex = null;
byte[] encryptedToken = null;
byte[] sksKey = getKeyAsByteArray(KEY); // SecretKeySpec key.

try {
key = new SecretKeySpec(sksKey, ALGORITHM_TYPE);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
encryptedToken = cipher.doFinal(Base64.encodeBase64(token.getBytes("UTF-8")));
} catch (Exception e) {
throw new EncryptionException(e);
}
return Base64.encodeBase64String(encryptedToken).toLowerCase();
}

public String decrypt(String token) throws EncryptionException {
Cipher cipher = null;
SecretKey key = null;
byte[] decryptedToken = null;
byte[] sksKey = getKeyAsByteArray(KEY); // SecretKeySpec key.
try {
key = new SecretKeySpec(sksKey, ALGORITHM_TYPE);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
decryptedToken = cipher.doFinal(Base64.decodeBase64(token));
} catch(Exception e){
throw new EncryptionException(e);
}
if (decryptedToken == null) {
throw new EncryptionException("Unable to decrypt the following token: " + token);
}
return Base64.encodeBase64String(decryptedToken);
}

但是,我无法成功解密使用加密方法加密的任何字符串。我搜索了类似的问题,最接近的发现在这里:Encrypt and decrypt with AES and Base64 encoding 。即使使用类似的策略,我仍然无法解密加密的字符串。如果您能帮助诊断问题所在,我们将不胜感激。

此外,我使用 Base64 对加密/解密的字节数组进行编码,而不是创建新的字符串,因为后者会导致不安全的 URL 字符串。

最佳答案

您正在加密一个base64编码,然后重新对其进行base64编码,并解密一个base64解码,然后出于某种原因对其进行base64编码。这没有道理。你应该是:

  1. 对加密进行 Base64 编码,即本质上返回 Base64.encode(cipher.doFinal(...))
  2. 解密(1)的base64解码,即本质上返回cipher.doFinal(Base64.decode(...))

关于java - Java 中 AES 加解密的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com