我正在将 C 用于我正在实施的小型 Crypto 库。我有 n (= p*q) 和 e (> 1, n 的互质数)。如何将这两个数字转换为一键?
1 回答
1
将密钥转换为结构的规范在PKCS#1 规范中。这基本上就是这个 ASN.1 结构:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
然后使用 DER(ASN.1 的区分编码规则)对其进行编码。这是一种二进制编码,当然可以转换为base 64。但通常它不仅转换为base 64,它还会分成多行并由页眉行和页脚行包裹,从而为您提供PEM。在这种情况下,标题应指示RSA PUBLIC KEY.
如果您想要更高的兼容性,那么二进制 PKCS#1 结构之前依次是 X.509 证书中使用的描述性包装器(在 Web 浏览器中使用的那些)。该结构被调用SubjectPublicKeyInfo,PEM 包装器将指示类型PUBLIC KEY- 所以没有 RSA。二进制结构中的信息已经表明它是RSA 公钥。
但我想你会想从相对简单的 PKCS#1 结构开始,然后对其进行扩展。请尝试旧的 ASN.1、BER 和 DER 子集的外行指南以获取更多信息。
我喜欢标准,但您也可以对模数和公共指数使用两字节长度指示,然后将两者连接起来,如下所示:
<l_mod> <modulus> <l_exp> <pubexp>
然后您仍然需要考虑编码整数值的特定方法。我会使用无符号大端,这样密钥大小(以字节而不是位为单位)就是l_mod值。然后就可以base64上面的了。它在任何地方都没有标准化,但它更容易理解和编程。
于 2020-04-28T18:11:34.763 回答