我正在编写一个程序来加密和解密数据。为了加密,我使用keyGenerator
. 我将密钥转移到密码中,并创建了密钥的字符串版本:
String keyString = Base64.getEncoder().encodeToString(symmetricKey.getEncoded());
为了将其存储在配置文件中(这样我就可以在解密函数中检索密钥)。
现在,在解密函数中,我需要将该字符串恢复为密钥格式,因此我可以将其作为参数发送到 dercypt 模式下的密码。我以这种方式将其转换回密钥:
byte[] keyBytes = key.getBytes(Charset.forName("UTF-8"));
Key newkey = new SecretKeySpec(keyBytes,0,keyBytes.length, "AES");
我将其传输到密码并使用以下命令写入输出(解密的数据)CipherInputStream
:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newkey, newiv, SecureRandom.getInstance("SHA1PRNG"));
CipherInputStream cipherInputStream = new CipherInputStream(
new ByteArrayInputStream(encryptedBytes), cipher);
ArrayList<Byte> decryptedVal = new ArrayList<>();
int nextByte;
while ((nextByte = cipherInputStream.read()) != -1) {
decryptedVal.add((byte) nextByte);
}
byte[] bytes = new byte[decryptedVal.size()];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = decryptedVal.get(i);
}
String decryptedData = new String(bytes);
cipherInputStream.close();
System.out.println("decryptedData: " + decryptedData);
我收到此错误:
线程“主”java.io.IOException 中的异常:javax.crypto.BadPaddingException:给定最终块未正确填充。如果在解密期间使用了错误的密钥,则可能会出现此类问题。
所以我怀疑我对待钥匙的方式可能有问题。
有什么建议么?帮助将不胜感激!