3

Bouncy Castle を使用して GPG ファイルを復号化できません。暗号化されたファイルがあり、秘密鍵と秘密鍵のパスワードがあります。デスクトップ ソフトウェア GPG4win Kleopatra を使用してファイルを正常に復号化できるため、正しい秘密鍵があり、gpg ファイルは有効です。

しかし、アプリケーションが Bouncy Castle でデータを復号化しようとするコード行に到達すると、次のエラーが表示されます。

Unable to cast object of type 'Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters' to type 'Org.BouncyCastle.Crypto.Parameters.ElGamalKeyParameters'.

クレオパトラと同じ秘密鍵を使用して同じファイルを復号化しているので、おそらく秘密鍵ファイルを予想される形式に変更するか、Bouncy Castle でいくつかのオプションを設定することで解決できるはずです。

秘密鍵ファイルは、次の行で始まるプレーン テキスト ファイルです。

-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v2.0.17 (MingW32)

これは、復号化コードの平坦化されたバージョンです。私が何かを逃した場合はお詫び申し上げます:

PgpEncryptionKeys encryptionKeys = new PgpEncryptionKeys(publicKey, privateKey, passPhrase);

Stream encryptedStream = new StreamReader(encryptedFileName).BaseStream;
Stream encodedFile = PgpUtilities.GetDecoderStream(inputStream);

PgpObjectFactory factory = new PgpObjectFactory(encodedFile);
PgpObject pgpObject = factory.NextPgpObject();

PgpEncryptedDataList encryptedDataList;
if (pgpObject is PgpEncryptedDataList)
{
    encryptedDataList = (PgpEncryptedDataList)pgpObject;
}
else
{
    encryptedDataList = (PgpEncryptedDataList)factory.NextPgpObject();
}

PgpPublicKeyEncryptedData myEncryptedData = null;
PgpPublicKeyEncryptedData publicKeyED = null;
foreach (PgpPublicKeyEncryptedData encryptedData in encryptedDataList.GetEncryptedDataObjects())
{
    if (encryptedData != null)
    {
        myEncryptedData = encryptedData;
        break;
    }
}

Stream clearStream = myEncryptedData.GetDataStream(privateKey);
PgpObjectFactory clearFactory = new PgpObjectFactory(clearStream);

PgpObject message = clearFactory.NextPgpObject();
if (message is PgpCompressedData)
{
    message = ProcessCompressedMessage(message);
    PgpLiteralData literalData = (PgpLiteralData)message;
    using (Stream outputFile = File.Create(outputFilePath))
    {
        using (Stream literalDataStream = literalData.GetInputStream())
        {
            Streams.PipeAll(literalDataStream, outputFile);
        }
    }
}

例外は次の行で発生します。

Stream clearStream = myEncryptedData.GetDataStream(privateKey);

何か試してみたいことを提案していただければ幸いです。見逃した可能性のある詳細を提供できます。

ありがとう!

4

0 に答える 0