У меня есть пул вспомогательных объектов неизменяемого шифрования, которые содержат экземпляры java Jip Cipher и MessageDigest:
AlgorithmInstance( Cipher encCipher, Cipher decCipher, MessageDigest digest ) { ... }
private BlockingQueue< AlgorithmInstance > pool = new ArrayBlockingQueue< AlgorithmInstance >(poolSize);
Различные потоки в моем приложении, требующие шифрования или дешифрования, борются за объекты AlgorithmInstance путем доступабассейн.Каждый поток использует их для шифрования или дешифрования, а затем возвращает их в пул по завершении.Потоки не синхронизируются ни с одним из объектов JCA, так как нет одновременного доступа.Расшифровка работает примерно так же.
public byte[] encryptMessage( byte data[] ) { ...
try {
AlgorithmInstance inst = pool.take();
inst.digest.reset();
byte[] digest = inst.digest.digest(message);
inst.encryptCipher.init( Cipher.ENCRYPT_MODE, m_currentKey, ivParams );
inst.encryptCipher.doFinal( messageBuffer );
}
finally {
pool.put(inst)
}
}
Это работает 99,99% времени;и 100% времени в юнит-тестах.Однако, попав в голубую луну, я получаю сообщение, чей вычисленный дайджест не получается правильным - обычно это указывает на фальсификацию сообщений или сетевые ошибки;но отправитель и получатель находятся на одном и том же компьютере (в разных процессах).
Q: Есть ли какое-то внутреннее состояние для шифра или дайджеста, который может страдать от эффектов согласованности памяти - I 'm на 2-х ядерном ящике с окнами, так что я не вижу, как я мог бы даже пострадать от эффектов согласованности памяти.Я заново инициализирую шифр и перевариваю каждый вызов, так что это не должно иметь значения.
Q: Есть ли какой-нибудь способ, которым я мог бы закончить режимом заполнения, который иногда терпит неудачу на основании сообщениядлина?Декриптор и шифратор используют абсолютно одинаковые алгоритмы (AES / CBC / Pkcs5Padding + SHA-256 и размер ключа 128).