java .security.InvalidAlgorithmParameterException: GCM нельзя использовать с классом javax.crypto.spe c .GCMParameterSpec - PullRequest
0 голосов
/ 19 июня 2020

Я шифрую данные с помощью алгоритма «AES / GCM / NoPadding», перед методом инициализации шифрования я получаю java .security.InvalidAlgorithmParameterException: GCM не может использоваться с классом javax.crypto.spe c .GCMParameterSpe c ошибка, есть ли какая-то конкретная c причина этого ??

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, parameterSpec);

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Похоже, вам нужно использовать спецификацию IAIK c «GCMParameterSpe c», а не Java «JCE-own». Я предполагаю, что ваша IDE автоматически выбрала JCE, потому что вы используете только 2 параметра («128» и iv).

Что касается IAIK-Javadocs http://javadoc.iaik.tugraz.at/iaik_jce/old/iaik/security/cipher/GCMParameterSpec.html Я вижу, что есть четыре конструктора, но ни один из них с двумя параметрами не требует aadata и nonce:

Constructor and Description

GCMParameterSpec() Creates a GCM Parameter specification with default values.

GCMParameterSpec(byte[] aaData, byte[] nonce) Creates a GCM Parameter specification with the given additional data and nonce.

GCMParameterSpec(byte[] aaData, byte[] nonce, byte[] macBlock) Creates a GCM Parameter specification with the given additional data, nonce and MAC block.

GCMParameterSpec(byte[] aaData, byte[] nonce, int macLen) Creates a GCM Parameter specification with the given additional data, nonce and MAC length.

Итак, я думаю, вы могли бы использовать:

GCMParameterSpec(byte[] aaData, byte[] nonce, int macLen)

и с вашими данными

GCMParameterSpec(null, iv, 128)
0 голосов
/ 19 июня 2020

Попробуйте это примерно так:

try {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);
        KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 65536, 256); // AES-256
        SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        byte[] key = f.generateSecret(spec).getEncoded();
        byte[] iv = "iv".getBytes();

        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, parameterSpec);

    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }
...