Надежный замок AES-256 не удалось расшифровать - PullRequest
0 голосов
/ 25 мая 2018

Я получаю это исключение при декодировании закодированной строки.В некоторых случаях это работает нормально, но если я вставляю большой код шифра для расшифровки, это дает мне исключение следующим образом:

org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted
at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(Unknown Source)   
at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(Unknown 
Source)

со следующим кодом ..

public byte[] encryptAES256(byte[] input, byte[] key) throws InvalidCipherTextException {
    assert key.length == 32;
    CipherParameters cipherParameters = new KeyParameter(key);
    BlockCipher blockCipher = new AESEngine();
    BlockCipherPadding blockCipherPadding = new PKCS7Padding();
    BufferedBlockCipher bufferedBlockCipher = new PaddedBufferedBlockCipher(blockCipher, blockCipherPadding);
    return encrypt(input, bufferedBlockCipher, cipherParameters);
}

public byte[] decryptAES256(byte[] input, byte[] key) throws InvalidCipherTextException {
    assert key.length == 32;
    CipherParameters cipherParameters = new KeyParameter(key);
    BlockCipher blockCipher = new AESEngine();
    BlockCipherPadding blockCipherPadding = new PKCS7Padding();
    BufferedBlockCipher bufferedBlockCipher = new PaddedBufferedBlockCipher(blockCipher, blockCipherPadding);
    return decrypt(input, bufferedBlockCipher, cipherParameters);
}

public byte[] process(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters, boolean forEncryption) throws InvalidCipherTextException {
    bufferedBlockCipher.init(forEncryption, cipherParameters);
    byte[] rv = new byte[bufferedBlockCipher.getOutputSize(input.length)];
    int tam = bufferedBlockCipher.processBytes(input, 0, input.length, rv, 0);
    try {
        bufferedBlockCipher.doFinal(rv, tam);
        return rv;
    } catch (Exception e) {
        e.printStackTrace();
    }
   return rv; 
}

public byte[] decrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, 
    CipherParameters cipherParameters) throws InvalidCipherTextException {
    boolean forEncryption = false;
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption);
}

Может кто-топомогите разобраться, почему я получаю это исключение?

1 Ответ

0 голосов
/ 25 мая 2018

Всякий раз, когда вы игнорируете возвращаемое значение, оно должно дать вам паузу.Вы игнорируете возвращаемое значение bufferedBlockCipher.doFinal(rv, tam) в вашем методе process.Я считаю, что в вашем коде это вызовет проблемы только во время операции расшифровки.Обратите внимание, что bufferedBlockCipher.getOutputSize(input.length) вернет значение, которое имеет минимальную длину, не обязательно точную длину.Другими словами, это может быть немного слишком большим.Метод doFinal даст вам фактический размер последнего блока после удаления заполнения.Затем вы можете вернуть массив правильного размера, используя что-то такое простое, как java.util.Arrays.copyOf(...), например

int lastBlockLen = bufferedBlockCipher.doFinal(rv, tam);
return Arrays.copyOf(rv, tam + lastBlockLen);
...