主要根据 EBU7140 课程内容整理,比较偏向应试~
Block1:介绍课程,传统加密方式。
Block2:公钥加密的原理和应用。
Block3:一些特定安全协议技术(如防火墙 Kerberos身份验证协议等)。
Block4:电子邮件安全,网络安全。
网络安全的意义不必多说。军事领域通信,日常生活交易……
这门课程的标题叫做“安全与认证”,安全和认证分别是指什么?
security system: Deter, Prevent, Detect and Correct security violations of data transmission.
安全系统:阻止、预防、检测和纠正数据传输中的安全违规行为。
安全架构主要包含三个内容:使数据信息泄露的安全攻击 attack,检测、预防、恢复安全攻击的安全机制 mechanism,防止攻击的进程安全服务 services。
安全攻击主要有以下几种,都比较好理解:
安全攻击也分为被动 passive 和主动 active。
安全机制:我们知道“安全”是一个抽象的东西,不能被提供。但是可以通过增加安全攻击的难度使得系统被称为“更安全”,比如加密技术。Cryptography
安全服务:比如安全认证 Authentication 鉴别用户权限;access control 只让有权限的人访问;校验数据机密性完整性……
下图是一些术语,我感觉不会考概念,只是题干里出现的时候要知道意思。
从上到下:明文(未加密的数据),加密,密文,解密,密钥(用于加密解密,用法要看具体加密算法);加密,哈希算法,数字签名(通过加密算法来确保这个信息是我发送的);访问控制,数据机密性,数据完整性,不可否认性,身份认证。
三者是包含的关系,security 是一些基本定义,mechanism 是利用 security 的一些算法,services 是结合 mechansim 实现的一些功能。
简化一下就是发送信息的时候,网络安全服务帮我们加密后发给对方,对方借助网络安全服务解密后得到数据。
最古老,最简单的加密方法:凯撒密码 Caesar Cipher,字母平移。凯撒当时用过这种方式和他的军官联络。
如果我们知道密文是通过凯撒加密的,那么破解非常简单,顶多试25次就能得到答案。
维吉尼亚密码 Vigenère Cipher:多字码替换 Polyalphabetic Substitution,本质上是多次凯撒密码得到的。
比如明文 M,key 第一个是 S,那么对应密码表中的 E 字母。
明文 Y,第二个 key 是 T,对应 R。
算法:(明文对应字母 + key 对应字母) mod 26 (A 算 0)
解密:(密文对应字母 - key 对应字母) mod 26 (A 算 0)
转子加密 Rotor Encryption:多层滚轮的机械结构。
单滚轮:
每加密一个,滚轮左移一下。
多滚轮:不同层滚轮转速不同。
这是德国发明的加密机器,不过后来也是逐渐被破解了。
格栅加密 the grille:利用一个格栅图区遮挡。收发双方应该是共有一份格栅图。
每次取一部分数据后顺时针旋转格栅图,再取一部分数据。
隐写术 Steganography :把数据藏起来,不能直接发现的加密方式。比如调整像素的最低有效位,音频文件中通过频谱调整或频率转移……本质是你第一眼看不到明文。
加密 Cryptographic :密文给你了,就在这张纸上,这个就是数据。但是你需要解密才能看。
加密方法:替换和移位 Substitution & Transposition. 比较好理解。
使用的密钥数量:对称加密和非对称加密 Transposition & Asymmetric。加密解密用一个密钥就是对称加密。
明文处理方式:流加密和块加密 Stream Cipher & Block Cipher。一次处理一个元素和一块多个元素的区别。
前面的凯撒密码算是流加密,格栅我觉得应该算块加密。
举一个流加密的例子,简单说就是明文和密钥逐位异或运算得到密文,再异或一次解密。因为一个位和0或者1异或2次都会得到他自己。
计算量小,加密快。但是太简单了,如果知道明文密文就知道密钥了;且攻击者篡改消息后无法被察觉,没有类似奇偶校验的那种保证信息没有被篡改的机制。
第二种流加密方法叫 one time pad 一次性记事本,无法被破坏。即每次传输都使用一个新的随机密钥,长度和要传输的信息一样,**密文和明文没有统计上的关系,**用这个密钥来加密。问题在于怎么把密钥发给对方,密钥太大,而且该算法也容易出错。
比如每10个字母重新排一次顺序,from {1,2,3,4,5,6,7,8,9,10} to {3,1,2,10,7,5,4,8,6,9}。
playfair 方阵密码,初见有点蒙,看明白了发现还是挺有意思的。
首先我们用密钥生成一个5*5的加密方阵。比如密钥是 “MY SECRET CODE IS”,我们去掉重复字母和空格,变为 “MYSECRTODI”,写在方阵里,其余部分按字母表没出现的字母顺序填充。
对于明文,首先我们把明文拆成一对一对的字母组合,如果出现某一对字母组合重复,就把第二个换成 X 或 Q。
对于每一对字母,我们先去加密方阵里找到对应的字母位置。
挺安全的哈,这么复杂。问题在于密钥不能泄露出去(用于生成加密矩阵的密钥),一旦泄露就完蛋。
上面这些都是一些比较传统的加密方式,问题基本在于:密钥不能泄露。所以当时人们就需要一些双方制定协商密钥的方式,不然如果第一次发密钥的时候被截获了,后面的信息传输都相当于是透明的了。
针对破解密钥的攻击方式主要有两种,一种是密码分析攻击 Cryptanalysis Attacks,针对可能使用的加密方式和该方式明文和密钥的一些加密规律进行破解。比如福尔摩斯里面有一章(跳舞的人),当时密信只是给每个字母创建了一个不同动作的小人符号,福尔摩斯先从英语中e出现次数最多的规律开始推,得到了e对应的符号,接着是其他字母……逐渐破解。
第二种是暴力破解法 Brute-force Attacks,想起以前搬校区的时候我有个3位密码锁是隔壁宿舍同学帮我暴力试出来的hhh。不过有一点区别,那个是试密码,这里的暴力破解是试密钥。
加密算法的安全性怎么评价,其实任何一个密码肯定早晚都是能破译出来的(大不了破译50年,100年,1万年?),要说密钥安全不是说绝对破解不出来,而是:
和福尔摩斯一样的方法,我们根据字母出现频率去猜。
大不了 shift 25次,总能破解出来吧?
不过更有效的破解方式是向量计算概率,深度学习里面对分类问题的预测也有异曲同工之妙,我们通过一定的算法量化不同 key 是正解的概率,最后比较并选出最可能是 key 的偏移量,而我们并不用关心对于非正确的预测值(感兴趣可以看看我的这篇文章:深度学习(五)softmax 回归之:分类算法介绍,如何加载 Fashion-MINIST 数据集-CSDN博客)。
上表是当前密文的字母出现频率(我称其为密文向量),下图是统计字幕出现频率(我称其为频率向量)。
破解方法:我们让密文向量 shift 一下,与频率向量相乘,算出预测概率;shift 值尝试从1到25,算出每种预测值大小,最后取其最大值。
维吉尼亚密码是一个26*26的矩形,通过明文和密钥找对应位置的字母那个。也就是说密钥不是一个简单的数字偏移量了,而是一个字符串。
首先我们需要猜出密钥长度。我们观察一下重复组合出现的次数(好像是2-3个字母?)
感觉上重复组合出现的比较常见的距离为3,所以密钥是3的倍数(这不依靠算法的话应该还是挺难找的)。
然后我们还是尝试密文 shift 偏移,每次偏移记下偏移量和发生的数字重复情况。比如下图是 shift +2 的偏移情况。
偏移量与重复情况如下:
而且我们知道密钥长度很可能是3的倍数。那么我们把密文分成三等分,3k,3k+1,3k+2。
接下来,对于这三组数据,分别做和以撒密码破解类似的向量破解运算,并求和得出最可能的密钥。
原理上,首先以撒密码和维吉尼亚密码区别在于维吉尼亚密码是一个密钥字符串重复多次的以撒密码,比如 abcabcabc…… 如果我们估测出维吉尼亚密码长度为3,那么 3k 位置的字符串相当于都用 a 加密的凯撒密码,3k+1 位置的字符串都用 b 加密,3k+2 位置都用 c 加密,分别运用以撒密码破解即可。
用对称加密的块加密算法也被称为传统加密。
Feistel Algorithm:对密码分块,进行多轮加密处理的算法。比较典型的是 DES。
DES data encryption standard 是一种加密标准。具体 DES 算法有很多。
取64位数据,右边的32位用置换表扩展到48位和密钥异或,再通过s-box置换表置换到32位,和左边的32位异或得到新一轮的右边32位,然后下一轮的时候右边32位变成新的左边32位。
密钥是64位密钥,置换表后变为56位,每一轮是移位后置换表变为48位,再和48位message异或。
S-Box 作用第一是压缩长度进行密钥运算,第二是增加安全性。
DES 安全性和密钥长度,s-box 和特定排列的选择有关(就是替换表和密钥长度)。
DES 56位密钥相对来说安全性不高(虽然已经足够把我绕晕了我觉得),因此可以多重 DES。
两次 DES 加密,用不同的密钥。
E K 1 ( E K 2 ( m ) ) E_{K1}(E_{K2}(m)) EK1(EK2(m))
一开始我觉得有没有可能找到一种密钥 k3 使得他和 k1 k2 加密两次是一样的效果呢,那两次加密就没意义了。不过好像根据算法特性,这是不可能发生的。
单重 DES 密钥等级是 256 ,双重是 257 。
双重 DES 的一个破解方式:中间相遇攻击 Meet-in-the-middle attack。假设双重 DES 只加密一次时的中间值为 X(即 E_{K2}(m) 或者 D_K1©),我们只需要两对已知明文密文对就可以破解双重 DES。
三重 DES。
C = E K 3 ( E K 2 − 1 ( E K 1 ( m ) ) ) C=E_{K3}(E_{K2}^{-1}(E_{K1}(m))) C=EK3(EK2−1(EK1(m)))
-1 代表解密。解密正相反,K3 解密,K2 加密,K1 解密。
随着计算机计算能力的进步,DES 相对不再安全了,因此 AES 新的加密标准被推出。
标准如下:
当时美国国家标准技术研究所制定 AES 标准后征集大家的算法实现,想找到更加安全的算法。比较有名的作品就是 Rijndael。
简单来说分为以下四轮:
S-box 字节替换。一个字节8位,前4位表示16行,后4位表示16列,去替换表里找到对应替换项。
行移位,不同行移位不同。
列混合 MixColumns,列与常数矩阵做乘法运算得到新的列。
比如:
轮密钥加 AddRoundKey,这一步算是真正的加密,密钥和 state 矩阵异或。一般会根据用户密钥进行密钥扩展,生成多轮子密钥,每一轮加密的时候使用不同的密钥。
整体流程是先 add round key 一次,然后 substitute bytes, shift rows, mix cloumns, add round key 这四部分重复 N_{r-1} 次。
不过其实这个加密方法也没有看着那么复杂,甚至不需要尝试2128 次密钥,2100 就可以(应该是根据一些密钥分析技术)。
Mode of operation 改进加密方式的方法,原则上尽量避免同一个密钥会产生相同的加密结果,这也是我们前面几种加密方式最大的弊端。反正相同密钥会产生相同的加密结果,那么大不了暴力尝试2128 次不也就尝试出来了么。
电子代码簿,就是简单的分组加密。
不过想想我们破解 DES 的方法,相同密钥加密会产生相同结果的问题并没有解决,我们只要知道明文密文对,尝试所有密钥即可破解。
每个明文块先和前一个密文异或,再用密钥加密。c0 初始密文块是双方约定好的一个用于加密的信息。
解密正好相反。
复杂度更高了。不过加密的时候没法并行加密,必须串行加密因为依赖关系。解密的时候还是可以并行解密的。
初始向量加密后与明文块1异或,得到密文块1;密文块1加密后与明文块2异或,得到密文块2;……
IV 初始化向量类似 CBC 的 c0,是双方用于起始加密的一个信息。
解密流程差不多,不过不是和明文异或得到异或了,是和密文异或得到明文。
缺点也是加密无法并行运算,而且前面计算错误会影响后面的计算结果。
和 CFB 区别在于 CFB 是前一个密文块作为后一块加密的初始向量,因此会发生错误传播 Error Propagation。而 OFB 是没和明文异或的时候就作为下一个块的初始向量了,不会发生错误传播。而且如果提前计算好了 IV 向量的多轮加密值,可以直接与分组明文进行并行加密运算。
一个自增的加密计数器作为初始向量。
也可以并行计算,速度很快。
一个最重要的问题:双方怎么同步密钥。如果发密钥的过程中被截住了,那算法再吊也没用啊。
密钥传送通道必须要比发信息通道更安全。
还有一个问题就是怎么通过签名确保密钥是对方发给我的。比如中间人截获了A给B发的密钥,自己伪造了一个密钥给B,B根本不知道他的密钥被修改过。
密钥发送可以通过物理通道(亲手给对方?)。或者如果两个人以前有旧的密钥,现在想换新了,新密钥可以通过旧密钥加密发送。或者两个人可以通过彼此之间的加密连接发送。