首先无论采用何种算法,公钥与私钥都基于以下前提。
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(); } } }