Как зашифровать / расшифровать файлы с помощью PBE AES с помощью BouncyCastle Lightweight API? - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь зашифровать / расшифровать файлы с помощью PBE, используя AES.Я использую библиотеку Bouncy Casle (облегченный API), потому что мне нужно игнорировать ограничения на длину ключа.Я нашел функцию и изменил код в ней.

public void decryptLW(InputStream in, OutputStream out, String password, byte[] salt, final int iterationCount) throws Exception {

    PKCS12ParametersGenerator pGen = new PKCS12ParametersGenerator(new SHA256Digest());
    char[] passwordChars = password.toCharArray();
    final byte[] pkcs12PasswordBytes = PBEParametersGenerator.PKCS12PasswordToBytes(passwordChars);
    pGen.init(pkcs12PasswordBytes, salt, iterationCount);
    CBCBlockCipher aesCBC = new CBCBlockCipher(new AESEngine());
    ParametersWithIV aesCBCParams = (ParametersWithIV) pGen.generateDerivedParameters(256, 128);
    aesCBC.init(false, aesCBCParams);
    PaddedBufferedBlockCipher aesCipher = new PaddedBufferedBlockCipher(aesCBC, new PKCS7Padding());

    try {

        // Read in the decrypted bytes and write the cleartext to out
        int numRead = 0;
        while ((numRead = in.read(buf)) >= 0) {

            byte[] plainTemp = new byte[aesCipher.getOutputSize(buf.length)];
            int offset = aesCipher.processBytes(buf, 0, buf.length, plainTemp, 0);
            int last = aesCipher.doFinal(plainTemp, offset);
            final byte[] plain = new byte[offset + last];
            System.arraycopy(plainTemp, 0, plain, 0, plain.length);

            out.write(plain, 0, numRead);
        }
        out.close();
        in.close();
    } catch (java.io.IOException e) {
    }

}

И у меня есть ошибка:

org.bouncycastle.crypto.InvalidCipherTextException: блок pad поврежден
в org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(Неизвестный источник)
at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal (Неизвестный источник)

Что можно сделать, чтобы устранить эту ошибку?И что я должен изменить в этой функции, чтобы получить возможность шифровать файлы.

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Наконец-то я обнаружил проблему, я не инициализировал aesCipher.Когда я добавил метод aesCipher.init(true, aesCBCParams); it started working.

А также я изменил код:

int numRead = 0;
        while ((numRead = fin.read(buf)) >= 0) {
            if (numRead == 1024) {
                byte[] plainTemp = new byte[aesCipher.getUpdateOutputSize(numRead)];
                int offset = aesCipher.processBytes(buf, 0, numRead, plainTemp, 0);

                final byte[] plain = new byte[offset];
                System.arraycopy(plainTemp, 0, plain, 0, plain.length);
                fout.write(plain, 0, plain.length);
            } else {
                byte[] plainTemp = new byte[aesCipher.getOutputSize(numRead)];
                int offset = aesCipher.processBytes(buf, 0, numRead, plainTemp, 0);
                int last = aesCipher.doFinal(plainTemp, offset);
                final byte[] plain = new byte[offset + last];
                System.arraycopy(plainTemp, 0, plain, 0, plain.length);
                fout.write(plain, 0, plain.length);
            }
        }
0 голосов
/ 10 ноября 2011

У вас проблема с прокладкой.Это может означать, что входящий шифротекст был зашифрован с использованием другого отступа, а не PKCS7.Это может означать, что входящий шифротекст был зашифрован в другом режиме (не CBC).Это может означать, что у вас неправильный ключ, поэтому последний блок расшифровывается как случайный.Если ваше сообщение имеет длину только один блок, это может означать, что у вас неисправный IV, поэтому снова заполнение повреждено.

Вам необходимо убедиться, что клавиша, режим, заполнение и IV идентичны на обоих концах.Это означает проверку ключа и байта IV.

...