大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说密码学基础知识概述[通俗易懂],希望您对编程的造诣更进一步.
密码学基础知识概述
- 密码学基础知识概述
- 一、导论
- 1.1 安全目标
- 1.2 攻击
- 1.2.1 攻击类型
- 1.2.2 被动攻击与主动攻击
- 1.3 密码分析攻击
- 二、对称密钥加密
- 2.1 代换密码
- 2.2 换位密码
- 2.3 流密码与分组密码
- 三、非对称密钥加密
- 四、哈希函数与数字签名
- 4.1 哈希函数
- 4.2 数字签名
- 五、密钥管理
- 5.1 对称密钥分配
- 5.1.1 密钥分配中心(KDC)
- 5.1.2 Kerberos
- 5.2 公钥分配
- 5.2.1 公钥基础设施(Public-Key Infrastructures,PKI)
密码学基础知识概述
研一上学期上了信息安全这门专业课,因为本科的读的专业是计算机科学与技术,所以对密码学这方面接触的其实并不多,不过对这方面还是比较感兴趣的,所以在学习完之后根据课本以及自己的理解以博客的方式整理下学习的内容,课本使用的是《Cryptography and Network Security》,作者是Behrouz A. Forouzan<美>。本文主要梳理密码学的知识体系,大概的内容框架,让大家对密码学有个简单的了解,不涉及具体的算法等。
一、导论
随着计算机的发展,信息已经成为了一种资产,和其他人任何一种资产一样具有价值。因此,如何保护信息避免攻击也是当今人们一直在研究的问题。
1.1 安全目标
- 机密性(Confidentiality)
- 对信息的访问和公开进行授权限制,包括保护个人隐私和私密信息。机密性缺失的定义是信息的非授权泄露。
- 完整性(Integrity)
- 防止对信息的不恰当修改或破坏,包括确保信息的不可否认性和真实性。完整性缺失的定义是对信息的非授权修改和毁坏。
- 可用性(Availability)
- 确保对信息的及时和可靠的访问与使用。可用性的缺失是对信息和信息系统访问与使用的中断。
1.2 攻击
- 侦听(Snooping):非授权实体访问或拦截信息。
- 流量分析(Traffic Analysis):通过监控在线流量来获取其他信息。
- 篡改(Modification):在拦截到消息之后攻击者对信息进行修改,把消息改成对自己有利。
- 伪装(Masquerading):假装成别的实体。
- 重放(Replaying):将获得的消息再次发送。
- 否认(Repudiation):分为两种,发送发发送消息之后否认曾发送过消息或者接收方接受消息之后否认接受过消息。
- 拒绝服务攻击(Denial of Service):减慢或者完全中断系统的服务。
1.2.1 攻击类型
根据危害上述三种安全目标可以将攻击分为三类:危害机密性的攻击、危害完整性的攻击、危害可用性的攻击。
1.2.2 被动攻击与主动攻击
攻击类型还可以分为主动攻击与被动攻击,其中危害机密性的攻击为被动攻击,危害完整性以及可用性的攻击为主动攻击。被动攻击仅是获取信息但并不修改信息,因此被动攻击可以防止但是很难检测,而主动攻击对数据进行修改或者伪造数据,与被动攻击相反,主动攻击难以绝对预防但易于检测。
1.3 密码分析攻击
在介绍相关加密知识之前,先简单介绍下密码学中用到的一些术语。
- 明文:原始消息
- 密文:加密后的消息
- 加密:从明文到密文的变换过程
- 解密:从密文到明文的变换过程
- 密钥:相用来完成加解密等过程的秘密信息
密码分析攻击可分为唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击。
- 唯密文攻击:攻击者知道加解密算法并且拦截到了密文,尝试对密文进行还原。比如蛮力攻击、统计攻击、模式攻击等方法。
- 已知明文攻击:攻击者知道加解密算法,并且事先已经掌握了一些明文-密文对,通过这些信息尝试激活成功教程拦截到的密文。
- 选择明文攻击:这种方法和已知明文攻击很类似,区别是攻击者掌握的明文-密文对由攻击者选择。比如攻击者得到了发送方用来加密的电脑,他可以输入一些自己想输入的明文来获取相应的密文。
- 选择密文攻击:和选择明文攻击很类似,区别是攻击者通过输入密文来获取相应的明文。如果攻击者得到了接收方用来解密的电脑可以实现。
- Kerckhoff原理:我们在设计密码的时候应该假设攻击者知道加解密算法,仅依靠密钥来抵抗攻击,也就是说我们的密钥应该足够难以攻破,没必要隐藏加解密算法。
二、对称密钥加密
对称加密,在加解密过程中使用的密钥相同,是20世纪70年代公钥密码产生之前唯一的加密类型,即便在今天,它的使用也十分广泛。对称密钥加密的最大优势是加/解密速度很快,适合于对大数据量进行加密,但是他的缺点是密钥的管理与分配,也就是说,如何把安全可靠的把密钥发送到正确的人的手里而不被拦截是个问题。
2.1 代换密码
传统的对称密钥密码可根据加密方式分为两类:代换密码、换位密码。在代换密码中,我们在加密的过程中将一个需要加密的符号用其他符号来替换,而在换位密码加密过程中,我们则是将加密信息进行重新排序。在实际加密过程中,我们通常是采用两种方法结合使用以提高密码的安全性。
代换密码又可分为单码代换和多码代换,在单码代换中,同一个符号总是被另外相同的符号代换,而在多码代换中,不同位置的同一个符号可以被不同符号代换。
传统的单码代换密码有加法密码、乘法密码、仿射密码等。下面以仿射密码进行举例:
加密过程:C = (P * k1 + k2) mod 26
解密过程:P = ((C -k2) * k1-1) mod 26
其中各个符号意义如下(之后的表示也均按照如下):
C:密文
P:明文
k:密钥(其中k1表示第一个密钥,k2表示第二个密钥)
k-1:k的乘法逆元,k在模p下的乘法逆元表示为 k * k-1 ≡ 1(mod p),并且k是大于0小于p的整数
仿射密码相当于加法密码和乘法密码的结合,在加密过程中一共用到一个密钥,一个用于加法加密,一个用于乘法加密。下面是仿射密码一个具体的例子:
用仿射密码对消息“hello”进行加解密,密钥对(k1,k1)为(7,2):
首先按照字母表的顺序对字母进行赋值,从00到25,即a对应的值为00,z对应的值为25。
加密过程:
P:h➡07 加密:(07*7+2)mod26=25 C:25➡Z
P:e➡04 加密:(04*7+2)mod26=04 C:04➡E
P:l ➡11 加密:(11*7+2)mod26=01 C:01➡B
P:l ➡11 加密:(11*7+2)mod26=01 C:01➡B
P:o➡14 加密:(14*7+2)mod26=22 C:22➡W
解密过程:
根据乘法逆元的定义,7在模26下的乘法逆元为15,因为 7 * 15≡ 1(mod26)
C:Z➡25 解密:((25-2) * 15)mod26=07 P:07➡h
C:E➡04 解密:((04-2) * 15)mod26=04 C:04➡e
C:B➡01 解密:((01-2) * 15)mod26=11 C:11➡l
C:B ➡01 解密:((01-2) * 15)mod26=11 C:11➡l
C:W➡22 解密:((22-2) * 15)mod26=14 C:14➡o
多码代换在加密过程中不同位置的同一符号加密得到的结果不一定相同,这是因为和单码代换加密过程中密钥不改变不一样,在多码代换加密过程中,往往密钥是在不断改变的,比如提前设定好一个密钥流或者前一位将前一位的明文作为后一位加密时使用的密钥。具体有Autokey Cipher、Playfair Cipher、Vigenere Cipher等加密方案。下面以Autokey Cipher为例:
P=P1P2P3… C=C1C2C3… k=(k1,P1,P2…)
加密:Ci = (Pi + ki) mod 26 解密:Pi = (Ci – ki) mod 26
下面对消息“attack is today”进行加密,初始密钥:k1 = 12
2.2 换位密码
换位密码得到的密文就是被打乱顺序的明文,比如可以将明文按照固定的宽度水平的写在纸上,然后按垂直方向读出得到密文,解密时则将密文按相同宽度垂直的写在纸上,按水平方向读出。比如我们将”meet me at the park”这句话以水平宽度为4写出按垂直方向读出得到的密文则为”mmtaeehreaekttp”.
2.3 流密码与分组密码
还可以根据每次加密信息的大小将密码分为流密码与分组密码。流密码又称序列密码,明文称为明文流,密钥称为密钥流,在加密过程中,每次对明文流中单个比特位进行加密变换。分组密码又称块密码,加密之前先将明文分成大小相同的n个组,每组大小为m ( m > 1),若有不足位则进行补全,在加密过程中逐次依组进行加密。前面介绍到的一些算法都是以前所使用的一些基础简单的算法,在现在的环境下很容易就被激活成功教程,十分不安全。目前主流的对称加密方案主要时DES和AES,两者都属于分组密码。
三、非对称密钥加密
非对称密钥加密,又称公钥加密,这个概念最早在1976年被人提出。和对称加密不一样的是公钥加密有两个密钥,公钥和私钥,公钥即为公开的密钥,私钥则不公开。当人们需要加密发送信息时,发送方使用接收方的公钥对数据进行加密,接收方收到加密信息之后用自己的私钥进行解密即可得到信息。与对称加密相比,由于公钥加密加解密过程中使用的密钥不一样,所以相对而言安全性更高,但算法更加复杂因此加解密速度更慢,不适用与对大量数据进行加密,因此,在实际应用中,我们需要对大量数据进行加密时,往往采用对称加密的方法,再用公钥加密对对称加密的密钥进行加密。接收方收到信息之后首先用自己的私钥进行解密得到对称加密的密钥,然后再对消息进行解密。这样既保证了加解密的速度同时又提高了安全性,一举两得。
RSA算法是目前使用最为广泛的公钥加密算法,由Ron Rivest、Adi Shamir以及Leonard Adleman三人在1977年提出,下面简单介绍该算法及其证明。
密钥生成过程:
- 选取两个不相等的大素数p和q
- 计算n = p * q
- 计算φ(n) = (p-1) * (q-1)
- 选取 e 使得 1 < e < φ(n),且e和φ(n) 互素
- 计算e模φ(n) 的逆d,即求d使得 ed ≡ 1 (mod φ(n)),也就是ed = k*φ(n) + 1,其中k为整数
- (e,n)公钥,d为私钥
加密: C = Pe mod n
解密 :P = Cd mod n
证明:
证明过程使用到了欧拉定理:如果n = pq,a<n,并且k为整数,则有 akφ(n)+ 1 ≡ a (mod n)
假设接收方用私钥解密出的明文为P1,证明P1 = P
P1 = Cd mod n = (Pe mod n)d mod n = ped mod n
ed = kφ(n) + 1,所以 P1 = ped mod n = P kφ(n)+ 1 mod n = P mod n = P
四、哈希函数与数字签名
4.1 哈希函数
哈希函数H可将任意长度的信息M作为输入,同时产生固定长度的哈希值h=H(M)。常见的哈希函数有MD5、SHA1等。当哈希函数应用于密码学中,它需要满足以下三个标准:
- 原像稳固(单向性):通过给定的哈希值很难找到原文。即对于给定的哈希值 h,很难找到任何M使得h=H(M)。
- 第二原像稳固:给定明文和哈希值,很难找到与给定明文不同但哈希值相同的另一中明文。即给定M以及h=H(M),很难找到M‘使得M≠M’但H(M)=H(M’)。
- 抗碰撞:在不给定任何信息条件下,找到两种明文不同但哈希值相同的明文。即找到M和M’使得M≠M’但H(M)=H(M’)。
4.2 数字签名
数字签名,又称公钥数字签名,是公钥密码的一种应用,该过程使用的密钥分为公钥和私钥,和公钥加密不一样的是,公钥加密过程中使用的是接收方的公钥进行加密,接收方的私钥进行解密。而在数字签名过程中则是使用发送方的私钥进行加密得到数字签名,之后再使用发送方的公钥进行解密得到哈希摘要。数字签名是保证消息来源和完整性的重要方法。
数字签名过程如下图所示:
- A首先用B的公钥对明文加密得到密文,再用哈希函数对明文进行哈希得到哈希摘要,之后使用A的私钥对摘要进行加密得到数字签名。
- A将数字签名和密文一起发给B。
- B收到密文和签名后,首先使用B的私钥对密文解密得到明文,然后用哈希函数哈希明文得到摘要。之后用A的公钥对数字签名解密得到消息摘要 ,对得到的两个摘要进行对比,若一致则表明消息没有被篡改,否则拒绝接受消息。
五、密钥管理
通过前面的介绍我们便能明白密钥对信息安全起着多么重要的作用,因此,如何高效安全的对密钥进行管理一直是人们研究的重点。
5.1 对称密钥分配
由于公钥加密效率不高,因此在对大量数据进行加密时我们往往都是使用对称加密,然而,对称加密要求双方都享有密钥,也就是说,对于N个人的团体,如果他们使用公钥加密进行通信的话,则一共需要的密钥数量为N(N-1)/2。而且双方交换彼此的密钥风险很大,因此我们需要一个可信任的第三方帮助我们对密钥进行管理,也就是我们的密钥分配中心(Key-Distribution Center)。
5.1.1 密钥分配中心(KDC)
在这种模式下,每个用户和KDC都有进行交流的密钥,比如Alice和KDC的共享密钥为KAlice,Bob的则为KBob。当Alice想要和Bob进行交流时,过程如下:
- Alice首先发送想要和Bob的交流请求给KDC。
- KDC收到请求之后告知Bob。
- 如果Bob同意则KDC为两者创建一个会话密钥。
5.1.2 Kerberos
Kerberos是目前比较流行的一种网络认证协议,同时也是一个KDC。它可分为以下及部分:
- Authentication Server(AS):用户身份认证、管理用户密码对、提供用户和TGS的会话密钥和TGS票据。
- Ticket-Granting Server(TGS):提供票据许可服务,提供用户和Real Server的会话密钥以及Real Server票据。
- Real Server:为用户提供服务。
5.2 公钥分配
若用公钥加密时,我们需要将自己的公钥发布出去,让其他人都知道,但这很容易被别人伪造我们的公钥以及被中间人攻击。因此我们同样需要一个可信的第三方。
5.2.1 公钥基础设施(Public-Key Infrastructures,PKI)
获取方式:
1.在你手机的右上角有【关注】选项,或点击我的头像,点击关注!(关注我)
2.关注后,手机客户端点击我的主页面,右上角有私信,请私信发我:编程
电脑已经设置好了关键词自动回复,自动领取就好了!这几天上万个消息,真的回复不过来,所以回复的时候请注意关键词!
其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里请私信我“编程”不管你是小白还是大牛欢迎入住大家一起交流成长。小编会在里面不定期分享干货源码,包括我精心整理的一份c++零基础教程。欢迎各位感兴趣的的小伙伴。
学习思路:
学习资料:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/12032.html