公钥/私钥中的RSA密钥值和模数

时间:2013-07-17 07:04:05

标签: rsa pki rsacryptoserviceprovider

我正在编写一个使用PKI来保护电子邮件,文件等的应用程序。 使用System.Cryptography命名空间,我使用RSACryptoServiceProvider生成新的密钥对。

方法是:

public static void GenerateKeys(int keySize, out string publicKey, out string privateKey)
{
    using (var provider = new RSACryptoServiceProvider(keySize))
    {
        publicKey = provider.ToXmlString(false);
        privateKey = provider.ToXmlString(true);
    }
}

keySize = 2048.

这会产生一个公钥(例如,它已被修剪/填充“----- START / END PUBLIC KEY BLOCK -----”包装,以保持整洁。

-----START PUBLIC KEY BLOCK-----
<RSAKeyValue><Modulus>xs1GwyPre7/knVd3CAO1pyk++yp/qmBz2TekgrehYT
WU7hs8bUCeVQrL2OB+jm/AgjdPMohWHD/tLcJy35aZgVfPI3Oa3gmXxdoLZrfNRb
nrCm3Xr1MR7wnhMyBt5XXyU/FiF46g5qJ2DUIUg7teoKDNUSAN81JTIoH0KC+rZB
oO3tu9PR7H75K5G2eT6oUWkWKcZZU/4WNCDasNtizTe41Jy99BjrChww5r2ctqG8
LvIv7UeeFaK1vhxGKaNH/7JvKJI9LbewWNtmb/nRzQg9xK3e0OhblbW+o6zg5pTw
+n37fS7pkXK7lbRfUfaQmhoGy6ox4UWGmOgm8yPu8S4Q==</Modulus><Exponen
t>AQAB</Exponent></RSAKeyValue>
-----END PUBLIC KEY BLOCK-----`

当我查看基于PGP的公钥(或私钥)时,密钥中没有<RSAKeyValue><Modulus><Exponent>值。

我做错了吗?我错过了什么吗?如果我分发此密钥,这是一个安全问题吗?

Crypto对我来说是一个令人兴奋的新领域,所以我真的非常感谢这里的任何指导。我担心我搞砸了 - 对密钥工作进行加密并使用私钥进行解密工作 - 我只是想知道PGP / GPG密钥在外观上有多大差异以及我需要做些什么来纠正这个问题?

提前谢谢!

1 个答案:

答案 0 :(得分:4)

RSAKeyValue,Modulus和Exponent标签位于那里,因为您使用了方法ToXmlString()

RSA公钥由模数和公共指数组成。分发这两个项目没有安全问题。但是,您不希望在私钥中分发任何其他项目。私钥包含以下字段:

<RSAKeyValue>
   <Modulus>…</Modulus>
   <Exponent>…</Exponent>
   <P>…</P>
   <Q>…</Q>
   <DP>…</DP>
   <DQ>…</DQ>
   <InverseQ>…</InverseQ>
   <D>…</D>
</RSAKeyValue>

不要分发私有和公共密钥中的Modulus和Public Exponent以外的任何内容。

当公钥被分发时,通常通过提供签名的X509证书来完成,该证书包含公钥,将该密钥链接到实体的标识信息以及来自受信任机构的签名。

如果以XML String格式提供公钥,接收方必须使用FromXmlString()方法来使用它。接收方也无法知道您是否真正发送了公钥,除非您亲自将其提供给他们(或使用上述证书方法)。