zoukankan      html  css  js  c++  java
  • 简单网络传递加密数据

    网络传递加密数据 

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

        具体设计思路可以简单描述为: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值,然后对比是否相等来判断.
  • 相关阅读:
    PHP学习(6)——代码重用与函数编写的一些注意事项
    PHP学习(5)——字符串操作与POSIX正则
    PHP学习(4)——数组的使用
    Three.js基础探寻十——动画
    PHP学习(3)——数据的存储与检索
    Three.js基础探寻九——网格
    PHP学习(2)——操作符与迭代整理
    个人寒假作业项目《印象笔记》第一天
    《需求工程》阅读笔记2
    《需求工程》阅读笔记
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2574099.html
Copyright © 2011-2022 走看看