如题,在网上找到一段代码有两个方法,加密是用公钥,解密用私钥,网上流传的不是“私钥加密,公钥解密”吗!很是困惑!
public static string RSAEncryptString(string publicKey, string encryptString, bool isXml, bool is16)
{
try
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
byte[] plainTextArray, cypherTextArray;
if (isXml)
rsa.FromXmlString(publicKey);
else
rsa.ImportCspBlob(Encoding.Default.GetBytes(publicKey));
plainTextArray = (new UnicodeEncoding()).GetBytes(encryptString);//Encoding.Default.GetBytes(encryptString);
cypherTextArray = rsa.Encrypt(plainTextArray, false);
.....
public static string RSAEncryptString(string publicKey, string encryptString, bool isXml, bool is16)
{
try
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
byte[] plainTextArray, cypherTextArray;
if (isXml)
rsa.FromXmlString(publicKey);
else
rsa.ImportCspBlob(Encoding.Default.GetBytes(publicKey));
plainTextArray = (new UnicodeEncoding()).GetBytes(encryptString);//Encoding.Default.GetBytes(encryptString);
cypherTextArray = rsa.Encrypt(plainTextArray, false);
.....
达到你所想要的要求呀
A B 生成一个密钥对
A把公钥发给B
B把公钥发给A
A要给B发数据就用 B的公钥加密数据
B要给A发数据就用 A的公钥加密数据
这样不就实现了你想要的吗
byte[] messagebytes = Encoding.UTF8.GetBytes("luo罗");
RSACryptoServiceProvider oRSA = new RSACryptoServiceProvider();
string privatekey = oRSA.ToXmlString(true);
string publickey = oRSA.ToXmlString(false);
//私钥签名
RSACryptoServiceProvider oRSA3 = new RSACryptoServiceProvider();
oRSA3.FromXmlString(privatekey);
byte[] AOutput = oRSA3.SignData(messagebytes, "SHA1");
//公钥验证
RSACryptoServiceProvider oRSA4 = new RSACryptoServiceProvider();
oRSA4.FromXmlString(publickey);
bool bVerify = oRSA4.VerifyData(messagebytes, "SHA1", AOutput);
公司做了一个软件,客户要买这个软件放到客户的服务器上运行,但购买后公司要给用户一个授权文件(该文件是用用户服务器cpu 编号和私钥生成的文件)是的,文件是公开的,公钥也是公开的,但是解密出来后,公司的软件就会去把解密的信息和服务器的cpu 编号对比,从而达到验证的功能,当然这种可以用数字签名实现。
但如果授权文件中还有一个授权时间呢?也就是比较当前时间,那就得用私钥加密并用公钥去解密出来了,得到时间后在去比较。