在我自己实现的 RSA Lib 中,如何将 RSA 密钥的两部分转换为 b64?

In an RSA Lib I implemented myself, how do I convert the 2 parts of an RSA key to b64?

我将 C 用于我正在实现的小型加密库。我有 n ( = p*q) 和 e ( > 1, n 的互质)。如何将这2个数字转换为一个密钥?

将密钥转换为结构的规范在 PKCS#1 specification 中。这基本上就是这个 ASN.1 结构:

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

然后使用 DER(ASN.1 的独特编码规则)对其进行编码。这是一个二进制编码,当然可以转成base 64。不过一般不只是转成base 64,还会拆分成多行,用header行和footer行包起来,给出你PEM。在这种情况下,header 应该表示 RSA PUBLIC KEY.

如果您想要更高的兼容性,则二进制 PKCS#1 结构前面是 X.509 证书(在网络浏览器等中使用的证书)中使用的描述性包装器。该结构称为 SubjectPublicKeyInfo 并且 PEM 包装器将指示类型 PUBLIC KEY - 因此没有 RSA。它 一个 RSA public 密钥已经由二进制结构中的信息指示。

但我想您会希望从相对简单的 PKCS#1 结构开始,然后对其进行扩展。尝试旧的 A Layman's Guide to a Subset of ASN.1, BER, and DER 了解更多信息。


我喜欢标准,但您也可以对模数和 public 指数使用 two-byte 长度指示,然后将两者连接起来,如:

<l_mod> <modulus> <l_exp> <pubexp>

那么您仍然需要考虑一种对整数值进行编码的特定方法。我会使用无符号大端,这样密钥大小(字节而不是位)就是l_mod值。然后就可以base64上面了。它在任何地方都没有标准化,但更容易理解和编程。