这实际上是一个RSAParameters结构。
其中{ D, Modulus } 是RSA的Private Key,{ Exponent, Modulus } 是RSA的Public Key。
{ P, Q } 是用于计算上述Key Pair的两个大素数。其余的部分可能是用于提高运算性能的中间计算结果。但是实际应用中不需要你直接使用这些数据,RSACryptoServiceProvider类提供了ImportParameters方法,只要你把XML数据读入到RSAParameters结构,然后导入RSACryptoServiceProvider,就可以用它加密/解密了。
其中{ D, Modulus } 是RSA的Private Key,{ Exponent, Modulus } 是RSA的Public Key。
{ P, Q } 是用于计算上述Key Pair的两个大素数。其余的部分可能是用于提高运算性能的中间计算结果。但是实际应用中不需要你直接使用这些数据,RSACryptoServiceProvider类提供了ImportParameters方法,只要你把XML数据读入到RSAParameters结构,然后导入RSACryptoServiceProvider,就可以用它加密/解密了。
我想清晰的说一下问题....
我想用私匙加密一个字符串。然后把这个加密后的字符串和程序一块交给用户.
然后程序用公匙对这个字符串进行解密,然后作一些操作.
但是我却作不到:(你该说,为什么不用公匙加密,私匙解密呢?
是的,这样很容易作到。可是我看到用ToxmlString(true)方法生成的私匙竟然包含公匙..
那么我如果把私匙放到程序中进行解密,也就是把公匙也放到程序中去了。那么用户就能通过反编译同时得到公匙和密匙..
这样就没有一点的保密可言了.敬请高手们指点迷津!
然后程序用公匙对这个字符串进行解密,然后作一些操作.
我想问的是,斑竹到底是要把公钥还是私钥交给用户呢?
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));
}
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);
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);
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;
1)确定数据是你发送的(只有你能用私钥加密)
2)数据传输过程中未被篡改。
这就是xixigongzhu说的签名,具体实现还有一些性能上的优化考虑,但思路如此。反过来还是不行——私钥本来应该是谨慎保存的,你用公钥加密之后就必须把私钥公开,别人才能看你传送的内容,这本身就和私钥的定义冲突。使用RSA的“加密”通常是:
1) 假设A需要传送一些数据给B,B(不是A)有一对RSA密钥:私钥Sb和公钥Pb。
2)B以某种方式告诉A她的公钥Pb.
3) A使用B的公钥Pb加密,这样除了B之外就没人能察看消息内容了。一般来说,RSA适合于通信类型的机密/签名,但是像你说的这种数据保存类型的不一定适合。