加密数据时发生InvalidKeyException

时间:2019-06-26 04:19:22

标签: java encryption aes bouncycastle

我知道对此有很多线程,但是我无法找到解决方案。 问题陈述: 需要加密数据。下面是我的代码:

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服务提供商进行此操作。所以我遵循了herethis提到的步骤。我正在使用JAVA 11,但是我切换到JAVA 8来遵循提到的链接。 在我的代码中,我添加了静态块以将BountyCastle添加为服务提供商

static {
    BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
    Security.addProvider(bouncyCastleProvider);
  }

但是,它并没有被添加为经过验证的提供程序。所以我要解决这个问题。 任何想法如何处理。如何将BouncyCastle添加为经过验证的提供商。 我正在本地计算机上运行,​​并且需要创建JAR。

1 个答案:

答案 0 :(得分:0)

没有人回答这个问题,因此我将在上面的评论中发布答案。我尚未对其进行测试,所以我将这一部分留给您。

当您执行Cipher.getInstance()时,具有“ AES / ECB / PKCS5Padding”是正确的(对于“正确”的一些怪异定义,Java提供程序认为PKCS5填充= PKCS7填充,但不要紧)。

但是当您创建密钥时,在其中有模式和填充是不正确的。相反,他们只是想要算法。因此,尝试:

SecretKeySpec secretKey = new SecretKeySpec(dataKey, "AES");

更改是在“ AES”周围加上引号,而不是使用AES =“ AES / ECB / PKCS5Padding”。

不确定是否能解决您的问题,但应该朝正确的方向迈出一步(我希望如此)。