2010-06-09 34 views
5

我使用makecert以下参数创建一个X509证书X509证书:创建的OpenSSL/makecert工具

makecert -r -pe -n “CN =客户” -ss MyApp的

我想用这个证书来用RSA算法来加密和解密数据。 我期待在Windows证书库中生成的证书,一切似乎都没问题(它有一个私钥,公钥是一个1024位的RSA密钥,等等......)

现在我用这个C#代码来加密数据:

X509Store store = new X509Store("MyApp", StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadOnly); 
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Client", false); 
X509Certificate2 _x509 = certs[0]; 

using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_x509.PublicKey.Key) 
{ 
    byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello"); 
    _encryptedData = rsa.Encrypt(dataToEncrypt, true); 
} 

当执行Encrypt方法时,我收到带有消息“Bad key”的CryptographicException。

我认为代码没问题。可能我没有正确创建证书。 有何评论? 谢谢

----------------编辑--------------
如果有人知道如何使用OpenSsl创建证书,它也是对我有效的答案。

+0

创建证书时您指定的私钥/公钥对的位是什么? 可能你必须指定更长的键4048位? – berkay 2010-06-09 17:56:38

+0

我不确定你在说什么选项。我只是使用了我在makecert命令中显示的选项。如果你正在谈论另一个人,则假定默认值。但我的公钥有1024位。 – 2010-06-09 18:00:57

+0

好,然后我从来没有使用makecert只是搜索来创建它4048 bits.1024位是打破了这个原因,你可以得到错误。 – berkay 2010-06-09 18:03:13

回答

3

要允许密钥用于加密,您应该使用-sky-option。默认的'makecert`使用AT_SIGNATURE密钥规范,这不适用于加密/解密。相反,有它通过发出以下命令使用AT_KEYEXCHANGE规格:

makecert -r -pe -n "CN=Client" -ss MyApp -sky Exchange 

(记住要删除以前的键或使用其他容器名称)。

+0

我读的RSA算法可以用来签名和加密邮件。只有一个证书密码和密钥是不可能的? – 2010-06-10 12:09:31

+1

的AT_KEYEXCHANGE可用于签名和加密,只要不是周围的其他方式。 – 2010-06-10 17:29:57