使用 BouncyCastle C# 进行 PGP 加密会导致签名验证时发出无效密钥警告

Kim*_*jor 5 c# bouncycastle pgp

我们需要对文件进行 PGP 加密并通过 FTP 将其发送给第三方。文件使用第三方的 DH/DSS 公钥加密,并使用我们的私钥签名。

第三方拥有我们的公钥和他们自己的私钥。加密/解密有效,但第三方在尝试验证我们的签名时会收到警告。

当我们尝试使用 PGP Desktop 解密和验证类似加密的文件时,文件会在没有警告的情况下进行验证。

第三方正在使用“McAfee E-Business Server”

确切的警告是:警告:错误签名,与文件内容不匹配!用户“用户名”的签名错误

代码有点复杂,不过我把它发布到我的博客上了。如果更合适的话,我可以将其发布在这里而不是链接。

任何有关如何解决此问题的见解都将受到赞赏。

Kim*_*jor 3

虽然我无法对问题的细节给出彻底的解释,但这里有一个可行的解决方案。首先,似乎不同的 PGP 实现对于使用哪个程序来生成正在使用的密钥非常敏感。

失败的场景:

  1. 在 PGP Desktop 中创建密钥(RSA v4、2048/2048)
  2. 在 BouncyCastle 中加密(DH/DSS、Elgamal)
  3. 登录 BouncyCastle(使用 RSA 密钥)
  4. PGP Desktop 中解密和签名验证成功。
  5. McAfee Business Server 中解密成功,但签名验证失败。

为了使 McAfee Business Server 成功验证密钥,请使用 BouncyCastle 源代码中的代码在 BouncyCastle 中创建密钥。(Org.BouncyCastle.Bcp​​g.OpenPgp.Examples.RsaKeyRingGenerator) 如果您需要特定密钥,可以更改此代码特性。

另一种替代方法是使用 McAfee Business Server 生成密钥。为此,您需要访问该软件。我用试用版进行了测试。(顺便说一下,起身跑步是一件很痛苦的事情)

更新:我在电子商务服务器 8.5.3(试用版)上进行了所有测试。我已经达到了可以加密和登录 Bounty 并在电子商务服务器中解密和验证的程度。结果第三方使用的是 E-Business Server 7.0,它拒绝验证签名。为了让一切正常工作,我们需要创建 V3 签名。

我们从:

PgpSignatureGenerator pgpSignatureGenerator = new PgpSignatureGenerator(m_encryptionKeys.SecretKey.PublicKey.Algorithm, HashAlgorithmTag.Sha1);
Run Code Online (Sandbox Code Playgroud)

PgpV3SignatureGenerator pgpV3SignatureGenerator = new PgpV3SignatureGenerator(m_encryptionKeys.SecretKey.PublicKey.Algorithm, HashAlgorithmTag.Sha1);
Run Code Online (Sandbox Code Playgroud)