InvalidKeyException при шифровании данных - PullRequest
0 голосов
/ 26 июня 2019

Я знаю, что есть много тем по этому поводу, но я не могу найти решение с ними. Постановка задачи: Нужно зашифровать данные. Ниже мой код:

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.

1 Ответ

0 голосов
/ 27 июня 2019

Никто не ответил на это, поэтому я просто выложу ответ с комментарием, который у меня был выше.Я не проверял это, поэтому я оставляю эту часть вам.

Когда вы делаете Cipher.getInstance(), правильно иметь «AES / ECB / PKCS5Padding» (для некоторого странного определения «правильного», где Javaпровайдеры полагают, что заполнение PKCS5 = заполнение PKCS7, но не обращайте на это внимания).

Но когда вы создаете ключ, неправильно иметь режим и заполнение там.Вместо этого они просто хотят алгоритм.Поэтому попробуйте:

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

Изменение заключается в кавычках вокруг "AES", вместо использования AES = "AES / ECB / PKCS5Padding".

Не уверен, что это решит вашу проблему,но должен быть шаг в правильном направлении (я надеюсь).

...