poser

导航

加密解密一些基本概念

术语:
明文:plaintext
密文:ciphertext
加密:encrypt,encipher
解密:decrypt,decipher
秘钥:key
 
密码除了保密以外,还提供其他方面的保障:
鉴别(authentication):消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人
完整性(integrity):消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息
抗抵赖(nonrepudiation):发送者事后不可能虚假地否认他发送的消息

单向散列函数(one-way hash function):
又叫压缩函数,收缩函数,消息摘要,指纹,密码校验和,信息完整性校验,操作检验码等。它把任意长度的消息映射为长度固定的值(散列值),满足如下性质:
1、已知消息,计算散列值——很容易
2、已知散列值,计算消息——很难
3、找到两个不同的消息,使得它们的散列值相同——很难
例如:MD5,SHA
 
加密算法:
对称算法(symmetric algorithm):又叫传统密码算法。加密秘钥能够从解密秘钥中推算出来,反过来也成立。在多数对称算法中,加密秘钥和解密秘钥是相同的。
 
这种算法要求发送者和接收者在安全通信之前,先商定一个秘钥。对称算法的安全性依赖于秘钥。
 
对称算法分为两类:
序列算法(stream algorithm):一次只对明文中的单个位(或者字节)运算。
分组算法(block algorithm):对明文中的一组位进行运算(现代计算机密码算法常用64位)。例如:DES
 
公开秘钥算法(public-key algorithm),又叫非对称算法。解密秘钥和加密秘钥不同,并且解密秘钥(在可接受的时间内)无法依据加密秘钥中计算出来。因此,加密秘钥可以公开,只需保护解密秘钥即可。加密秘钥被称为公钥(public key),解密秘钥被称为私钥(private key)。例如:RSA
 
由于公开密钥算法比对称算法慢(1000倍),因此,在实际中,公开密钥一般不用于直接对数据进行加密,而是用于加密密钥,步骤如下:
1、甲将自己的公钥发给乙,自己保留私钥。
2、乙随机生成对称算法的密钥,并用甲的公钥进行加密,再将加密结果发送给甲
3、甲用自己的私钥对乙发送的消息进行解密,从而得到乙生成的密钥
4、现在甲乙两人同时拥有同样的密钥,可以通信
 
攻击方法:
唯密文攻击(ciphertext-only attack)
密码分析者有一些消息的密文。分析者的任务是恢复尽可能多的明文,最好能推算出加密密钥。
已知明文攻击(known-plaintext attack)
密码分析者不但有一些消息的密文,同时也有这些消息的明文。分析者的任务是推算书加密密钥或者解密算法
选择明文攻击(chosen-plaintext attack)
密码分析者不但有一些消息的密文和明文,他们也可以选择被加密的明文。如果在选择明文的过程中,考虑到了过去加密的结果,那么就叫“自适应选择明文攻击(adaptive-chosen-plaintext attack)”
选择密文攻击(chosen-ciphertext attack)
密码分析者可以选择不同的密文,并可得到对应的解密的明文

数字签名(digital signature):
使用公开密钥算法可以进行数字签名:
1、甲用私钥对文件进行加密,从而对文件签名
2、甲将签名的文件传给乙
3、乙用公钥(公钥是公开的)进行解密,从而验证签名

 
   
手写签名
数字签名
签名是可信的
签名使文件的接收者相信签名者是慎重地在文件上签字的
不成立
只要能用公钥解密,那么就能说明文件一定是用甲的私钥加密的
签名是不可伪造的
签名证明是签字者而不是其他人慎重地在文件上签字
不成立
只要私钥不泄露,那么签名就是不可伪造的
签名不可重用
签名是文件的一部分,不法之徒不可能将签名移到不同的文件上
不成立
显然成立
签名的文件是不可改变的
在文件签名后,文件不能改变
不成立
如果文件有任何改变,那么就不能被公钥解密
签名是不可抵赖的
签名者事后不能声称他没有签过名
不成立
显然成立
在实际实现中,由于公开密钥算法太慢,因此对大文件进行签名是不现实的。所以,签名者可以使用单项散列函数计算文件的散列值,然后对散列值进行签名。这样做可以起到同样的效果。
 
