博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

什么是密钥,密钥怎么用?

Posted on 2009-09-14 08:30  一刻  阅读(8860)  评论(0编辑  收藏  举报

1. 公钥加密技术:公钥密码体制有两个不同的密钥,它可将加密功能和解密功能分开,一个密钥成为私有密钥,它被秘密保存,另一个是公有密钥,不需要保密,对于公钥来说,正如其名,是公开的,公钥可能公开与英特网上。主要公钥算法:RSA算法。

2. 消息认证技术:用于为数字签名技术提供技术保证,信息认证又称为完整性校验。安全单向散列函数(哈希函数),安全单向散列函数的作用是对任意长度的输入消息输出一个固定长度的散列值,这个散列值就是消息摘要,就像文件的指纹,散列值是唯一的,因而提供了消息完整性认证,主要信息摘要算法:MD5和SHA。

3. 数字签名技术:使用消息认证技术用于确认发送者身份和信息完整性。

    下面介绍以上三种技术的实际应用和关系

1. 假如A要给B发送一幅图片,为了防止第三者拦截,所以需要加密,B生成一对密钥对(包含公钥和私钥),B的公钥是公开的,任何人可以以公钥为密钥发送机密消息给B,A可以用B的公钥加密图片,然后通过网络传递,当B受到加密后的图片后利用自己的私钥进行解密,得到原始图片,其他接受方由于没有私钥,所以无法解密。如图一,(其中public key是指公钥,private key是指私钥,encryption是指加密,decryption是指解密。)

2.假如A要给B发送一幅图片,为了防止第三者修改,破坏图片的完整性,所以需要进行验证数据的完整性,A用MD5或SHA算法对图片进行哈希运算,生成消息摘要,然后将消息摘要和图片一起发送给B,B收到后,用同样的哈系算法对图片重新生成消息摘要,如果第二次的消息摘要与原始的一样,就可以认为原始图像没有被修改过,有点像CRC。如图二

3.假如A要给B发送一幅图片,B收到后可以认定是A所发送的,而且A也不能否认他所发的图片,且要保证图片在传递中没有被修改过。A生成一对密钥对,A将公钥发送给B,A用MD5或SHA算法对图片进行哈希运算,生成消息摘要,A用自己的私钥加密消息摘要,就得到了数字签名,然后B使用A发送过来的公钥对数字签名进行解密,得到原始图片的消息摘要,然后使用相同的哈希算法对图片重新生消息摘要,然后比较这两个消息摘要,就可以验证图片的完整性。

其中对于第一种情况,只是对数据进行加密,并不能保证数据在传输过程中没有被第三方修改,而且接受方也不能保证发送方的身份,因为公钥是公开的,任何人都能对B发送文件。

对于第二种情况,对数据的完整性进行了检查,可以保证数据在传输中不被修改,但是如果第三方同时修改了数据和消息摘要,使数据和消息摘要相匹配,这样就不能保证安全了,而且接受方不能验证发送方的身份。

对于第三种情况,接受方可以保证发送方的身份,而且发送方也不能否认自己的发送行为,并能保证数据的完整性,但是数据并没有加密,第三者可以看到数据的内容,这种技术主要用于合同,用户不需要防止第三者的偷看,只要保证合同的完整性和发送者的身份,往往消息的来源比隐藏消息的内容更加重要。

数字签名和消息认证的区别是,消息认证使对方能验证消息发送者及其所发的消息是否被篡改过。当收发双方有利害冲突时,单纯用消息认证无法解决他们之间的纠纷,只有借助于数字签名。

数字签名和公钥加密的区被是,数字签名--发送者使用自己的私钥加密消息,接收方使用发送者的公钥解密消息,公钥加密--发送者使用接收方的公钥加密消息,接收方使用自己的私钥解密消息。

上面介绍的第三种情况,数据并没有加密,所以也会有安全问题,有些人希望数据也要加密传输,所以介绍一下双环加密方式,发送方和接收方各自生成密钥对,双方彼此都知道对方的公钥,首先发送方导入密钥对使用哈希算法对数据运算产生消息摘要,然后对数据和消息摘要进行打包,再利用接收方的公钥对打包好的文件进行加密,然后发送给接收方,接收方收到后,先用自己的密钥对解密打包的文件,然后再用发送方的公钥验证消息摘要,然后比较,这样就可以判断数据的完整性,还可以验证发送方的身份,由于采用了双方的公钥,所以有双层加密的效果。

以上三种技术分别对应,对称加密,非对称加密,hash加密

顺便贴个例子

1.打开文件,加密,加密数据到文件,密钥到文件:

//初始化RSA加密,如果觉得速度慢了,可以自己定义密钥的大小,

//new RSACryptoServiceProvider(512);

RSACryptoServiceProvider rsac = new RSACryptoServiceProvider();

//字节缓冲区定为64(密钥为1024),最大长度为(rsac.KeySize/8 - 11)

byte[] src = new byte[64];

//Encrypt.cs是要加密的文件 FileStream fs = new FileStream("Encrypt.cs", FileMode.Open, FileAccess.Read);

//Result.txt存储的是加密之后的数据 FileStream res = new FileStream("Result.txt", FileMode.Create, FileAccess.Write); int len;

//加密

while ((len = fs.Read(src, 0, 64)) > 0) { byte[] temp = new byte[len]; Array.Copy(src, 0, temp, 0, len); temp = rsac.Encrypt(temp, false); res.Write(temp, 0, temp.Length); }

fs.Close(); res.Close();

//存储密钥到文件,以便解密用。

StreamWriter sw = new StreamWriter("RSA.key"); sw.Write(rsac.ToXmlString(true)); sw.Close();

2.打开文件,读密钥,读加密数据,解密,原始纯文本(解密数据)到文件:

RSACryptoServiceProvider rsac = new RSACryptoServiceProvider();

//读密钥

StreamReader sr = new StreamReader("RSA.key");

String str = sr.ReadToEnd();

sr.Close(); rsac.FromXmlString(str);

byte[] src = new byte[128];

FileStream fs = new FileStream("Result.txt", FileMode.Open, FileAccess.Read);

FileStream res = new FileStream("Encrypt.txt", FileMode.Create, FileAccess.Write);

int len;

//解密

while ((len = fs.Read(src, 0, 128)) > 0)

{

byte[] temp = new byte[len];

Array.Copy(src, 0, temp, 0, len); temp = rsac.Decrypt(temp, false);

res.Write(temp, 0, temp.Length);

                                                                                                                  }

fs.Close();

res.Close();

还真难找啊,三骗文章的精华啊~~~