非对称算法(公钥/私钥)

来源:互联网 发布:领跑网络兑换平台 编辑:程序博客网 时间:2024/05/29 17:28

首先无论采用何种算法,公钥与私钥都基于以下前提。

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();        }    }}


 

原创粉丝点击