消息鉴别码(Message Authentication Code,简称MAC):
用于在没有保密的情况下验证消息。例如,用对称算法对消息的散列值进行加密,即可得到MAC。只有拥有相同密钥的人才能鉴别这个消息。
 
数字证书(digital certificate):
考虑用公钥加密通信密钥的过程:
1、甲将自己的公钥发给乙,自己保留私钥。
2、乙随机生成对称算法的密钥,并用甲的公钥进行加密,再将加密结果发送给甲
3、甲用自己的私钥对乙发送的消息进行解密,从而得到乙生成的密钥
4、现在甲乙两人同时拥有同样的密钥,可以通信
 
当乙收到公钥后,乙如何才能相信这个公钥确实是由甲发出的?如果其他人冒充甲向乙发送公钥,那么他就可以取代甲的身份和乙通信。为了避免这种情况,需要一个同时被甲乙双方都信任的第三方介入。甲先将自己的公钥和个人信息发送给第三方进行验证,第三方通过一些手段(可以是和计算机科学无关的手段)证明了甲的身份后,将甲的公钥和甲的个人信息进行数字签名,然后再把甲的公钥、甲的个人信息、自己生成的数字签名等三样东西放在一起,作为数字证书发给甲。甲在收到数字证书后,就可以拿着数字证书从事各种活动了。
在甲乙的通信过程中,甲先把自己的数字证书发给乙,乙可以用第三方机构发布的公钥对对方发过来的数字证书进行验证,如果验证成功,就可以用数字证书中的公钥继续和对方通信。
上述的第三方机构叫做“证书授权中心(Certificate Authority)”,有时简称CA。这种机构是要具备权威性和公正性的,否则所有的电子商务活动都无法开展。
数字证书的作用本质上是用于证明自己是某个公钥的合法拥有者。
注意:窃取者仅仅拥有数字证书是无法伪装成甲的,因为他没有甲的私钥,所以无法对乙所发送的消息进行解密。
 
根证书(root certificate):
CA在发布公钥时,也需要其他更具权威性的CA发布数字证书。这样就形成了证书链。证书链的终点就是根证书。根证书是自签名(self-signed)的。信任根证书就意味着对该证书所签发的所有证书都表示信任。根证书有的随操作系统发布,有的随浏览器发布。
例如:chrome的根证书:

 

firefox的根证书:

 

windows的根证书:

 

SSL(Secure Sockets Layer):
下面是仅对服务器进行认证的握手(handshake)过程:
1、客户端以明文向服务器发送如下信息:客户端支持的最高SSL版本,加密算法候选列表,压缩算法候选列表,随机数(random_C,用于协商密钥),扩展字段;
2、服务器返回指定的SSL版本号,加密算法(从客户端所提供的候选列表中选择),压缩算法(从客户端所提供的候选列表中选择),随机数(random_S,用于协商密钥),数字证书;
3、客户端校验证书的合法性,如果校验成功的话,就生成随机数字 Pre-master,并用证书公钥加密,发送给服务器;
4、通信密钥由三个随机数random_C、random_S、Pre-master计算得到。此时客户端已经拥有了三个随机数,可以计算密钥;
5、客户端将之前的通信信息使用密钥加密,得到encrypted_handshake_message,发给服务器用于验证;
6、服务器用私钥解密,得到Pre-master,然后计算通信密钥。用此密钥对之前的通信信息进行加密,验证encrypted_handshake_message。然后服务器把自己计算的encrypted_handshake_message通过通信密钥加密,发给客户端
7、客户端解密服务器发送的encrypted_handshake_message,验证其正确性;
8、握手结束。接下来双方可以使用协商密钥进行通信。
 
注意:在服务器得到通信密钥之前,所有的通信均以明文进行,所以最后几步需要客户端和服务器双方均计算encrypted_handshake_message,以确保明文的通信没有被篡改。
举个例子:在第一步中,攻击者可以篡改客户端的消息,从加密算法候选列表中删除高强度的加密算法,仅保留安全性很差的加密算法。那么第二步中服务器就被迫只能选择这些很差的加密算法。

 

 

 

 

posted on 2018-02-17 20:48  poser  阅读(1871)  评论(0编辑  收藏  举报