19

私は、PGP 復号化に Bouncy Castle を使用するアプリケーションを使用しており、過去 8 か月ほどの間、問題なく動作していましたが、過去 2 日間で突然、GetDataStream メソッドが例外をスローするという問題が発生しました。

例外メッセージ: 「非対称暗号の設定エラー」。

内部例外メッセージ:「RSA キーではありません」。

private static PgpObjectFactory getClearDataStream(PgpPrivateKey privateKey, PgpPublicKeyEncryptedData publicKeyED)
{
    // Exception throws here.
    Stream clearStream = publicKeyED.GetDataStream(privateKey);

    PgpObjectFactory clearFactory = new PgpObjectFactory(clearStream);
    return clearFactory;
}

キーの有効期限は切れていません。有効期限はありません。

ここに画像の説明を入力

アプリケーションに何の変更も加えておらず、キーにも触れていないため、なぜ問題が突然発生したのかよくわかりません。何か案は?アプリケーションにロードしたのと同じキーを使用して、Kleopatra を使用してファイルを手動で復号化することもできます。

更新 1 - OpenPGP Library for .NETの無料試用版をダウンロードしました。これは BouncyCastle も使用しているようですが、同じキーを使用してファイルを復号化しても問題はありません。数か月動作していた BouncyCastle を使用した復号化の実装が、何らかの理由で動作しなくなりましたが、まだ特定できていません。

更新 2 - 機能した先週のファイルを取得しました。また、BouncyCastle のソース コードもダウンロードして、ステップスルーしてデバッグし、例外がスローされている場所と、機能するファイルと機能するファイルとの間で変数がどのように異なるかを確認できるようにしました。動かないファイル。PgpPublicKeyEncryptedData クラスの GetDataStream メソッドの先頭で例外がスローされています。

byte[] plain = fetchSymmetricKeyData(privKey);

このメソッドに足を踏み入れると、問題なく復号化できるファイルの場合、keyData.Algorithm 変数が「ElGamalEncrypt」に設定されていることに気付きましたが、例外がスローされたファイルの場合、ファイル keyData.Algortithm はに設定されています。 「RsaGeneral」。なぜこれらは異なるのでしょうか?ファイルを送ってくれた会社は暗号化方式を変更しましたか? また、この暗号化方式は BouncyCastle で適切にサポートされていませんか?

private byte[] fetchSymmetricKeyData(PgpPrivateKey privKey)
{
    IBufferedCipher c1 = GetKeyCipher(keyData.Algorithm);

    try
    {
        c1.Init(false, privKey.Key);
    }
    catch (InvalidKeyException e)
    {
        throw new PgpException("error setting asymmetric cipher", e);
    }

また、これが関連しているかどうかはわかりませんが、キーの証明書の種類は DSA です。

ここに画像の説明を入力

更新 3 - 現在のキーが与えられた時点で、問題を解決する方法を理解できませんでした。昨日新しいキー (タイプ DSA) を生成しましたが、新しいキーで問題は解決されました。

更新 4 - この問題は、前回の更新で機能した新しいキーで再び発生しました。繰り返しになりますが、PgpPublicKeyEncryptedData クラス内の keyData.Algorithm は、「ElGamalEncrypt」ではなく「RsaGeneral」に表示されます。Algorithm プロパティが変更されるのはなぜですか? ファイルを暗号化している人は何かを変更していますか?

4

2 に答える 2

1

これは重要である可能性があります(ソース:http ://www.opensourcejavaphp.net/csharp/itextsharp/PgpPublicKeyEncryptedData.cs.html ):

それはあなたのkeyData.Algorithmの値が異なることを説明していますが、なぜ私はまだ確信が持てません。ほとんどの場合、入力ファイルが当てはまります。異なる可能性があります(クライアントが別のキーを使用していますか?)

private static IBufferedCipher GetKeyCipher(
            PublicKeyAlgorithmTag algorithm)
        {
            try
            {
                switch (algorithm)
                {
                    case PublicKeyAlgorithmTag.RsaEncrypt:
                    case PublicKeyAlgorithmTag.RsaGeneral:
                        return CipherUtilities.GetCipher("RSA//PKCS1Padding");
                    case PublicKeyAlgorithmTag.ElGamalEncrypt:
                    case PublicKeyAlgorithmTag.ElGamalGeneral:
                        return CipherUtilities.GetCipher("ElGamal/ECB/PKCS1Padding");
                    default:
                        throw new PgpException("unknown asymmetric algorithm: " + algorithm);
                }
            }
            catch (PgpException e)
            {
                throw e;
            }
            catch (Exception e)
            {
                throw new PgpException("Exception creating cipher", e);
            }
        }
于 2012-06-21T09:47:10.507 に答える
0

別の当事者が他の/異なるキーに暗号化しているようです。おそらくキーリングには RSA キーも含まれていますが、BouncyCastle は最初の (???) のみを使用します。gpg を使用すると、gpg --list-packets YourEncryptedFile.pgp を発行して、暗号化されたファイルの内容を確認できます。

その後、同じコマンドを「正常な」ファイルとキーリングに適用し、どのファイルが暗号化されているかのキー識別子を比較します。DSA キーを使用しているため、ファイルは ElGamal サブキーに暗号化する必要があります。

于 2012-12-02T09:59:18.053 に答える