网络传递加密数据
虽然不对称加密解决了用对称加密传递消息必须传递密钥的问题,但是由于不对称加密无法使用流进行处理,因此与对称加密相比效率较低,不适用于加密大量数据的场合。在实际应用中,一般将两种加密方法配合使用。其基本思想是:用不对称加密算法加密对称加密算法的密钥,用对称加密算法加密实际数据。
具体设计思路可以简单描述为: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值,然后对比是否相等来判断.