简单网络传递加密数据

网络传递加密数据 

虽然不对称加密解决了用对称加密传递消息必须传递密钥的问题,但是由于不对称加密无法使用流进行处理,因此与对称加密相比效率较低,不适用于加密大量数据的场合。在实际应用中,一般将两种加密方法配合使用。其基本思想是:用不对称加密算法加密对称加密算法的密钥,用对称加密算法加密实际数据。   

    具体设计思路可以简单描述为:A和B相互传递加密的数据前,B首先生成一个不对称加密算法使用的公钥/私钥对,假定公钥为publicKey,私钥为privateKey,然后B将公钥publicKey通过网络传递给A;A接收到此公钥后,根据此公钥初始化不对称加密对象,并用此对象加密使用对称加密算法的密钥key,并将加密后的密钥key通过网络传递给B;这样,A和B都有了一个共同使用的对称加密的密钥,然后双方用此密钥加密数据,并将加密后的数据传递给对方,对方收到加密后的数据后,再用密钥key解密数据。

下面通过一个例子说明具体的实现方法 

客户端

客户端发送 

//使用默认密钥创建对称加密对象
 TripleDESCryptoServiceProvider   tdes = new TripleDESCryptoServiceProvider();
 //使用默认密钥创建不对称加密对象
 RSACryptoServiceProvider  rsa = new RSACryptoServiceProvider();
//导出不对称加密密钥的xml表示形式,false表示不包括私钥
string rsaPublicKey = rsa.ToXmlString(false);
//将导出的公钥发送到服务器,公钥可以对任何人公开
 SendData("rsaPublicKey,true", Encoding.Default.GetBytes(rsaPublicKey));
客户端接收
case "tdesKey":
    //解密
      tdes.Key = rsa.Decrypt(receiveBytes, false);//Rsa解密Key
      break;
case "tdesIV":
      //解密
      tdes.IV = rsa.Decrypt(receiveBytes, false);//Rsa解密IV
      break;
case "Talk":
       //解密
       string talkString = DecryptText(receiveBytes, tdes.Key, tdes.IV);用对称解密获取解密后数据

服务端接收 

case "rsaPublicKey":
         //使用传递过来的公钥重新初始化该客户端对
         //应的RSACryptoServiceProvider对象,
         //然后就可以使用这个对象加密对称加密的私钥了
           user.rsa.FromXmlString(Encoding.Default.GetString(receiveBytes));
         //加密对称加密的私钥
           try
            {
                            //使用RSA算法加密对称加密算法的私钥Key
                    byte[] encryptedKey = user.rsa.Encrypt(user.tdes.Key, false);
                    SendToClient(user, "tdesKey,true", encryptedKey);
                            //加密IV
                     byte[] encryptedIV = user.rsa.Encrypt(user.tdes.IV, false);
                    SendToClient(user, "tdesIV,true", encryptedIV);
               }
              catch (Exception err)
                 {
                       MessageBox.Show(err.Message);
                 }
                        break;
case "Talk":
                        //解密
                        string talkString = DecryptText(receiveBytes, user.tdes.Key, user.tdes.IV);//对称加密数据
                        break;

Hash算法与数字签名 

用HASH算法加密的提供方法有MD5,SHA等,

Hash算法具有如下特点:
    1) 散列效果好。即使原始数据只发生一个小小的改动,数据的散列也会发生非常大的变化。假如两个单词非常相似,比如只有一个字母不同,使用Hash算法得到的结果也相差甚远。甚至根本看不出二者之间有什么相似之处。
    2) 散列函数不可逆。即不可能从散列结果推导出原始数据。(MD5,SHA等不可逆)
    3) 对不同的数据进行Hash运算不可能生成相同的Hash值。
Hash算法的用途主要有两大类:一类是将Hash值作为消息身份验证代码(MAC,Message Authentication Code),用于和数字签名一起实现对消息数据进行身份验证;另一类是将Hash值作为消息检测代码(MDC,Message Detection Code),用于检测数据完整性。
    在应用程序中,可以利用数字签名实现数据身份验证和数据完整性验证。数据身份验证是为了验证数据是不是持有私钥的人发送的;数据完整性验证则用于验证数据在传输过程中是否被修改过。
    验证数据完整性的实现原理是:发送方先使用Hash算法对数据进行Hash运算得到数据的Hash值,然后将数据和Hash值一块儿发送给接收方;接收方接收到数据和Hash值后,对接收的数据进行和发送方相同的Hash运算,然后将计算得到的Hash值和接收的Hash值进行比较,如果二者一致,说明收到的数据肯定与发送方发送的原始数据相同,从而说明数据是完整的。 
byte[] HashVal = new MD5CryptoServiceProvider().ComputeHash(dataToEncrypt);产生hash值,然后对比是否相等来判断.

 

 

 

 

 

 

posted @ 2012-07-03 08:08  广拓小程序  阅读(4245)  评论(0编辑  收藏  举报