首先说下需求:用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等等。。

解决方案 »

  1.   

    等了这么久还是没人来啊
    最近几天一直在查资料
    现在能做到使用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);//我导入的是私钥啊,但是老是提示
    公钥类型错误
      

  2.   

    这方面我也做过,不过也碰到好多问题,最后也是晕乎乎的弄了点。
    我用的是RSA,对于DSA我也不是很了解,
    不过你想从证书中获得私钥有点费劲,公钥好获得,私钥可没那么容易了。
    我证书的生成都是用openssl命令行生成的,也就是手动生成,
    在C#中使用证书公私钥时再倒入证书路径,让C#德类自己去获得公私钥。
    然后再做我的处理。
    也不是很懂,关注中...等高人...
      

  3.   

    我的公钥和私钥也是openssl 命令生成的,命令如下:DSA公私钥可以使用OpenSSL 生成,如下: 
    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类生成的对象中
      

  4.   

    你这样试试X509Certificate2 x509 = new X509Certificate2(证书路径, 证书密码);
    DSACryptoServiceProvider dsa = (DSACryptoServiceProvider)x509.PrivateKey;
      

  5.   

    我已经解决了这个问题了,用的是codeproject上的一个工程,稍微修改了一下
      

  6.   

    去下载吧,不过要点分,我调查出来不容易啊
    http://download.csdn.net/source/2316484
      

  7.   

    01.#region   
    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