Java - AES CB C Алгоритм, отличный от способа генерации SecretKeySpec - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь реализовать алгоритм AES CB C 256 . И после изучения онлайн и проверки нескольких примеров кода я понимаю, что есть два разных способа получить SecretKeySpec, и оба результата приводят к разным зашифрованным сообщениям.

    private static SecretKeySpec getSecretKeySpec(String secretKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        String salt = "a";
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        return new SecretKeySpec(tmp.getEncoded(), "AES");
    }

//    private static SecretKeySpec getSecretKeySpec(String secretKey) throws NoSuchAlgorithmException {
//
//        MessageDigest digest = MessageDigest.getInstance("SHA-256");
//        digest.update(secretKey.getBytes(StandardCharsets.UTF_8));
//        byte[] keyBytes = new byte[32];
//        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
//        return new SecretKeySpec(keyBytes, "AES");
//    }

    public static String encrypt(String strToEncrypt, String secret)
    {
        try
        {
            byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            IvParameterSpec ivspec = new IvParameterSpec(iv);
            SecretKeySpec secretKeySpec = getSecretKeySpec(secret);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
        }
        catch (Exception e)
        {
            System.out.println("Error while encrypting: " + e.toString());
        }
        return null;
    }

Не могли бы вы сообщить мне, какая из них является правильной реализацией AES CB C 256-битного шифрования?

1 Ответ

1 голос
/ 06 апреля 2020

AES & CB C не указывают ничего о том, как вы получаете ключ. Любые 128, 192 и 256-битные ключи действительны. Использование реальной функции получения ключа, такой как PBKDF2WithHmacSHA256, предпочтительнее, чем однократный проход к SHA-256, чтобы замедлить атаку методом перебора, но в противном случае они оба генерируют действительный ключ.

...