首页 > 解决方案 > 加密数据时出现 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。

标签: javaencryptionaesbouncycastle

解决方案


没有人回答这个问题,所以我将在上面的评论中发布答案。我没有测试它,所以我把这部分留给你。

当您这样做Cipher.getInstance()时,拥有“AES/ECB/PKCS5Padding”是正确的(对于“正确”的一些奇怪定义,Java 提供者认为 PKCS5 padding = PKCS7 padding,但不要介意)。

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

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

更改是围绕“AES”的引号,而不是使用 AES="AES/ECB/PKCS5Padding"。

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


推荐阅读