Позвольте мне начать с того, что я очень новичок в этом. Я пытаюсь использовать gpg изнутри Java, чтобы расшифровать зашифрованный файл.
Что я сделал успешно:
-
Если бы коллега зашифровал файл с использованием моего открытого ключа и его закрытого ключа и успешно расшифровал его.
-
Пошел другим способом
-
Если бы другой коллега попытался расшифровать файл, который не был для него: сбой (как ожидалось)
Мой ключ был сгенерирован следующим образом:
(gpg --version говорит мне, что я использую 1.4.5, и я использую Bouncy Castle 1.47)
gpg --gen-ley
Выберите опцию "DSA и Elgamal (по умолчанию)"
Заполните другие поля и сгенерируйте ключ.
Файл был зашифрован с использованием моего открытого ключа и другого секретного ключа. Я хочу расшифровать его. Для этого я написал следующий код Java. Я использую несколько устаревших методов, но я не могу понять, как правильно внедрять методы factory, необходимые для использования устаревших версий, поэтому, если у кого-то есть идея о реализации тех, которые я должен использовать, быть хорошим бонусом.
Security.addProvider(new BouncyCastleProvider());
PGPSecretKeyRingCollection secretKeyRing = new PGPSecretKeyRingCollection(new FileInputStream(new File("test-files/secring.gpg")));
PGPSecretKeyRing pgpSecretKeyRing = (PGPSecretKeyRing) secretKeyRing.getKeyRings().next();
PGPSecretKey secretKey = pgpSecretKeyRing.getSecretKey();
PGPPrivateKey privateKey = secretKey.extractPrivateKey("mypassword".toCharArray(), "BC");
System.out.println(privateKey.getKey().getAlgorithm());
System.out.println(privateKey.getKey().getFormat());
PGPObjectFactory pgpF = new PGPObjectFactory(
new FileInputStream(new File("test-files/test-file.txt.gpg")));
Object pgpObj = pgpF.nextObject();
PGPEncryptedDataList encryptedDataList = (PGPEncryptedDataList) pgpObj;
Iterator objectsIterator = encryptedDataList.getEncryptedDataObjects();
PGPPublicKeyEncryptedData publicKeyEncryptedData = (PGPPublicKeyEncryptedData) objectsIterator.next();
InputStream inputStream = publicKeyEncryptedData.getDataStream(privateKey, "BC");
Поэтому, когда я запускаю этот код, я узнаю, что мой алгоритм и формат для моего секретного ключа следующие:
Алгоритм: DSA Формат: PKCS # 8
И затем он разбивается на последнюю строку:
Exception in thread "main" org.bouncycastle.openpgp.PGPException: error setting asymmetric cipher
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.decryptSessionData(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.access$000(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder$2.recoverSessionData(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at TestBouncyCastle.main(TestBouncyCastle.java:74)
Вызвано: java.security.InvalidKeyException: неизвестный тип ключа, переданный ElGamal at org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(Неизвестный источник) at org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit(Неизвестный источник) на javax.crypto.Cipher.init(DashoA13 *..) на javax.crypto.Cipher.init(DashoA13 *..) ... еще 8
Я открыт для многих предложений здесь: "не используйте gpg, используйте x вместо", чтобы "не использовать bouncy castle, используйте x вместо", чтобы что-либо между ними. Спасибо!