首先无论采用何种算法,公钥与私钥都基于以下前提。
1,只有公钥可以解密,通过私钥加密的信息。
2,只有私钥可以解密,通过公钥加密的信息。所以公私钥必须成对使用。
3,通过私钥可以反推出公钥。
4,通过公钥很难反推出私钥。
5,公钥对外公开,私钥自己持有。
因此,我们制作出 公钥/私钥 对后,只将公钥公开给对方(乙方)。私钥只有自己(甲方)知道。
这样可以保证通过加密后的信息,只有甲方才能解密。但是有个问题,公钥容易泄露,第三方得到公钥后虽然不能解密信息。但可以冒充乙方向甲方发送伪消息。
为了解决这个问题,需要乙方也制作一套 公钥/私钥,然后将其制作的公钥公开给甲方。
然后按如下过程传递消息
1,乙方送消息:先用甲方提供的公钥加密
再用乙方制作的私钥加密(保证送消息的人是乙方)
2,甲方得到消息:先用乙方提供的公钥解密
再用甲方制作的私钥解密(保证只有甲方能读)
常用的RSA,利用大素数乘积的特性。
使用非对称算法除了可以用来加密,还可用作数字签名,用以判断文件(信息)有没有被别人动过。
方法很简单,将文件序列化,然后用甲方制作的私钥加密后,将加密结果连同文件。一起送给乙方。
乙方拿到文件和加密结果后,先用将加密结果用甲方提供的公钥解密,再将文件序列化。
对照两个结果,如一致,说明文件是甲方制作的。
当然,由于非对称算法的代价是对称算法的约1000倍,所以通常使用散列算法来代替序列化,对散列值进行加密。
常用的散列算法有SHAx,MD5
最后上一段.net 的非对称加密的代码
using System.Security.Cryptography;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string sMsg = "The messgae to encrypt!";
string sEnc, sDec;
System.Text.Encoding utf = new System.Text.UTF8Encoding();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters publicKey = rsa.ExportParameters(false);
RSAParameters publicAndPrivateKey = rsa.ExportParameters(true);
{
RSACryptoServiceProvider rsaEncryptor = new RSACryptoServiceProvider();
rsaEncryptor.ImportParameters(publicKey);
byte[] bMsg = utf.GetBytes(sMsg);
byte[] bEnc = rsaEncryptor.Encrypt(bMsg, false);
sEnc = System.Convert.ToBase64String(bEnc);
}
{
RSACryptoServiceProvider rsaDecryptor = new RSACryptoServiceProvider();
rsaDecryptor.ImportParameters(publicAndPrivateKey);
byte[] bEnc = System.Convert.FromBase64String(sEnc);
byte[] bDec = rsaDecryptor.Decrypt(bEnc,false);
sDec = utf.GetString(bDec);
}
System.Console.WriteLine("Message :" + sMsg);
System.Console.WriteLine("Encrypted :" + sEnc);
System.Console.WriteLine("Decrypted :" + sDec);
System.Console.ReadLine();
}
}
}