Как зашифровать сообщение PGP с помощью криптографического расширения Java?

В настоящее время я использую библиотеки надувного замка для реальной работы и нашел пример на sloanseaman.com, который (после небольшой настройки) работает с v1.52.

У меня также есть рабочий пример от developer.com того, как использовать интерфейс JCE, и я могу даже добавить в него bcprov и использовать некоторые из его алгоритмов.

public class CryptoUtil {
private static final String ALGORITHM = "IDEA/PGP/NoPadding";

public static void encryptFile(File keyFile, File plainTextFile, File encryptedFile) throws GeneralSecurityException, IOException {
    Cipher desCipher = Cipher.getInstance(ALGORITHM);
    desCipher.init(Cipher.ENCRYPT_MODE, readKeyFromFile(keyFile));
    OutputStream out = new BufferedOutputStream(new FileOutputStream(encryptedFile));
    InputStream in = new BufferedInputStream(new FileInputStream(plainTextFile));
    while (in.available() > 0) {
        // Read the next chunk of bytes...
        byte[] cleartextBytes = new byte[in.available()];
        in.read(cleartextBytes);
        // Now, encrypt them and write them to the encrypted file...
        byte[] encryptedBytes = desCipher.update(cleartextBytes);
        out.write(encryptedBytes, 0, encryptedBytes.length);
    }
    // Take care of any pending padding operations
    out.write(desCipher.doFinal());
    in.close();
    out.flush();
    out.close();

    System.out.println("Encrypted to " + encryptedFile);
}

Но независимо от того, какую строку алгоритма я использую, я не могу заставить свою утилиту JCE шифровать так, как это делает утилита bouncyCastle.

Самое далекое, что я получил, это использование «IDEA / PGP / NoPadding», которое позволяет мне шифровать и расшифровывать внутри себя, но утилита BC не будет их расшифровывать, говоря, что в потоке есть неизвестный объект.

Вот мой исходный код

Ребята, вы знаете, какую комбинацию алгоритма, режима и заполнения мне нужно использовать для этого? Есть ли другие варианты, которые мне нужно как-то применить? Я предполагаю, что мне нужно использовать версию AlgorithmParametersSpi от BC, но я еще не понял, как ее создать.


person mike    schedule 01.09.2015    source источник


Ответы (1)


Вы не можете. В то время как OpenPGP использует «обычные» общедоступные/частные и симметричные алгоритмы шифрования, проблемы начинаются с режимов. OpenPGP использует собственный режим (модифицированный режим CFB), а также весь OpenPGP синтаксис пакета не поддерживается стандартными библиотеками Java.

Вам, по крайней мере, нужно будет повторно реализовать режим OpenPGP CFB на Java или как-то полагаться на реализацию Bouncy Castle.

Режим OpenPGP CFB уже включает замену вектора инициализации; никакие дополнительные отступы не используются/не требуются.

person Jens Erat    schedule 02.09.2015
comment
Я вижу, что есть режим OpenPGPCFB, поэтому моя строка алгоритма — IDEA/OpenPGPCFB/NoPadding. Это то, о чем ты говоришь? Я получаю аналогичные результаты, когда использую эту строку. - person mike; 02.09.2015
comment
Я не могу найти какие-либо режимы PGP или OpenPGPCFB в документации по Java. Где вы нашли информацию о них? - person Jens Erat; 02.09.2015
comment
Это часть реализации BC здесь. Но я не могу найти примеры, которые действительно используют этот режим. Использование этого режима OpenPGPCFB работает само по себе, но никакая другая утилита PGP не знает, как его расшифровать. - person mike; 02.09.2015
comment
Для отладки gpg --list-packets и pgpdump могут помочь понять, правильно ли вы получили пакеты OpenPGP. - person Jens Erat; 02.09.2015