java - 加密数据时出现 InvalidKeyException
问题描述
我知道这有很多线程,但我无法找到解决方案。问题陈述:需要加密数据。下面是我的代码:
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.nio.ByteBuffer;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import static java.nio.charset.StandardCharsets.UTF_8;
public class CryptoUtil {
private static final String AES = "AES/ECB/PKCS5Padding";
public String encryptMessage(final String message, final byte[] dataKey) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(dataKey, AES);
try {
Cipher cipher = Cipher.getInstance(AES);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedMessage = cipher.doFinal(message.getBytes());
return Base64.getEncoder().encodeToString(encryptedMessage);
}
catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
throw new Exception("Error while encrypting application credentials", e);
}
}
}
我需要使用 BountyCastle 服务提供商来完成。所以我按照这里和这个提到的步骤。我正在使用 JAVA 11,但我切换到 JAVA 8 以遵循提到的链接。在我的代码中,我添加了静态块以将 BountyCastle 添加为服务提供者
static {
BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
Security.addProvider(bouncyCastleProvider);
}
但是,它没有被添加为经过验证的提供者。所以我得到了这个问题。任何想法如何处理。如何将 BouncyCastle 添加为经过验证的提供商。我在本地机器上运行,需要创建 JAR。
解决方案
没有人回答这个问题,所以我将在上面的评论中发布答案。我没有测试它,所以我把这部分留给你。
当您这样做Cipher.getInstance()
时,拥有“AES/ECB/PKCS5Padding”是正确的(对于“正确”的一些奇怪定义,Java 提供者认为 PKCS5 padding = PKCS7 padding,但不要介意)。
但是当您创建密钥时,在其中设置模式和填充是不正确的。相反,他们只想要算法。所以试试:
SecretKeySpec secretKey = new SecretKeySpec(dataKey, "AES");
更改是围绕“AES”的引号,而不是使用 AES="AES/ECB/PKCS5Padding"。
不确定这是否会解决您的问题,但应该是朝着正确方向迈出的一步(我希望如此)。
推荐阅读
- reactjs - 如何将道具从组件传递到 NextJS 中的 getServerSideProps()?
- ios - 如何使用 URLSession 在后台上传 zip 文件?
- python - 在 pandas read_csv() 中指定有序类别
- kubernetes - 如何用破折号设置环境?
- opengl - 纹理参数 GL_GENERATE_MIPMAP 是否只更新被更新的纹理区域?
- asp.net - 如何验证asp net core中的唯一属性
- python - 有没有办法检测两个文本是否与同一个品牌有关?
- c++ - 逐字节读取文件(C++)
- floating-point - 绕线算法和浮点误差
- python - 如何在 Seaborn 传奇中结合色调和风格组?