私はこれらすべてに非常に慣れていないと言って始めましょう。私がやろうとしているのは、暗号化されたファイルを復号化するために Java 内から gpg を使用することです。
私が成功したこと:
同僚に私の公開鍵と彼の秘密鍵を使用してファイルを暗号化し、正常に復号化してもらいました。
反対に行った
別の同僚が、彼向けではないファイルを復号化しようとした場合: 失敗 (予想どおり)
私の鍵はこのように生成されました...
(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: 不明なキー タイプが org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (不明なソース) で ElGamal に渡されました。 engineInit(Unknown Source) at javax.crypto.Cipher.init(DashoA13*..) at javax.crypto.Cipher.init(DashoA13*..) ... 8 もっと見る
ここでは、「gpg を使用しないで、代わりに x を使用する」から「弾む城を使用しないで、代わりに x を使用する」まで、その中間にあるものまで、多くの提案を受け付けています。ありがとう!