2013-07-17 203 views
2

我正在编写一个使用PKI保护电子邮件,文件等的应用程序。 使用System.Cryptography命名空间,我使用RSACryptoServiceProvider生成一个新的密钥对。公钥/私钥中的RSA密钥值和模数

的方法是:

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>密钥内的值。

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

加密是一个新的和令人兴奋的领域,所以我会真正感谢这里的任何指导。我担心我搞砸了 - 对密钥作品进行加密并使用私钥解密 - 我只是想知道PGP/GPG密钥在外观上的差异如此之大,以及我需要如何解决此问题?

预先感谢您!

回答

1

由于使用了方法ToXmlString(),RSAKeyValue,Modulus和Exponent标签在那里。

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

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

不要散布比模量和公共指数,这是在私营和公共钥匙上发现的任何其他。

当分配公钥时,通常通过发出一个带签名的X509证书来完成,该证书包含公钥,将该密钥链接到实体的标识信息以及来自可信机构的签名。

如果您以XML字符串格式发出公钥,接收方必须使用FromXmlString()方法来使用它。接收方也无法知道,除非您亲自给他们(或使用上述证书方法),否则您是否真的发过公钥。