给定十六进制或基数 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
从技术上讲是的,如果您“手动”完成所有操作,并且您希望收件人手动取消所有操作。但即便如此,也已经存在几个问题。
首先,RSA 只接受非常短的明文。您不能使用它来加密整封电子邮件。(这取决于密钥大小和使用的填充,您必须使用它来确保 RSA 加密的安全,但是)一般用法是永远不会使用 RSA 直接加密真实数据——人们总是会使用它处于“混合模式”,其中 AES(或类似的)加密明文,而 RSA 仅加密 AES 密钥。
因此,在实践中,您需要就使用什么 RSA 填充、使用什么对称密码、使用哪种分组密码模式(如果适用)、使用哪种 MAC 方案、应用操作的顺序(例如加密-然后-MAC)等。
使用“标准公钥文件”之类的
.asc
(持有 OpenPGP 证书)或.pem
/.crt
(持有 X.509 证书)的原因之一是这些系统已经弄清楚了这些事情。当您有一个 .asc 文件并将其提供给 GnuPG 等 PGP 软件时,它不会使用原始 RSA,它已经设计为使用混合模式。第二件事是您已经有一个标准的公钥文件——您在 vCard(即一个文件)中有一个完美的 X.509 证书
.crt
,可以使用 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 等价物——但他们为什么要这样做,我真的不知道。再说一次,这是他们需要知道的事情——即就像要使用的密码一样,这是另一个需要商定的参数。)
为了完整起见,是否可以获取现有的原始 RSA 公钥并将其包装在 PGP 或 X.509 证书中?是的,几乎,但不完全是。这里还有更多的问题。
首先,对于 PGP,没有多少工具可以以这种方式使用。(令人惊讶的是,PGP 是两者中更复杂的格式,所以我不会尝试手动操作。)如果必须这样做,那么我可能会从 Sequoia 库开始。
反过来,创建 X.509 证书在技术上是一项更容易的任务,因为格式“只是”ASN.1,所以我会使用 Ruby 的 Net::OpenSSL 或 Python 的 python-certbuilder 或类似的东西。这实际上是一项常见的任务,因为 CA 首先就是这样颁发证书的——他们已经需要在签署之前将原始 pubkey 从 .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 证书来做同样的事情。