从 OpenSSL 加密为 PGP

从 OpenSSL 加密为 PGP

我有一个工具,它接受 RSA 公钥(例如 OpenSSL PEM 格式的密钥),用该公钥加密消息,然后返回加密消息。我将收到一个 PGP 公钥,需要将其传递给接受 RSA 公钥的工具,然后将加密数据返回给发送 PGP 密钥的人,以便他们可以使用 PGP 解密。

我发现最接近的问题是“如何使用 openssl 命令执行 PGP 加密和解密方法“虽然这并非我所寻找的,但它确实提供了部分解决方案。但是,我还需要更多,特别是如何在两种格式之间进行转换。

我如何获取 PGP 密钥、从中提取公共 RSA 密钥、将其转换为 PEM 格式,然后获取加密数据并将其重新转换为 PGP 可理解的格式?

答案1

使用 OpenSSL 转换密钥并不容易;你必须自己编写所有 PGP 解析代码,请参阅RFC 4880。将 n 和 e 值作为字节数组后,可以将它们放入 bignums 中,然后放入 RSA 结构中,然后调用PEM_write[_bio]_RSA_PUBKEY。我个人更喜欢使用 Java 中的 BouncyCastle 来执行此操作,它直接支持 jar 中的 PGP 密钥和数据bcpg以及 jar 中的 OpenSSL 密钥(和一些数据)bcpkix

转换数据可能是不可能的。首先,不可能简单地用 RSA 加密“消息”——RSA 仅适用于有限大小的数据,目前约为 200 字节,这通常不足以满足人们需要的数据(“推文”除外)。实际上,系统和应用程序几乎总是使用“混合”加密——数据使用“对称”(经典、密钥)算法(例如带有随机数密钥的 AES)进行加密,随机数密钥使用“非对称”(公钥)RSA 算法进行加密。有几种不同的方法可以进行 RSA 加密,还有几十到几百种不同的方法(主要是“模式”)可以进行对称加密。您需要找出确切地该“工具”正在进行哪种加密。

对于(通常的)收件人公钥的情况,PGP 使用最初的 PKCS1 “块类型 02”加密,现在改名为 RSAES-PKCS1-v1_5,结合几种对称算法(有些常见,有些不常见)中的一种,采用 CFB 模式的变体,这种模式其他人根本就没用过(本世纪很少有其他东西使用这种模式)。任何一种 CFB)。PGP 接收者可能只接受对称算法的一个子集,如果是这样,这将在 PGP 密钥块中表达,发送者应该读取并遵守该密钥块,但 OpenSSL 使用的公钥格式,X.509/PKIX 中的 SubjectPublicKeyInfo 结构,无法表示此信息。(X.509/PKIX证书,OpenSSL 也支持它,并且大多数设计良好的 OpenSSL 软件都使用它,它可以表示这些信息,但形式与 PGP 截然不同。)

此外,PGP 的 CFB 变体不具备身份验证功能。早在 1990 年,人们还没有意识到这是一个漏洞,但现在人们已经意识到了,因此许多接收者需要或至少更喜欢使用 PGP 选项进行身份验证,这就是现在其他人所说的消息认证代码,但 PGP 称之为修改检测代码。PGP 的 MDC 方案与其他任何使用的 MAC 方案都不同。

因此,简而言之,除非该“工具”被设计用于进行 PGP 加密,否则其输出不能“转换”为 PGP,除非对其进行解密和重新加密。如果它是由一个理智的人设计用于进行 PGP 加密,那么它已经可以接受 PGP 公钥了。但是,由于该工具无法确定上述“SPKI”公钥是否真正属于预期的接收者,因此您可以生成自己的自己的密钥对,给工具你的publickey,接收使用加密的数据你的密钥并解密,然后使用实际接收者密钥和与该密钥匹配的算法(和 MDC 选项)以 PGP 兼容格式重新加密。

相关内容