Получение расшифровки GPG для работы в Java (Bouncy Castle)
позвольте мне начать с того, что я чрезвычайно новичок во всем этом. Я пытаюсь использовать gpg из Java, чтобы расшифровать зашифрованный файл.
Что я сделал успешно:
Если бы мой коллега зашифровал файл, используя мой открытый ключ и свой закрытый ключ, он успешно расшифровал его.
Пошли в другую сторону
Если бы другой коллега попытался расшифровать файл, который был не для него: сбой (как и ожидалось)
Мой ключ был сгенерирован так ...
(gpg --version говорит мне, что я использую 1.4.5 и использую Bouncy Castle 1.47)
gpg --gen-ley
Выберите опцию «DSA и Elgamal (по умолчанию)»
Заполните остальные поля и сгенерируйте ключ.
Файл был зашифрован с использованием моего открытого ключа и чужого секретного ключа. Я хочу расшифровать это. Я написал следующий код Java для достижения этой цели. Я использую несколько устаревших методов, но не могу понять, как правильно реализовать фабричные методы, необходимые для использования не устаревших версий, поэтому, если у кого-то есть идеи по реализации тех, которые я должен использовать, это будет приятный бонус
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 по адресу org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (Неизвестный источник) по адресу org.bouncycastle.jcajce.provider.asymmetric.herga. engineInit (неизвестный источник) на javax.crypto.Cipher.init (DashoA13 * ..) на javax.crypto.Cipher.init (DashoA13 * ..) ... еще 8
Я открыт для множества предложений: от «не используйте gpg, используйте вместо этого x» до «не используйте надувной замок, используйте вместо x» что-нибудь промежуточное. Спасибо!