В org.jasypt.encryption.pbe.StandardPBEByteEncryptor получение ключа выглядит иначе, когда я сравнил несколько других функций получения ключа.
Метод initialize() имеет приведенный ниже код для создания секретного ключа:
PBEKeySpec pbeKeySpec = new PBEKeySpec(this.password.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance(this.algorithm);
this.key = factory.generateSecret(pbeKeySpec);
у которого нет соли и количества итераций, переданных в PBEKeySpec.
Но метод encrypt() имеет следующий код:
PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, this.keyObtentionIterations);
byte[] encyptedMessage = null;
synchronized (this.encryptCipher) {
this.encryptCipher.init(
Cipher.ENCRYPT_MODE, this.key, parameterSpec);
encyptedMessage = this.encryptCipher.doFinal(message);
}
который имеет соль и количество итераций, переданных как PBEParameterSpec.
Согласно PBKDF2, секретные ключи генерируются с использованием пароля, соли и количества итераций.
В приведенном выше коде ключ генерируется первым в методе initialize(), а соль и количество итераций передаются как PBEParameterSpec в методе encrypt().
Вопрос в том
Почему соль и итерация используются только во время вызова метода шифрования, когда это можно сделать внутри метода initialize()?
В чем разница?
Я поднимаю этот вопрос, потому что из-за приведенной выше реализации операции encrypt() и decrypt() выполняются медленно при увеличении количества итераций.
Заранее спасибо.