首先说下需求:用OpenSSL 生成了公钥和私钥文件,格式为PEM的,现在用C#想要从文件中读取公钥和私钥
我已经研究了大半天了,网上搜了很久,包括很多英文网站,还是没有头绪因为不是单独的网站需要用到密钥,要和淘宝等非.NET的系统交互,所以得遵循一定的规则,不能使用.NET提供的类生成公钥私钥。现在想要做到的就是从PEM文件中读取了公钥和私钥后生成DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();的对象,原先可以用这个方法生成,但是现在读到的公钥和私钥不是XML格式的
dsac.FromXmlString(PrivateStr);网络上有篇文章写了关于“.NET使用OpenSSL生成的pem密钥文件”的,但是我需要的是DSA算法的,那个文章给出的是RSA的,DSA与RSA在参数上有很大的区别
RSA的参数是两个,而DSA的参数有P,Q,G,Y,J等等。。
我已经研究了大半天了,网上搜了很久,包括很多英文网站,还是没有头绪因为不是单独的网站需要用到密钥,要和淘宝等非.NET的系统交互,所以得遵循一定的规则,不能使用.NET提供的类生成公钥私钥。现在想要做到的就是从PEM文件中读取了公钥和私钥后生成DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();的对象,原先可以用这个方法生成,但是现在读到的公钥和私钥不是XML格式的
dsac.FromXmlString(PrivateStr);网络上有篇文章写了关于“.NET使用OpenSSL生成的pem密钥文件”的,但是我需要的是DSA算法的,那个文章给出的是RSA的,DSA与RSA在参数上有很大的区别
RSA的参数是两个,而DSA的参数有P,Q,G,Y,J等等。。
最近几天一直在查资料
现在能做到使用OpenSSL的DLL实现对原字符串散列后进行签名和验证,如果不进行散列运算的话字符串长度超过20位就报错,使用的类是DSA,通过查找资料:使用MessageDigestContext来签名原字符串,但是我在使用这个类的时候遇到的问题,老是提示public key的格式不正确,代码如下 MessageDigest msg = MessageDigest.Null;
MessageDigestContext msgcontext = new MessageDigestContext(msg);
BIO bio=BIO.File(@"D:\dsa_private_key.pem","r");
CryptoKey key = CryptoKey.FromPrivateKey(bio, null);
byte[] signedData = msgcontext.Sign(waitSingData, key);//我导入的是私钥啊,但是老是提示
公钥类型错误
我用的是RSA,对于DSA我也不是很了解,
不过你想从证书中获得私钥有点费劲,公钥好获得,私钥可没那么容易了。
我证书的生成都是用openssl命令行生成的,也就是手动生成,
在C#中使用证书公私钥时再倒入证书路径,让C#德类自己去获得公私钥。
然后再做我的处理。
也不是很懂,关注中...等高人...
a) 生成DSA参数
openssl dsaparam -out dsa_param.pem 1024
b) 生成私钥
openssl gendsa -out dsa_private_temp_key.pem dsa_param.pem
将传统格式的私钥转换成PKCS#8格式的(java使用的是PKCS#8格式的私钥)
openssl pkcs8 -topk8 -inform PEM -in dsa_private_temp_key.pem -outform PEM -nocrypt -out dsa_private_key.pem
c) 生成公钥
openssl dsa -in dsa_private_key.pem -pubout -out dsa_public_key.pem
关键是加粗的那个,C#中读取比较麻烦,始终无法导入到C#中的System.Security.Cryptography.DSACryptoServiceProvider类生成的对象中
DSACryptoServiceProvider dsa = (DSACryptoServiceProvider)x509.PrivateKey;
http://download.csdn.net/source/2316484
02./// <summary>
03./// RSA获取公钥私钥
04./// </summary>
05./// <param name="str_PrivateKey"></param>
06./// <param name="str_PublicKey"></param>
07.public void RSACreateKey(ref string str_PublicKey, ref string str_PrivateKey)
08.{
09. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(512);
10. //str_PublicKey = Convert.ToBase64String(RSA.ExportCspBlob(false));
11. //str_PrivateKey = Convert.ToBase64String(RSA.ExportCspBlob(true));
12.
13. str_PublicKey = RSA.ToXmlString(false);
14. str_PrivateKey = RSA.ToXmlString(true);
15.}
16.
17./// <summary>
18./// RSA加密
19./// </summary>
20./// <param name="source"></param>
21./// <param name="str_PrivateKey"></param>
22./// <param name="str_PublicKey"></param>
23./// <returns></returns>
24.public string RSAEncrypt(string source, string str_PublicKey)
25.{
26. try
27. {
28. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
29.
30. RSA.FromXmlString(str_PublicKey);
31.
32. //str_PublicKey = Convert.ToBase64String(RSA.ExportCspBlob(false));
33. //str_PrivateKey = Convert.ToBase64String(RSA.ExportCspBlob(true));
34. byte[] DataToEncrypt = Encoding.UTF8.GetBytes(source);
35.
36. byte[] bs = RSA.Encrypt(DataToEncrypt, false);
37. //str_PublicKey = Convert.ToBase64String(RSA.ExportCspBlob(false));
38. //str_PrivateKey = Convert.ToBase64String(RSA.ExportCspBlob(true));
39. string encrypttxt = Convert.ToBase64String(bs);
40.
41. return encrypttxt;
42. }
43. catch (CryptographicException e)
44. {
45. Console.WriteLine(e.Message);
46. return null;
47. }
48.}
49.
50./// <summary>
51./// RSA解密
52./// </summary>
53./// <param name="strRSA"></param>
54./// <param name="str_PrivateKey"></param>
55./// <returns></returns>
56.public string RSADecrypt(string strRSA, string str_PrivateKey)
57.{
58. try
59. {
60. byte[] DataToDecrypt = Convert.FromBase64String(strRSA);
61. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
62.
63. RSA.FromXmlString(str_PrivateKey);
64. //byte[] bsPrivatekey = Convert.FromBase64String(str_PrivateKey);
65. //RSA.ImportCspBlob(bsPrivatekey);
66.
67. byte[] bsdecrypt = RSA.Decrypt(DataToDecrypt, false);
68.
69. string strRE = Encoding.UTF8.GetString(bsdecrypt);
70. return strRE;
71. }
72. catch (CryptographicException e)
73. {
74. Console.WriteLine(e.ToString());
75. return null;
76. }
77.}
78.#endregion