根据网上资料总结而成!~
密码学总结
作业要求
- 根据本学期学习过的密码学知识,利用openssl,自己设计一套加密通讯的方案,实现客户端和服务端之间的安全的可靠的加密通讯,形式不限,提供实现代码和实验结果,最终形成实验报告
设计思路
首先,任何一套安全的通讯系统在数据传输过程中至少具备以下三个特性:
- 验证来源的合法性
- 保证数据的完整性
- 保证数据的私密性
根据所有加密传输的方法,总共有这几种加密方式
对数据的私密性要求,我们可以通过对数据进行加解密来完成。
如下图所示:
根据加解密Key的不同将加密体系分为两种:
1,对称加密
特点:使用同一个密钥进行加解密
优点: 加密速度快
缺点:秘钥传递问题
常见的对称加密算法有:DES,3DES,AES等
2,非对称加密
特点:数据传输双方事先都必须产生一对密钥
一个称为公钥
一个称为私钥
公钥加密的数据,只有对应的私钥才能解密
私钥加密的数据,只有对应的公钥才能解密
优点:解决了秘钥传递问题
缺点:加密速度慢
常见的非对称加密算法有:RSA,DH等
对称加密:
发送方利用自己的密钥对明文数据进行加密;
接收方必须得到发送方的密钥;
接收方利用发送方的密钥对密文进行解密;
如果密钥在传输过程中被第三方获悉,那此次加密的私密性得不得保障。
非对称加密:
首先通讯双方都产生一对密钥;
数据发送方得到数据接收方的公钥;
数据发送方利用数据接收方的公钥对数据进行加密;
数据接收方利用自己的私钥对加密数据进行解密;
数据接收方最终得到明文的数据。
任何一方得到接收方的公钥,也解密不了传输中的数据。
总结:虽然非对称加密体系实现了密钥交换的问题,但其本身算法实现复杂导致其加密速度慢。
于是在使用中,人们一般将对称加密和非对称加密二者结合起来使用。
对称与非对称结合:
混合使用之加密图解:
首先发送方利用一个随机数产生了一个对称密钥;
发送方利用这个密钥对数据进行加密;
发送方拿着接收方的公钥对这个密钥进行加密;
发送方将加密好的数据和加密好的密钥发送给接收方;
这种方法既保证了加密速度,又保证了加密密钥的安全传送。
混合使用之解密图解:
接收方接收到加密的数据和加密的密钥;
接收方利用自己的私钥解密加密的密钥;
接收方再利用已解密的密钥来解密加密的数据文件;
接收方最终得到了明文的数据。
总结:虽然混合使用对称加密和非对称加密之后,既保证了加密速度,又保证了加密密钥的安全传送。
但是始终没办法保证来源的合法性。这时候就需要用到数字签名。
数字签名:
发送方使用自己的私钥加密数据文件(数字签名);
接收方接收到这个数字签名文件;
接收方使用发送方的公钥来解密这个数字签名文件;
如果能够解开,则表明这个文件是发送方发送过来的;
否则为伪造的第三方发送过来的。
对于发送方来讲这种签名有不可否认性。
总结:非对称加密中,公钥加密,私钥解密。主要用来进行数据加密。私钥加密,公钥解密。主要用来进行数字签名和认证。
解决了数据传输过程中数据私密性和来源合法性的问题。但对于数据的完整性就需要利用散列函数来实现。
散列函数:
散列函数的特点:
- 输入可以是任意长度 但输出是定长的。MD5 128bits SHA1 160bits
- 加密过程不可逆,无法根据特征码还原原来的数据
- 雪崩效应 输入的一点点改变 会导致结果发生很大改变
- 输入一致,输出必然相同
- 注:不同的输入,可能会有同样的输出。但是概率很小 并不代表没有这种可能
常见的散列函数(Hash函数):
1,MD5
2,SHA1
总结:散列函数可以根据任意长度的输入,生成定长的摘要信息。这样可以用来校验文件的完整性。防止数据在传输过程中被第三方篡改。
安全数字签名:
发送方利用散列函数对明文数据进行Hash得到摘要信息;
发送方使用自己的私钥对摘要信息进行签名;
接收方利用发送方的公钥来验证来源的合法性;
接收方利用摘要信息来验证数据的完整性;
当源文件很大,如果对源文件进行签名,就会比较耗费时间。
如果只对摘要信息进行签名,速度比较快,因为它是定长的且位数不长。
中间人攻击:
利用散列函数我们可以用来保证数据的完整性。使用对称加密和非对称加密体系来完成数据的机密性和验证来源的合法性。但验证来源的合法性其实存在一个缺陷,就是怎么保证公钥的合法性?
假设Alice想向Bob发送一个文件。
首先Alice得得到Bob的公钥;
但是很不幸,Alice得到的是Hacker使用自己的公钥伪装成Bob的公钥;
于是Alice拿着这个伪装的公钥对文件进行加密,并发送给Bob;
但不幸的事情又发生了,这个加密文件被Hacker截获;
于是,Hacker得到了文件的内容;
Hacker对原文件可能进行篡改/也可能不会篡改;
于是Hacker利用Bob真正的公钥对文件进行加密;
然后发送给Bob;
整个过程对Bob和Alice来说全然无知。
通过上图,我们看出要想实现对公钥来源合法性进行验证。需要数据通讯双方都得信任这个角色并且这个角色可以帮助通讯双方安全完成公钥交换。我们通常把这样一个角色或机构称为CA。
CA数字签名:
- 首先必须保证CA为数据通讯双方都认可的机构;
- 数据通讯双方向CA提交认证申请。里面包含各自的公钥;
- CA分别对通讯双方的合法性进行验证;
- 如果验证通过,CA则利用自己的私钥分别对两份申请文件进行加密(数字签名)。最终产生一个由CA完成数字签名的文件,称为数字证书。
- 通讯双方各自下载由CA签发的数字证书;
- 假设Alice想要发送一个文件给Bob;
- 首先Alice得向Bob请求得到Bob的数字证书;
- Alice利用CA的公钥完成对Bob数字证书合法性认证,并且从证书中得到Bob的公钥。
- Alice利用散列函数对数据进行Hash产生摘要信息;
- 并通过程序随机生成一个session key,利用这个session key对数据进行加密;
- Alice再利用Bob的公钥对这个session key进行加密;
- Alice将自己的证书和加密后的文件(包含session key)一并发送给Bob;
- Bob接收到Alice发来的文件后,先用CA的公钥来验证文件来源的合法性。
- 如果合法,则利用自己的私钥对session key进行解密,再利用session key对数据进行解密,得到明文数据。
- 然后,利用散列函数对数据进行Hash得到摘要信息。
- 将自己得到的摘要信息和Alice发过来的摘要信息进行比对,如果一致,则表明数据没有被篡改。安全通讯完成。
最终想法
目前在互联网上很多Web应用,尤其是那些电子商务应用,如网上银行,网上超市,股票和债券的在线交易以及软件的付费下载等,都需要在Web服务器和客户端浏览器之间传输机密敏感数据,这些数据包括了信用卡号,密码,银行帐号等高度私隐数据,如果这些数据给别人截获或篡改就会对客户和网站造成不可估量的损失。
为了保护这些敏感数据在传送过程中的安全,全球许多知名企业采用SSL的加密机制。 SSL是Netscape公司所提出來的安全保密协议,在浏览器和WWW服务器之间构造的安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它采用了RC4、MD5,以及RSA等加密演算法,使用40位的密钥,合适与对于商业信息的加密。
根据这一系列分析流程,我准备尝试进行利用openssl中的SSL系列函数进行加密通信。