这实际上是一个RSAParameters结构。
其中{ D, Modulus } 是RSA的Private Key,{ Exponent, Modulus } 是RSA的Public Key。
{ P, Q } 是用于计算上述Key Pair的两个大素数。其余的部分可能是用于提高运算性能的中间计算结果。但是实际应用中不需要你直接使用这些数据,RSACryptoServiceProvider类提供了ImportParameters方法,只要你把XML数据读入到RSAParameters结构,然后导入RSACryptoServiceProvider,就可以用它加密/解密了。

解决方案 »

  1.   

    终于有高手回复了...
    我想清晰的说一下问题....
    我想用私匙加密一个字符串。然后把这个加密后的字符串和程序一块交给用户.
    然后程序用公匙对这个字符串进行解密,然后作一些操作.
    但是我却作不到:(你该说,为什么不用公匙加密,私匙解密呢?
    是的,这样很容易作到。可是我看到用ToxmlString(true)方法生成的私匙竟然包含公匙..
    那么我如果把私匙放到程序中进行解密,也就是把公匙也放到程序中去了。那么用户就能通过反编译同时得到公匙和密匙..
    这样就没有一点的保密可言了.敬请高手们指点迷津!
      

  2.   

    实际上,斑竹可以换一种说法,那就是私钥解密公钥加密。这和公匙加密,私匙解密是不一样的,因为前者解密在前,而后者加密在前。而RSA签名正是这样的(私钥解密公钥加密)。-->我想用私匙加密一个字符串。然后把这个加密后的字符串和程序一块交给用户.
    然后程序用公匙对这个字符串进行解密,然后作一些操作.
    我想问的是,斑竹到底是要把公钥还是私钥交给用户呢?
      

  3.   

    回夕夕公主,我原意是想把公钥交给用户但是我却不会私钥加密公钥解密...你说的签名,我还没研究。我查下MSDN:)
      

  4.   

    签名:将公钥追加到密码的后面,传给用户。
    static String SignData(String data){
    RSACryptoServiceProvider rsac = new RSACryptoServiceProvider();
    MD5 sha = MD5.Create();
    byte[] src = Encoding.Unicode.GetBytes(data);
    byte[] result = rsac.SignData(src,sha);
    String xml = rsac.ToXmlString(false);
    String sign = Encoding.Unicode.GetString(result);
    char ch = (char) sign.Length;
    return ch + sign + xml;
    }认证:将接收的数据处理,得到公钥进行认证。
    static bool VerifyData(String data, String sign) {
    int len = sign[0];
    String sign2 = sign.Substring(1, len);
    String xml = sign.Substring(len + 1);
    byte[] signbytes = Encoding.Unicode.GetBytes(sign2);
    byte[] databytes = Encoding.Unicode.GetBytes(data);
    MD5 sha = MD5.Create();
    RSACryptoServiceProvider rsac = new RSACryptoServiceProvider();
    rsac.FromXmlString(xml);
    return rsac.VerifyData(databytes,sha,signbytes);
    }
    测试:
    public static void Main(String[] args)
    {
    String str = SignData("aaa");
    Console.WriteLine(str);
    Console.WriteLine(VerifyData("aaa", str));
    }
      

  5.   

    这里也可以这样:
    byte[] lens = BitConverter.GetBytes(sign.Length);
    String lenstr = Encoding.Unicode.GetString(lens);
    return lenstr + sign + xml;byte[] lens = new byte[4];
    Encoding.Unicode.GetBytes(sign, 0, 2, lens, 0);
    int len = BitConvert.ToInt32(lens, 0);
    String sign2 = sign.Substring(2, len);
    String xml = sign.Substring(len + 2);
      

  6.   

    这里也可以这样:
    byte[] lens = BitConverter.GetBytes(sign.Length);
    String lenstr = Encoding.Unicode.GetString(lens);
    return lenstr + sign + xml;byte[] lens = new byte[4];
    Encoding.Unicode.GetBytes(sign, 0, 2, lens, 0);
    int len = BitConvert.ToInt32(lens, 0);
    String sign2 = sign.Substring(2, len);
    String xml = sign.Substring(len + 2);
      

  7.   

    String str = "this is a test.";
    byte[] bytes = Encoding.ASCII.GetBytes(str);
    //选择签名方式,有RSA和DSA
    DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();
    byte[] sign = dsac.SignData(bytes);
    //sign便是出来的签名结果。 //下面是认证了
    DSACryptoServiceProvider dsac2 = new DSACryptoServiceProvider();
    dsac2.FromXmlString(dsac.ToXmlString(false));
    bool ver = dsac2.VerifyData(bytes, sign);
    if (ver) 
    {
    Console.WriteLine("通过");

    else 
    {
    Console.WriteLine("不能通过");
    }
    return null;
      

  8.   

    什么叫公钥?就是地球人都知道...  :)首先要确定你加密的目的是什么。用私钥加密不能保证信息的安全——因为公钥是公开的(你打算把它和加密字符串一起发送),那么拿到公钥就可以看你发送的内容了。这样做的目的通常不是保密,而是:
    1)确定数据是你发送的(只有你能用私钥加密)
    2)数据传输过程中未被篡改。
    这就是xixigongzhu说的签名,具体实现还有一些性能上的优化考虑,但思路如此。反过来还是不行——私钥本来应该是谨慎保存的,你用公钥加密之后就必须把私钥公开,别人才能看你传送的内容,这本身就和私钥的定义冲突。使用RSA的“加密”通常是:
    1) 假设A需要传送一些数据给B,B(不是A)有一对RSA密钥:私钥Sb和公钥Pb。
    2)B以某种方式告诉A她的公钥Pb.
    3) A使用B的公钥Pb加密,这样除了B之外就没人能察看消息内容了。一般来说,RSA适合于通信类型的机密/签名,但是像你说的这种数据保存类型的不一定适合。