给定十六进制或基数 64 的公钥,如何生成可用于 PGP 程序的 .asc 文件?
例如,假设我有某人的 RSA 公钥,以十六进制表示:
04 40 ad 77 10 45 08 f2 3a ae 1d 1d 95 22 2f b3 f5 e5 2f da db 8c 39 3a 03 15 fb 4b 36 28 46 de 7b 00 f4 73 11 ae b9 ac 00 aa 19 34 6d fb 7c 56 b1 93 c0 1b 86 7c d0 a2 0b 4d 22 a9 d2 4d b0 f6 34 c4
我怎样才能将该号码转换为标准公钥文件(例如.asc
)?
据我所知,RSA 接收纯文本(任何数据)和接收方的公钥(一个长数字)并输出密文。因此,除了这个数字之外,我不需要任何其他东西来发送加密消息。
我正在尝试使用 VCard 上的 X.509 密钥发送加密电子邮件。
我还没能找到一个程序,可以做到这一点,并gpg --import
显示no valid OpenPGP data found
答案1
据我所知,RSA 接收纯文本(任何数据)和接收方的公钥(一个长数字)并输出密文。因此,除了这个数字之外,我不需要任何其他东西来发送加密消息。
技术上是的,如果你“手动”完成所有操作,并且希望收件人手动撤销所有操作。但即便如此,也已经存在一些问题。
首先,RSA 只需要很短明文。您不能用它来加密整封电子邮件。(这取决于密钥大小以及所使用的填充,您可以必须使用 RSA 加密是安全的,但)一般用法是,人们永远不会使用 RSA 直接加密真实数据 - 人们会总是在“混合模式”下使用它,其中 AES(或类似)加密纯文,而 RSA 仅加密 AES 密钥。
因此在实践中,您需要与接收者达成一致,使用哪种 RSA 填充、使用哪种对称密码、使用哪种分组密码模式(如果适用)、使用哪种 MAC 方案、以何种顺序应用操作(例如,先加密然后 MAC)等。
使用“标准公钥文件”(例如.asc
(包含 OpenPGP 证书)或.pem
/ .crt
(包含 X.509 证书))的原因之一是这些系统已经弄清楚了这些事情。当您拥有 .asc 文件并将其提供给 GnuPG 等 PGP 软件时,它不会使用原始 RSA,因为它已经设计为使用混合模式。
我正在尝试使用 VCard 上的 X.509 密钥发送加密电子邮件。
第二件事是你已有标准公钥文件– 您在 vCard(即文件.crt
)中有一个完好的 X.509 证书,可以使用 S/MIME 或 CMS 标准进行加密。无需提取其公钥并创建全新的文件 – 您的邮件应用程序很可能可以直接从 vCard 导入 X.509 证书,甚至自动使用它进行加密。
(流行的 GnuPG 套件附带一个gpgsm
工具,它可以采用 X.509 证书并像gpg
PGP 一样进行 S/MIME 加密/解密。)
与此相关的是:如果您收到了 X.509 证书,则非常强烈暗示收件人希望您以 S/MIME 格式加密消息。假设您提取了 RSA 公钥(模数),然后使用一些工具将其放入 .asc 文件(即 OpenPGP 证书)中,并继续发送以 PGP 格式加密的电子邮件消息。收件人将无法解密,要么是因为他们的电子邮件软件首先无法识别 PGP/MIME(许多应用程序只支持 S/MIME),要么是因为它知道无论如何都无法将 PGP 消息与 X.509 私钥对匹配(即使同时使用 PGP 和 S/MIME 的人也几乎普遍拥有不同的密钥对)。
(好吧,从技术上讲,他们可以通过将其 X.509 证书和私钥转换为 OpenPGP 等效证书和私钥,按照与您相同的程序进行解密。但为什么会他们是否愿意这样做,我真的不知道。而且,这也是他们需要做的知道做什么– 即就像要使用的密码一样,它是另一个需要达成一致的参数。)
我怎样才能将这个号码转换成标准公钥文件(例如.asc)?
为了完整起见,是是否有可能将现有的原始 RSA 公钥包装到 PGP 或 X.509 证书中?是的,几乎,但还不完全是。这里还有更多的问题。
首先,对于 PGP,没有太多工具可以这样使用。(令人惊讶的是,PGP 是两种格式中更复杂的一种,所以我不会尝试手动操作。)如果必须的话,我可能会从 Sequoia 库开始。
反过来创建 X.509 证书在技术上是一项更简单的任务,因为格式“只是”ASN.1,所以我会使用 Ruby 的 Net::OpenSSL 或 Python 的 python-certbuilder 或类似的东西。这实际上是一项常见的任务,因为 CA 首先就是这样颁发证书的——在签署证书之前,他们已经需要将原始公钥从 .csr 复制到新证书中。
这导致了第二个问题。如果你正在制作 X.509 证书,那么必须符号该证书可供您的 S/MIME 程序接受。它不能是“自签名的”,因为您没有私钥,因此您需要为此目的制作自己的内部 S/MIME CA 证书。
如果你正在制作 PGP 证书,那么它会更难一些,因为它的子包必须由同一密钥进行自签名(又称“子密钥绑定签名”),目的正是防止有人将虚假的用户 ID 附加到您的证书,或分发捆绑了虚假子密钥的真实证书。如果没有相应的私钥,您将无法成功创建.asc
现代 PGP 工具可以接受的文件。
(如果你有私人的密钥:您可以将 X.509 密钥对(.p12 或 .pfx 文件)导入 gpgsm,后者恰好与 gpg 共享其私钥存储 - 然后使用 gpg 在专家模式下“生成”新的 PGP 密钥,并在提示时选择使用现有密钥对的选项。然后程序将为您完成所有工作。)
因此,关于唯一相关的标准格式可以产生的是“半原始”PKCS#1 或 PKCS#8 公钥,是openssl rsa
和openssl pkey
工具处理的那种——它没有元数据,只有实际的 RSA 模数和指数。现在这种格式在某些情况下仍然有用(您甚至不需要手动创建这样的文件——如果需要,OpenSSL 可以直接从 X.509 证书中提取它),例如,也许您可以使用手动openssl cms
调用来创建 S/MIME 电子邮件消息,但是……您可以使用整个 X.509 证书来做同样的事情。