【问题标题】:PGP BouncyCastle + Kleopatra Decryption: Unknown Packet Type: 20PGP BouncyCastle + Kleopatra 解密:未知数据包类型:20
【发布时间】:2022-07-23 19:47:06
【问题描述】:

我正在尝试使用 C# 中的 BouncyCastle 解密已通过 Kleopatra 使用 RSA 加密的文件。不幸的是,在处理前几行解密时,我收到一条错误消息,指出“遇到未知数据包类型:20”。 (伪)代码:

   using (Stream inputStream = File.OpenRead(test.txt.gpg))
   {
       using (Stream keyIn = File.OpenRead(privatekey.asc))
       {
                PgpObject o = null;

                PgpObjectFactory pgpF = new PgpObjectFactory(PgpUtilities.GetDecoderStream(inputStream));
                
                PgpSecretKeyRingBundle pgpSec = new PgpSecretKeyRingBundle(PgpUtilities.GetDecoderStream(privateKeyStream));

                if (pgpF != null)
                {
                    o = pgpF.NextPgpObject(); -- THIS LINE THROWS THE UNKNOWN PACKET TYPE ERROR
                }
       }
   }

谷歌搜索后,我看到了上面代码sn-p模型的例子,但我还没有看到任何关于未知数据包类型的信息。

有谁知道我是否做错了什么,或者可以指出错误代码编号的文档方向吗?

提前感谢您的宝贵时间。

【问题讨论】:

  • 我遇到了类似的问题。我可以用我在 SO 上找到的代码加密/解密文件,我可以用代码加密文件,然后使用 Kleopatra 解密,但我不能使用代码解密用 Kleopatra 加密的任何内容。我从充气城堡测试中得到了我的代码,这里是:stackoverflow.com/questions/6987699/…

标签: c# encryption bouncycastle openpgp


【解决方案1】:

此数据包类型不属于RFC 4880 中定义的官方 OpenPGP 标准的一部分,该标准仅定义了最多 19 种数据包类型(请参阅第 4.3 节)。

但是,有一个Work in progress to update the OpenPGP specification from RFC4880 将数据包类型 20 定义为 AEAD 加密数据包(参见第 5.16 节)。

AEAD 表示Authenticated Encryption with Associated Data。它允许在身份验证部分中包含来自实际加密数据之外的数据。这旨在使加密数据无法在其原始上下文之外使用,从而有效地禁用重放攻击。

显然,该草案尚未获得批准(还没有?),但也已过期。我不确定这到底意味着什么。尽管如此,GnuPG 似乎已经在其新版本 2.3(Kleopatra 在后台使用)中实施了该提案,甚至将其设为默认,据我了解文档(引自 OpenPGP protocol specific options):

除非密钥表明可以使用 AEAD 算法,否则始终使用 MDC。在这种情况下使用 AEAD。

BouncyCastle 目前不支持使用 AEAD 进行 PGP 加密。作为解决此问题的方法,应使用带有 --rfc4880--openpgp 标志的 GnuPG 生成 PGP 密钥,以确保密钥符合 RFC 4880。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2011-08-05
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多