Java BadPaddingException "Заданный последний блок неправильно заполнен" через несколько часов

Как и многие другие, со временем у меня возникают проблемы с шифрованием в системе, которую я поддерживаю.

Процесс A генерирует некоторый зашифрованный текст, который позже должен декодировать процесс B. Они используют один и тот же код для этой цели, как показано ниже:

public class DesEncryption {
private Cipher mEcipher;
private Cipher mDcipher;

private byte[] salt = {
        (byte) 0x08, (byte) 0x90, (byte) 0xA6, (byte) 0x4B,
        (byte) 0xBB, (byte) 0x51, (byte) 0x3C, (byte) 0xDE
};

// Iteration count
int iterationCount = 19;

DesEncryption(String passPhrase) throws EncryptionException {
    try {
        // Create the key
        KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
        SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
        mEcipher = Cipher.getInstance(key.getAlgorithm());
        mDcipher = Cipher.getInstance(key.getAlgorithm());

        // Prepare the parameter to the ciphers
        AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

        // Create the ciphers
        mEcipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        mDcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
    } catch (java.security.InvalidAlgorithmParameterException e) {
        throw new EncryptionException(e);
    } catch (java.security.spec.InvalidKeySpecException e) {
        throw new EncryptionException(e);
    } catch (javax.crypto.NoSuchPaddingException e) {
        throw new EncryptionException(e);
    } catch (java.security.NoSuchAlgorithmException e) {
        throw new EncryptionException(e);
    } catch (java.security.InvalidKeyException e) {
        throw new EncryptionException(e);
    }
}

public String encrypt(String str) throws EncryptionException {
    try {
        // Encode the string into bytes using utf-8
        byte[] utf8 = str.getBytes("UTF8");

        // Encrypt
        byte[] enc = mEcipher.doFinal(utf8);

        // Encode bytes to base64 to get a string
        return new sun.misc.BASE64Encoder().encode(enc);
    } catch (javax.crypto.BadPaddingException e) {
        throw new EncryptionException(e);
    } catch (IllegalBlockSizeException e) {
        throw new EncryptionException(e);
    } catch (UnsupportedEncodingException e) {
        throw new EncryptionException(e);
    } catch (java.io.IOException e) {
        throw new EncryptionException(e);
    }
}

public String decrypt(String str) throws EncryptionException {
    try {
        // Decode base64 to get bytes
        byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

        // Decrypt
        byte[] utf8 = mDcipher.doFinal(dec);

        // Decode using utf-8
        return new String(utf8, "UTF8");
    } catch (javax.crypto.BadPaddingException e) {
        throw new EncryptionException(e);
    } catch (IllegalBlockSizeException e) {
        throw new EncryptionException(e);
    } catch (UnsupportedEncodingException e) {
        throw new EncryptionException(e);
    } catch (java.io.IOException e) {
        throw new EncryptionException(e);
    }
}
}

Два процесса работают на отдельных серверах, оба Centos (5.3 для процесса A, 6.4 для процесса B)

Нет очевидных проблем с процессом A - строка, которая должна быть закодирована, выполнена так надежно.

Когда начинается процесс B, все выглядит нормально. Он декодирует и дешифрует необходимые строки правильно.

В какой-то момент в течение примерно 24 часов это перестает работать. На этом этапе я получаю исключения "BadPaddingException " Данный последний блок неправильно заполнен ". Затем это продолжается каждый раз, когда код выполняется с любой закодированной строкой, до тех пор, пока процесс не будет перезапущен, после чего все снова работает, включая декодирование строк, которые потерпели неудачу несколько мгновений назад.

В то время, когда это идет не так, вызов decrypt(encrypt("test")) тоже не будет выполнен, так что, похоже, это не связано с фактическим зашифрованным значением, и это больше связано с тем, как шифрование и дешифрование перестают синхронизироваться.

Если кто-то может предложить какие-либо предложения о том, где я могу пойти не так, я был бы признателен.

Спасибо заранее...

Эндрю

0 ответов

Другие вопросы по тегам