C#RSA非对称加密如何实现用私钥才能加密,公钥解密?

时间:2021-08-13 18:27:32
C#RSA非对称加密如何实现用私钥才能加密,公钥解密?``麻烦给方法代码```谢谢```

10 个解决方案

#1


//##############################################################################   
  //RSA     方式加密     
  //说明KEY必须是XML的行式,返回的是字符串   
                                      //在有一点需要说明!!该加密方式有   长度   限制的!! //##############################################################################   
  //RSA的加密函数   
  public   string   RSAEncrypt(string   xmlPublicKey,string   EncryptString   )   
  {   
  byte[]   PlainTextBArray;   
  byte[]   CypherTextBArray;   
  string   Result;   
  System.Security.Cryptography.RSACryptoServiceProvider   rsa=new   RSACryptoServiceProvider();   
  rsa.FromXmlString(xmlPublicKey);   
  PlainTextBArray   =   (new   UnicodeEncoding()).GetBytes(EncryptString);   
  CypherTextBArray   =   rsa.Encrypt(PlainTextBArray,   false);   
  Result=Convert.ToBase64String(CypherTextBArray);   
  return     Result;   
  }   
  //RSA的解密函数   
  public   string     RSADecrypt(string   xmlPrivateKey,   string   DecryptString   )   
  {   
  byte[]   PlainTextBArray;   
  byte[]   DypherTextBArray;   
  string   Result;   
  System.Security.Cryptography.RSACryptoServiceProvider   rsa=new   RSACryptoServiceProvider();   
  rsa.FromXmlString(xmlPrivateKey);   
  PlainTextBArray   =Convert.FromBase64String(DecryptString);   
  DypherTextBArray=rsa.Decrypt(PlainTextBArray,   false);   
  Result=(new   UnicodeEncoding()).GetString(DypherTextBArray);   
  return   Result;   
  }   
  //RSA   的密钥产升   
  //产生私钥   和公钥   
  public   void   RSAKey(out   string   xmlKeys,out   string     xmlPublicKey)   
  {   
  System.Security.Cryptography.RSACryptoServiceProvider   rsa=new   RSACryptoServiceProvider();   
  xmlKeys=rsa.ToXmlString(true);   
  xmlPublicKey   =   rsa.ToXmlString(false);   
  }

#2


等于说加密和解密那公钥和私钥可以交换吗?``用公加的就用私解``用私加的就用公解这样吗

#3


自己试一下不就知道了吗

#4


RSA算法非常简单,概述如下:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d*e%t==1

这样最终得到三个数: n  d  e

设消息为数M (M <n)
设c=(M**d)%n就得到了加密后的消息c 
设m=(c**e)%n则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解
从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法
求得d。

RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,
最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用
RSA对刚才的加密密钥进行加密。

最后需要说明的是,当前小于1024位的N已经被证明是不安全的
自己使用中不要使用小于1024位的RSA,最好使用2048位的。

#5


不行了,我用私加密,用公解密的时候出错``提示不正确的项```

#6


用公加密,用私解密的时候又是对的``请问还需要改哪里吗

#7


DypherTextBArray = rsa.Decrypt(PlainTextBArray, false); 这里提示不正确的项

#8


该回复于2009-08-04 11:21:44被版主删除

#9


私匙公匙不能互换,你再生成一个密匙对,自己留下公匙,把私匙发布出去就行了,这样你加密的东西有私匙的人都可以解。
但是注意似乎不能单独发布私匙,只能一起发布密匙对或公匙,因此这个方法不能用做数字签名,一般的加密是没有问题的。

#10


默认的不支持, 真是很郁闷。不过没有办法, 请找第三方的。

默认的只能是 公钥加密 私钥解密

#1


//##############################################################################   
  //RSA     方式加密     
  //说明KEY必须是XML的行式,返回的是字符串   
                                      //在有一点需要说明!!该加密方式有   长度   限制的!! //##############################################################################   
  //RSA的加密函数   
  public   string   RSAEncrypt(string   xmlPublicKey,string   EncryptString   )   
  {   
  byte[]   PlainTextBArray;   
  byte[]   CypherTextBArray;   
  string   Result;   
  System.Security.Cryptography.RSACryptoServiceProvider   rsa=new   RSACryptoServiceProvider();   
  rsa.FromXmlString(xmlPublicKey);   
  PlainTextBArray   =   (new   UnicodeEncoding()).GetBytes(EncryptString);   
  CypherTextBArray   =   rsa.Encrypt(PlainTextBArray,   false);   
  Result=Convert.ToBase64String(CypherTextBArray);   
  return     Result;   
  }   
  //RSA的解密函数   
  public   string     RSADecrypt(string   xmlPrivateKey,   string   DecryptString   )   
  {   
  byte[]   PlainTextBArray;   
  byte[]   DypherTextBArray;   
  string   Result;   
  System.Security.Cryptography.RSACryptoServiceProvider   rsa=new   RSACryptoServiceProvider();   
  rsa.FromXmlString(xmlPrivateKey);   
  PlainTextBArray   =Convert.FromBase64String(DecryptString);   
  DypherTextBArray=rsa.Decrypt(PlainTextBArray,   false);   
  Result=(new   UnicodeEncoding()).GetString(DypherTextBArray);   
  return   Result;   
  }   
  //RSA   的密钥产升   
  //产生私钥   和公钥   
  public   void   RSAKey(out   string   xmlKeys,out   string     xmlPublicKey)   
  {   
  System.Security.Cryptography.RSACryptoServiceProvider   rsa=new   RSACryptoServiceProvider();   
  xmlKeys=rsa.ToXmlString(true);   
  xmlPublicKey   =   rsa.ToXmlString(false);   
  }

#2


等于说加密和解密那公钥和私钥可以交换吗?``用公加的就用私解``用私加的就用公解这样吗

#3


自己试一下不就知道了吗

#4


RSA算法非常简单,概述如下:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d*e%t==1

这样最终得到三个数: n  d  e

设消息为数M (M <n)
设c=(M**d)%n就得到了加密后的消息c 
设m=(c**e)%n则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解
从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法
求得d。

RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,
最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用
RSA对刚才的加密密钥进行加密。

最后需要说明的是,当前小于1024位的N已经被证明是不安全的
自己使用中不要使用小于1024位的RSA,最好使用2048位的。

#5


不行了,我用私加密,用公解密的时候出错``提示不正确的项```

#6


用公加密,用私解密的时候又是对的``请问还需要改哪里吗

#7


DypherTextBArray = rsa.Decrypt(PlainTextBArray, false); 这里提示不正确的项

#8


该回复于2009-08-04 11:21:44被版主删除

#9


私匙公匙不能互换,你再生成一个密匙对,自己留下公匙,把私匙发布出去就行了,这样你加密的东西有私匙的人都可以解。
但是注意似乎不能单独发布私匙,只能一起发布密匙对或公匙,因此这个方法不能用做数字签名,一般的加密是没有问题的。

#10


默认的不支持, 真是很郁闷。不过没有办法, 请找第三方的。

默认的只能是 公钥加密 私钥解密