我知道对此有很多线程,但是我无法找到解决方案。 问题陈述: 需要加密数据。下面是我的代码:
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服务提供商进行此操作。所以我遵循了here和this提到的步骤。我正在使用JAVA 11,但是我切换到JAVA 8来遵循提到的链接。 在我的代码中,我添加了静态块以将BountyCastle添加为服务提供商
static {
BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
Security.addProvider(bouncyCastleProvider);
}
但是,它并没有被添加为经过验证的提供程序。所以我要解决这个问题。 任何想法如何处理。如何将BouncyCastle添加为经过验证的提供商。 我正在本地计算机上运行,并且需要创建JAR。
答案 0 :(得分:0)
没有人回答这个问题,因此我将在上面的评论中发布答案。我尚未对其进行测试,所以我将这一部分留给您。
当您执行Cipher.getInstance()
时,具有“ AES / ECB / PKCS5Padding”是正确的(对于“正确”的一些怪异定义,Java提供程序认为PKCS5填充= PKCS7填充,但不要紧)。
但是当您创建密钥时,在其中有模式和填充是不正确的。相反,他们只是想要算法。因此,尝试:
SecretKeySpec secretKey = new SecretKeySpec(dataKey, "AES");
更改是在“ AES”周围加上引号,而不是使用AES =“ AES / ECB / PKCS5Padding”。
不确定是否能解决您的问题,但应该朝正确的方向迈出一步(我希望如此)。