密码学
几个要清楚的概念
信息安全面临的威胁
- 窃听
- 重传
- 伪造
- 篡改
- 行为否认
- 拒绝服务攻击
- 非授权访问
- 传播病毒
相关术语
- 密码技术:把可理解的消息变换成不可理解消息,同时又可恢复原消息的方法和原理的一门科学
- 明文:变换前的原始消息
- 密文:变换后的消息
- 加密算法:用于把原始消息变成密文的算法
- 解密算法:用于恢复明文消息的算法
- 密钥:用于密码变换的秘密消息,选自密钥空间
- 明文空间:加密算法能够加密的所有明文的集合
- 密文空间:加密算法输出的所有密文的集合
- 密码分析:在没有密钥的情况的情况下,破解密文的原理与方法
- 加密:
- 解密:
加密方法分类
- 私钥(对称)加密:加解密密钥一致,分组密码(分块加密后再拼到一起)和流密码(一个字节一个字节加密)属于私钥加密
- 公钥(非对称)加密:加解密密钥不一致
- 数字签名
- 哈希函数
密码分析(攻击)的种类
- 唯密文攻击:只给定公开的密码算法与一些密文,来推导明文或密钥。仅通过可得的密文(可能是多个密文)和已知的密码算法,攻击者试图推导出对应的明文或密钥。由于信息量较少,这种攻击通常是最具挑战性的。
- 已知明文攻击:知道一些明文/密文对,利用这些明密文对来进行攻击。攻击者知道一些明文及其对应的密文,通过分析这些明密文对,利用已知信息推导出其它密文的明文或密钥。这种攻击通常比唯密文攻击简单,因为攻击者已具备一部分信息。
- 选择明文攻击:可以选择明文并得到相应的密文,利用算法的结构进行攻击。**攻击者可以选择任意明文并获得相应的密文。**通过观察和分析密文与明文之间的关系,攻击者试图利用算法结构进行攻击。这种攻击相对有效,特别是针对对称加密算法。
- 选择密文攻击:可以选择密文并得到对应的明文,利用算法的结构进行攻击。**攻击者可以选择任意密文并获得相应的明文。**这种情况下,攻击者利用明文与密文之间的映射关系来分析和破解密钥或加密算法。这类攻击可以非常有效,尤其是对某些不够安全的加密系统。
无条件安全与计算安全
- 无条件安全:由于密文没有泄露足够多的明文信息,无论计算能力有多大,都无法由密文唯一确定明文。就是不管怎么样都算不出来。
- 计算安全:在有限的计算资源条件下,密文不能破解。就是算是能算,但是现在的算力不足以破解。
古典密码
古典密码就代换和置换两种。
- 代换密码(Substitution Cipher):在这种密码中,每个字母或符号在明文中被替换为另一个字母或符号。例如,字母"A"可能被替换为字母"D",字母"B"被替换为字母"E",以此类推。代换可以是简单的,如凯撒密码(每个字母向后移动固定数量),也可以是复杂的,如使用随机替换的密码表。
- 置换密码(Transposition Cipher):在这种密码中,明文中的字母顺序被重新排列,但字母本身不被替换。换句话说,置换密码保留了原始字符集的所有字符,只是改变它们在明文中的位置。例如,“HELLO"可以被置换为"LELHO”,其中字符的位置被调整。按一定规则写出明文,按另一规则读出密文。
代换就是改明文的内容,置换就是改明文里字母的顺序。
凯撒密码(代换密码)
凯撒最开始发明的版本是:把每个字母用其后面的第三个字母来替换,比如A拿D替代,B拿E替代。
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher: DEFGHIJKLMNOPQRSTUVWXYZABC
当然这个是有一般形式的,就是“第三个字母”也能变成“第n个字母”,就是A拿F替代,B拿G替代。
当然也没必要局限于固定长度,比如我A拿G替代,那么B可以拿除了G以外的所有字母来替代,以此类推,搞出一张一对一的密码表来。(混合单表替换密码)
这里我们可以用一个简单的方法来确定密钥:
- 密钥字是 “JULIUSCAESAR”。在生成密钥时,首先要去除密钥字中的重复字母。经过去重后,得到“JULISCAER”。
- 构建密钥字母表:从密钥字(去重后的字母)开始:
JULISCAER
- 添加剩余字母:
- 然后添加原始字母表中未包含在密钥字中的字母。原始字母表为:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 从原始字母表中去掉已经在密钥字母表中的字母,剩下的字母为:
BDFGHKMNOPQTVWXZY
- 然后添加原始字母表中未包含在密钥字中的字母。原始字母表为:
- 综合字母表:将去重后的密钥字母表和剩余字母结合起来,形成完整的密钥字母表:就是把剩余的字母
BDFGHKMNOPQTVWXZY
按字母顺序粘到JULISCAER
后面,R后面是TVWXYZ
(字母表是这样写的),然后再轮回来的BDFGHKMNOPQ
。
维吉尼亚密码(代换)
每个字母要变成啥都不知道。
-
明文和密钥的字符一一对应进行加密:
例如,如果明文是 “ATTACKATDAWN”,而密钥是 “LEMON”,那么将密钥重复以匹配明文的长度:
- 明文: A T T A C K A T D A W N
- 密钥: L E M O N L E M O N L E M
-
密钥的第i个字母确定了第i个明文字母所使用的替换表。例如,假设我们使用的是标准的字母表,那么:
假设明文是 “ATTACKATDAWN”,密钥是 “LEMON”,我们用Vigenère Cipher来加密。
- 所有字母与对应的字母表相加作为简单的算术(例如,A为0,B为1,依此类推),则:
- A (0) + L (11) = L (11)
- T (19) + E (4) = X (23)
- T (19) + M (12) = F (5)
- A (0) + O (14) = O (14)
- C (2) + N (13) = P (15)
- K (10) + L (11) = V (21)
- A (0) + E (4) = E (4)
- T (19) + M (12) = F (5)
- D (3) + O (14) = R (17)
- A (0) + N (13) = N (13)
- W (22) + L (11) = H (7)
- N (13) + E (4) = R (17)
因此,最终的密文可能是 “LXFOPVEFRENHR”。
这个还是很牛的:
- 提高安全性:由于使用了多个替换表,Vigenère Cipher 能够避免简单频率分析的攻击,并且增强了密码的复杂性。
- 灵活性:密钥的变化会直接影响加密结果,即使用不同的密钥会得到不同的密文。
Scytale密码、轨道栅栏密码、几何图形密码(置换)
都是抽象艺术大师
Scytale密码
这个纸条的位置变化,你横着读的结果就不一样。
轨道栅栏密码
Plain: I A E S W C N U R D
C M I A I O Q E E
Cipher: IAESW CNURD CMIAI OQEE
先读第一行,再读第二行
几何图形密码
读的S型顺序不一样结果不一样。
行变换密码(置换)
行变换总是有一个密钥对:写密钥和读密钥
比如密钥是COMPUTER
- 写密钥是把COMPUTER中各个字母按字母表排列,C是1,E是2,所以写密钥是14358726
- 读密钥是看每个字母在COMPUTER里排在哪。C在COMPUTER里是第一个字母,所以是1;E在COMPUTER里是第7个字母,所以是7。因此读密钥是17324865
分组密码
基本概念
这个是现在最常用的,然后它是对称(私钥)密码的一种,通信双方用的密钥是一样的。
分组密码的基本逻辑是拿代换和置换组合:
-
代换(S-box):将一个二进制字用其他二进制字代换,可以看作一个大的查表运算
-
置换(P-box):将二进制字次序打乱
Feistel密码
这里的F是轮函数round function,K是每轮的子密钥。加密流程如下:
- 把明文分成左右两部分
- 右半部分不变,直接作为下一轮的左半部分
- 右半部分和该轮的密钥在轮函数F里作用完后,得到的结果和原来的左半部分异或以后作为下一轮的右半部分
- 然后就循环下去。
解密过程和加密过程基本一样:就是密钥要改,例如加密是k0k1k2…,那解密就是K16K15K14…。
该加密策略中涉及到了几个参数:
- 分组大小:增加分组长度会提高安全性,但降低了密码运算速度,一般取64bit
- 密钥大小:增加了密钥长度,可以提高安全性,但是也降低了密码速度,一般是128bit
- 轮数:增加轮数可以提高安全性,但降低速度,一般是16轮
- 子密钥生成:子密钥生成越复杂就越安全,但降低速度
- 轮函数:复杂的轮函数可以使密码分析困难,但降低速度
S盒(代换)的作用:提供输入bits混合作用,其目的在于使作用于明文的密钥和密文之间的关系复杂化,使明文和密文之间、密文和密钥之间的统计相关特性极小化——“混淆”
P盒(置换)的作用:将明文和密钥的影响尽可能迅速地散布到较多个输出的密文中(即将明文的冗余度分散到密文中)。这种效果进一步解释为“雪崩”和“完备性”——“扩散”
- 雪崩效应:输入1bit的改变,导致近一半的bit发生变化
- 完备性效应:每个输出bit是所有输入bit的复杂函数的输出
“好的”密码设计具有: 雪崩特性,完备性,不可预料性
Lucifier密码
第一个现代分组密码算法。它的总体运行思路和Feistel密码一样,但是它只用一个密钥。
分组长度是 128-bit ,密钥长度是128-bit。每轮使用的子密钥是密钥的左半部分,密钥每次要向左旋转56-bits, 所以,密钥的每部分都参加运算。
形如这样子论着改密钥。
Lucifer没有经过很强的分析,利用差分攻击(属于选择明文攻击)可破解,现在已经不再使用,但它是DES的前身
S-DES密码
顾名思义就是DES密码的简单版本。它是一个供教学而非安全的加密算法,它与DES的特性和结构类似,但参数小。
TODO
DES加密算法
DES加密算法|密码学|信息安全_哔哩哔哩_bilibili
DES的核心是S-box(非线性部件),除此之外的计算是线性的。
总体流程
基本逻辑仍然是Feistel密码这一套,但是使用的密钥、轮函数改了
几个参数
- 分组长度:64bit
- 密钥长度:56bit,实际上密钥为64bit,有8bit为奇偶校验位
- 子密钥长度:48bit
IP置换
比如这里的第一个数字58,意思就是结果中的第1位=原文中的第58位。
轮函数
E扩展
因为R0是32bit,而子密钥是48bit,要运算那就要把R0扩展到48bit。
在扩展的时候,把R0的32bit划分为8个4bit的数据,然后在每个4bit数据前后加上1bit扩展数据,就变成了8个6bit数据,即总共48bit。那这个扩展怎么弄?
异或
那就顾名思义把子密钥和E扩展后的R0来异或
S盒
现在要把异或后得到的48bit数据重新压缩回32bit。还是先把48bit分成8个6bit,对于每个6比特,这样子操作:
第3行第15列是13:这个是查表得到的
P置换
操作方法和IP置换一样
比如这里的第一个数字16,意思就是结果中的第1位=原文中的第16位。
子密钥选取方法
- 密钥长度:56bit,实际上密钥为64bit,有8bit为奇偶校验位
- 子密钥长度:48bit
为什么子密钥是48bit?
这样子得到的k_i就是48bit的数据。注意这里每一次移位,都是在上次移位的基础上完成的,比如第一次移位后的密钥C1,第二次移位是在C1的基础上再移一位。
比如1110001010,循环左移1位后变成1100010101这样子
在实际使用中,可以采用双重DES与三重DES。其中,
- 双重$$DES$$:在加密之后,再用另一个密钥进行加密。但它易受中间者攻击,与DES的安全性无明显区别。
- 三重:先用一个密钥加密,再用另一个密钥解密,然后再用第一个密钥加密,解密时使用对应密钥解密即可,密钥长度达到112bit
IDEA加密
IDEA的明文分组也是64位,密钥为128位。
64bit的明文均分为4块,每块16bit,记为P1P2P3P4。
每一轮循环均输入该64bit的明文和6个16bit的子密钥(这样的循环一共8轮)8轮过后进行输出变换,需要用4个16bit的子密钥,总共52个子密钥。流程图如下:
子密钥怎么生成?
子密钥编排算法:52个16bit的子密钥从128bit的密钥中生成
- 前8个子密钥直接从密钥中取出
- 对密钥进行25bit的循环左移,接下来的密钥就从中取出
**每一次循环都在干什么?**如下图
IDEA的“混淆”和“扩散”设计原则来自三种运算:
- 逐位异或
- 模的整数加
- 模的整数乘
IDEA使用128位密钥,没有DES意义下的弱密钥,能够抗差分分析和相关分析,非S-P盒类型。
AES加密
由于DES加密密钥太短,容易被暴力破解,所以搞了它的进化版AES加密算法。当然AES加密仍然属于分组加密,当然也是对称(私钥)加密
【AES加密算法】| AES加密过程详解| 对称加密| Rijndael-128| 密码学| 信息安全_哔哩哔哩_bilibili
几个参数
- 明文长度:128bit
- 密钥长度:128、192、256bit三种,相应的迭代轮数R为10、12和14。
下面是以128bit密钥来举例。
加密流程
这个最终轮和前9轮的循环运算的区别是:没有列混合操作。
初始变换
明文和密钥都是128bit,也就是16个字节,把两者写成4*4矩阵形式(注意顺序):
然后各对各来异或操作:比如p1和k1,把p1的8个bit和k1的8个bit异或后的结果填到新的矩阵中去。
循环运算
字节代换
这是一个非线性操作
实际在矩阵中存的是16进制数。
比如这里的第一项19,在S-BOX表里就查第1行第9列,这里是d4;就把d4填到第一项里。就这样把16项都替代完就行了。
行移位
矩阵第一行不变,第二行循环左移1位,第三行循环左移2位,第四行循环左移3位。(这里的位都是指字节)
列混合
把上面行移位得到的矩阵左乘一个给定的矩阵。这是对列的线性变换
当然这个乘法不是普普通通的矩阵乘法:
轮密钥加
就是上面的初始变换,把状态矩阵和密钥矩阵按位异或。
子密钥生成
我们最开始只有一个4*4的子密钥矩阵,但是我们一共要循环10次,每次都有轮密钥加这个环节,所以这些密钥怎么生成?
注意这里是从W0开始标号的。
i要分是不是4的倍数:
-
i不是4的倍数很简单,两列异或即可
-
i是4的倍数时,要对W[i-1]做字循环、字节代换、轮常量异或三步操作(即这里的T函数)
-
字循环:把b0,b1,b2,b3变成b1,b2,b3,b0
-
字节代换:再把字循环的结果看着S-BOX表代换一波
-
轮常量异或:拿前两步得到的结果和给定的轮常量表进行异或。轮常量表一共10列,对应10次循环。第几次循环就对应拿第几列去异或。
-
分组加密模式
【分组密码的工作模式】|分组密码 | 密码学 | 信息安全 | ECB | CBC | CFB| OF B| CTR|_哔哩哔哩_bilibili
-
ECB——电子密码本模式:用相同的密钥对明文分组进行单独加密
-
CBC——密码分组链接模式:
适合加密长度大于64比特的消息
还可以用来进行用户鉴别(见报文鉴别部分)
该模式除了能获取保密性,也能用于认证。
-
CFB——密码反馈模式:明文本身不加密(流密码工作特征)
该模式除了能获取保密性,也能用于认证。
这里的“部分解密数据”是指可以取前面的密码分组直接解密,而不像CBC这种需要全部拿出来才能解密,这样就有利于对数据进行随机访问。
-
OFB ——输出反馈方式:每个明文分组加密时用到的密钥在不停套娃
这里“对密文分组的错误不敏感”是因为我只是在对密钥不停加密,没有碰过密文,哪怕密文有错也只会影响那一个分组,而不会像CFB一样拿着出错的密文去加密。
这里的“不支持并行加密”有待商榷:计算密钥的套娃显然不能并行,但是在完成所有套娃计算后,每个明文分组的异或操作可以并行。
-
CTR——计算器模式:密钥变成了计数器
- 可以并行加密
- 可以预处理
- 吞吐量仅受可使用并行数量的限制
流密码
几个概念
序列密码是对称密码体制的一类,将被加密的消息分成连续的符号(一般为bit串),,然后使用密钥流中的第个元素对的第个元素进行加密变换。所有的加密输出连接在一起就构成了对执行加密后的密文
通常加、解密所需要的这种序列是由一个确定性密钥流生成器产生的,该生成器的输入是一个容易记住的密钥,称之为密钥流生成器的初始密钥或种子。最后得到的是一种伪随机序列。
从这个就可以体现出:流密码相比分组密码具有记忆性
流密码分类
- 同步流密码:
- 密钥流与明文串无关,所以同步流密码中的每个密文不依赖于之前的明文
- 同步流密码的一个重要优点就是无错误传播,即在传输期间一个密文字符被改变只影响该符号的恢复,不会对后续的符号产生影响
- 自同步流密码:
- 密钥流的产生与之前已经产生的若干密文有关
反馈移位寄存器
流密码 | 线性反馈移位寄存器 | 信息安全|密码学 | 西安电子科技大学考研 | 期末速成_哔哩哔哩_bilibili
这里的滑动密钥生成器就是现在要讲的反馈移位寄存器和线性反馈移位寄存器。而这两种寄存器的作用就是生成密钥。
反馈移位寄存器
运作流程是:在最左边插入由f函数计算出的值,输出最右边的值,然后整体向右移动一位;如此循环下去。
线性反馈移位寄存器LFSR
反馈函数f是a1,a2…的线性函数,即不存在a1*a2这种。
特点:
- LFSR的结构非常适合硬件实现;
- LFSR的结构便于使用代数方法进行理论分析;
- 产生的序列的周期可以很大;
- 产生的序列具有良好的统计特性。
一个n级LFSR序列的周期最大只能为,要达到最大周期序列,要确保其联接多项式不可约(就是不能再被因式分解)
m序列:n级最大的线性移位寄存器周期序列.
n如果一个n级LFSR产生了m序列,则该LFSR的状态转移图仅由2个圈构成,其中一个是由全零状态构成的长度为1的圈,另一个是由全部其余2^n-1个状态构成的长度为2^n-1的圈。
伪随机序列
随机序列
每次试验的结果与以前各次试验不发生任何关系,因此这种序列是独立试验的结果
性质:
- 1出现的次数与-1出现次数近乎相等。用概率论的语言来说就是1与-1出现的概率是相等的,都是0.5
- 联在一起的1的一段,它的两端都是-1,叫做1的游程 ,其中1的个数叫做游程的长度。类似地,能够定义-1的游程。类似可以定义长度为k的游程
线性复杂度 :能够输出该序列的最短线性移位寄存器的级数
例如,给定序列011 011……,联接多项式为的LFSR可以生成该序列,联接多项式为的LFSR也可以生成该序列。但联接多项式为x+1的LFSR则无法做到这一点,所以,该序列的线性复杂度为2
安全的密钥流应该满足这样三个基本条件:周期充分长;随机统计特性好(即基本满足Golomb的随机性公设);大的线性复杂度。
基于LFSR的伪随机序列生成器
滤波生成器
相当于我输出不再像原来那样只输出末位,而是再搞一个函数g
组合生成器
相当于把每个LFSR的末尾输出拿出来全部塞到函数f里面去再输出。
钟控生成器
交错停走式生成器
A5算法
RC4算法
RC4加密算法| 流密码| 对称密码| 密码学 | 信息安全_哔哩哔哩_bilibili
RC4密钥长度可变,以足够大的表S为基础,对表进行非线性变换来产生密钥流。
加密过程
S表初始化
-
对S表进行256字节的线性填充,即S[0]=0,S[1]=1,…,S[255]=255这样子
-
用种子密钥填充K表(也是256字节),如果种子密钥长度不够,就循环使用,直到填满K表为止。比如种子密钥是4,5,6,那K表就是4,5,6,4,5,6…
-
用K表对S表进行初始置换
密钥流生成
公钥密码
几个概念
对称密码的缺陷:
- 密钥分配问题:双方要共享密钥,其中使用的安全信道很难实现
- 密钥管理问题:任何两个用户之间都要有共享的密钥,当用户数量很大时,需要管理的密钥数量也很大
- 没有签名功能:当主体A收到主体B的电子文档时,无法向第三方证明此电子文档确实来源于B
公钥密码:
-
包括两个密钥,加密或验证签名者不能解密或生成签名:
- 公钥:可以被任何人知道,用于加密或验证签名
- 私钥:只能被消息的接收者或签名者知道,用于解密或签名
-
由私钥及其他密码信息容易计算出公钥,由公钥及算法描述难计算出私钥
-
安全性基于一些已知的困难问题,如:大整数分解、离散对数问题
-
加密速度比对称算法慢
公钥算法分类
- 密钥分配 Public-Key Distribution Schemes (PKDS)
- 用于交换秘密信息(依赖于双方主体)
- 常用于对称加密算法的密钥
- 公钥加密算法 Public Key Encryption (PKE)
- 用于加密任何消息
- 任何人可以用公钥加密消息
- 私钥的拥有者可以解密消息
- 任何公钥加密方案能够用于密钥分配方案PKDS
- 许多公钥加密方案也是数字签名方案
- 数字签名 Signature Schemes
- 用于生成对某消息的数字签名
- 私钥的拥有者生成数字签名
- 任何人可以用公钥验证签名
公钥的安全性:
- 依赖于足够大的困难性差别
- 类似与对称算法,穷搜索在理论上是能够破解公钥密码
- 一般情况下,有一些已知的困难问题(大整数分解、离散对数问题)
- 要求足够大的密钥长度 (>512 bits)
- 导致加密速度比对称算法慢
Diffie-Hellman 密钥交换协议
Diffie-Hellman密钥交换算法| 公钥加密| DH算法| 密码学| 信息安全_哔哩哔哩_bilibili
- 不能用于交换任意消息
- 可以建立共享密钥,这依赖于双方的公、私钥值
- 基于有限域上的指数问题,安全性基于计算离散对数的困难性
RSA公钥密码体制
【RSA加密算法】| RSA加密过程详解 | 公钥加密| 密码学| 信息安全|_哔哩哔哩_bilibili
数学不好也能听懂的算法 - RSA加密和解密原理和过程_哔哩哔哩_bilibili
使用最广泛的公钥加密算法,基于大整数分解构建
公私钥如何生成
如果要破解私钥,就是要破解这里的E值。E值来源于T值,而T值来源于p、q的取值。事实上我们只知道N的取值(因为N是公钥中的一个参数),然后由N去推出p、q的过程就涉及到大整数分解,这个地方是RSA加密的数学基础。
加解密过程
加密
记公钥E=(e,N),待加密字符的十进制值为M(明文),则加密后的密文为
解密
记私钥D=(d,N),待解密字符的十进制值为C(密文),则解密后
攻击与对抗方法
共模攻击
只需要两个公钥,不需要私钥就能恢复明文。若很多人共用同一模数n,各自选择不同的e和d,这样实现不安全。若消息以两个不同的密钥加密,在共用同一个模下,若两个密钥互素(一般如此),则可用任一密钥恢复明文。
显然为了对抗这种攻击,不同的用户应该使用不同的模数 N,或者至少确保公钥不互素。
低加密指数攻击
使用相同较小的e(e=3)时会发生。
当然这里的e不一定取3,只要是一个娇小的值就行。因此,为抗击这种攻击e必须选得足够大(EDI国际标准规定)。
Rabin公钥密码体制
【密码学】RSA算法和Rabin密码体制_哔哩哔哩_bilibili
基于二次剩余困难问题:
密钥生成
加密过程
解密过程
举例
EI Gamal公钥密码体制
基于离散对数问题构建
公私钥怎么生成
欧拉函数:,小于p的数里面,与p互质的数的个数。
公钥:(p,g,g1)
私钥:随机数
那么,其他人知道这个公钥,有没有办法推出私钥呢?这个就是离散对数难题,在这里确保EI Gamal的安全性。
加密过程
这个(c1,c2)即密文。采用这个方法能使得相同的信息加密出不同的结果(因为选择的随机数不同)
解密过程
消息认证与哈希
几个概念
防止主动攻击的重要技术,对开发系统安全性有重要作用
认证的主要目的
- 实体认证(发送者非冒充)
- 消息认证(验证信息的完整性)
网络环境中的攻击(认证的需求)
- 泄漏
- 通信量分析
- 伪装(假消息)
- 内容篡改(插入,删除,调换和修改)
- 序号篡改(消息序号的修改)
- 计时篡改(消息延迟或回放)
- 抵赖(否认收或发某消息)
- 1,2加密, 3~6消息认证, 7数字签名(3~6)
认证不能自动提供保密性,而保密性也不能自然提供认证功能。
三类产生认证符的函数
- 消息加密
以整个消息的密文为认证符号; - 消息认证码(MAC)
消息、密钥的公开函数,产生一个定长值作为认证符; - 哈希函数(哈希函数)
一个将任意长度的消息映射为定长的哈希(hash)值的公开函数,以hash值作为认证符;
下面就分别叙述一下这三种函数;
消息加密
消息加密有两种:常规(对称)加密、公钥加密
常规(对称)加密
用户A为发送方,用户B为接收方。B收到信息后,通过解密来判决信息是否来自A,信息是否是完整的,有无窜扰。
提供保密(仅A和B共享密钥K),提供一定程度的认证,不提供签名(发送者可以否认消息)
公钥加密
这个有两种玩法:
-
发送方用接收方的公钥加密消息,接收方用私钥解密(与对称密钥加密原理相同,需要某种特定消息结构)。这种玩法提供保密(仅B能解密),不提供认证(公钥公开,任何人都能加密)
-
发送方先用自己的密钥加密以提供认证,然后使用接收方公钥加密提供保密性.缺点是效率不高。这种玩法可提供保密,也可提供认证和签名
消息认证码(MAC)
【HMAC | MAC | 基于哈希函数的消息认证码| 消息认证码 |HMAC-MD5| 信息安全】_哔哩哔哩_bilibili
消息认证码是用来确认消息完整性并进行认证的技术。
在这里的完整性是看收发双方的MAC码是否一致(就是我收到的MAC和我算出的MAC是一样的),而认证则是因为只有知道共享密钥的人才能计算出正确的MAC码。如果都ok,确认消息未被更改;确信消息来自所谓的发送者;如果消息包含序号,可确信该序号的正确性**;**
为什么使用消息认证(而不是用常规加密)
- 适用于消息广播;
- 消息加密解密的工作量比较大;
- 某些应用不关心消息的保密而只关心消息的真实性;
- 认证函数与保密函数的分离能提供结构上的灵活性(认证与保密可在网络协议的不同层次进行).
- 认证码可延长消息的保护期限,同时能处理消息内容(使用加密,当消息解密后,保护就失效了).
MAC函数应有如下性质(攻击者没有K)
- 有M和Ck(M),试图生成M’, 使得Ck(M’)= Ck(M), 这在计算上不可行;
- Ck(M)应能均匀分布;对于随机选取的消息M和M’, Ck(M)= Ck(M’)的概率为2^−n,其中n为MAC的比特长度;(抗选择明文攻击)
- 消息M’为M的某种已知代换,即M’=f(M),则Ck(M)= Ck(M’)的概率为2^−n.(防碰撞)
哈希函数
输入可任意长,但是输出为固定长度。
已知x求H(x)是可行的,但是反过来在计算上是不可行的。(单向性)
抗碰撞性:不同的输入很难产生相同的哈希值。
-
任意给定分组x, 寻求不等于x的y, 使得H(y)= H(x)在计算上不可行(弱抗碰撞性);
-
寻求对任何的(x,y)对使得H(x)=H(y)在计算上不可行(强抗碰撞性);
下面介绍两个安全的哈希算法。
MD5
【MD5算法 | 消息认证 | 哈希函数 | 密码学 | 953考研 | 西安电子科技大学】 【精准空降到 03:16】
输入任意长度报文,输出128比特的摘要;输入分组长度为512比特
基本流程
这里仍然是把报文分成512bit一组,当然不够512bit就要补,这个补位的方法和SHA-1一致
这里注意MD5在填充消息长度时采用的是小端序,而SHA-1采用的是大端序。
初始化MD缓存
循环步骤
大致流程仍然与SHA-1一致
对于每个分组完的512bit,都要这样子循环一次,更新ABCD值。轮到下一个512bit时,abcd的初始值就变成刚刚更新过的ABCD了
对于这个循环函数:
-
F值、M[g]:对于不同的i(i是第几次循环),有不同的公式计算
-
K[i]:来自常量表,i是谁就取谁
-
S[i]:来自位移表
MD4和MD5的区别
MD4的设计目标:
- 安全性:寻找两个具有相同消息摘要的消息计算不可行
- 速度:32位体系结构下计算速度快.
- 简明与紧凑:易于编程.
- 有利的小数在前的结构(Intel 80xxx, Pentium )
MD4与MD5的区别:
- MD4用3轮,每轮16 步,MD5用4轮,每轮16步.
- MD4中第一轮没有常量加;MD5中64步每一步用了一个不同的常量 T[i];
- MD5用了四个基本逻辑函数,每轮一个;MD4用了三个.
- MD5每轮加上前一步的结果;MD4没有.(雪崩效应)
SHA-1
【SHA1算法】| 哈希算法 | Hash算法 | 密码学 | 信息安全| 消息摘要_哔哩哔哩_bilibili
输入输出情况
基本流程
先把原消息进行补位,把位数补成512bit的倍数。然后把消息512bit一分,每个512bit经过80轮循环运算生成160bit的摘要,然后这160bit还会参与到下一个160bit的运算中去。
补位怎么补
每个512bit怎么运算
512=16*32bit,记为M[0],M[1]…M[15]
而我们需要把这个扩充到80份,即80*32bit,记为W[0],W[1],…,W[79]
这里的是指把异或结果循环左移1位。
然后就正式进入循环,最后的结果是160bit的数据,这些数据存放在5个32bit的参数中,如下图这几个是其初始参数。而我们的循环就是要改这5个值,最后的160bit就是由这5个值构成。
将abcde(缓冲区链接变量)分别赋值为上面的5个初始参数,就是a=H0这样子。然后就开始跑80轮循环(也认为是4个循环,每个循环有20次操作):
这里的几个不明白的计算符号:
-
ft(b,c,d):ft函数,输入b、c、d
-
Kt:固定参数,随t而变,见上
-
Wt:就是上面扩展到80个的W[0],W[1],…,W[79]这些
跑完这80轮循环过后,我们就得到了全新的abcde。再把这个abcde分别加到刚才的H0,H1,…H5上面去,形成新的H0,H1,…H5,(当然这里加完以后可能要进位,这里的加法还需要对取模,把进位那个1丢掉就行)即下图:
最后,如果说我们的数据就512bit(或者更小),那跑一轮的80循环得到的H0,H1,…H5就是SHA-1加密结果。当然数据更多的话,就把新的H0,H1,…H5再作为初始值,再让abcde初始化一下,再来几个80循环就老实了
我们仨
对哈希函数的攻击
哈希函数的安全性
- 很大程度上取决于抗强碰撞的能力,即攻击者找出两个信息MM,使得HM)=H(M”)。
- 评价一个哈希函数的安全性,就是看攻击者在现有的条件下,是否可以找到该函数的一对碰撞。
- 对哈希函数攻击的方法包括生日攻击、差分攻击等。
生日攻击
假如随机选择n个人,那么这个n个人中有两个人的生日相同的概率是多少。如果要想概率是100%,那么只需要选择367个人就够了。因为只有366个生日日期(包括2月29日)。
如果想要概率达到99.9% ,那么只需要70个人就够了。50%的概率只需要23个人。
假设有一个函数f,它的输出范围是H,那么我们的攻击就是找到两个不同的x,y,让f(x)=f(y)。这时候,我们可以称x和y发生了碰撞。
根据概率论的公式,我们想要达到50%的几率,那么需要尝试的次数是:
怎么抵御这种攻击呢?根据我们生日攻击的公式,当然是将签名方案使用的哈希函数的输出长度选择得足够大,以使生日攻击在计算上变得不可行。
差分攻击
数字签名
几个概念
- 数字签名可以提供消息的不可否认性,
- 通常不对整个消息签名,因为这将会使交换信息长度增加一倍
- 使用消息的 hash 值
公钥签名方案:
- 利用私钥生成签名
- 利用公钥验证签名
- 只有私钥的拥有者才能生成签名
- 所以能够用于证明谁生成的消息
- 任何知道公钥的人可以验证消息
数字签名算法应该:
- 签名结果依赖于被签名信息的每一比特
- 算法必须依赖于签名者的特有信息
- 生成签名的算法须非常简单
- 签名验证算法须非常简单
- 伪造一个签名或给定签名构造一个新的信息,在计算上是困难的
- 易于保留签名的副本
数字签名算法包含
- 消息空间:需要签名的所有消息的集合
- 签名空间:所有可能的签名结果
- 密钥空间:签名与验证需要的所有可能的私钥/公钥对集合
- 密钥生成算法:有效生成用于签名和验证的私钥/公钥对
- 签名算法:有效生成对信息的签名
- 验证算法:输入签名消息、签名以及公钥,可有效验证签名的真伪
算法分类
- 基于大整数分解的签名体制
- RSA数字签名体制
- Rabin签名体制
- 基于离散对数问题的签名体制
- ElGamal签名体制
- Schnorr签名体制
- DSA算法
- 基于哈希函数的数字签名
RSA签名体制
RSA 加密解密是可交换的
公私钥生成
生成方法和RSA公钥密码一样:
公钥(e,N)私钥(d,N)
签名算法
给定消息m,我拿着私钥去加密:
验证算法
如果m’=m,验证通过,否则验证不通过.
EI Gamal签名体制
ElGamal 加密算法是不可交换的
公私钥生成
生成方法和EI Gamal公钥密码一样:
公钥:(p,g,g1)私钥:
签名过程
待签名消息M。选择随机数k,且k和p-1互质。
计算参数r:
计算参数s:
注意
例如,如果k=5,p-1=18,因为5*11=55,而55mod18=1,所以k^-1=11。
这里的认为是安全的Hash函数,一般H(M)=M
则对消息M的数字签名为(r,s)
验签算法
验签人收到消息M和签名(r,s),先计算(一般H(M)=M)
然后验证下面的等式是否成立:
成立签名有效,不成立就无效
DSA签名机制
公私钥生成
DSA 是 ElGamal 及Schnorr algorithms 的变形,生成 320 bit 签名,安全性是基于离散对数。
- p:一个素模数,其值满足:,其中L是64的倍数,且满足512≤ L ≤ 1024
- q:(p-1)的素因子,其值满足,即q长度为160位。
- g:g = powm(h,(p-1)/q,p)。h为满足1 < h < p-1 的任意整数,从而有powm(h,(p-1)/q,p) > 1
- x:私钥。x为一个随机或伪随机生成的整数,其值满足 0 < x < q。
- y:公钥。y = powm(g,x,p)
这里的
签名算法
- 产生一个随机数k,其值满足 0 < k < q
- 计算r = powm(g,k,p) mod q,其值满足 r > 0
- 计算 s = (k^(-1)(SHA(M) + x * r)) mod q,其值满足 s > 0
SHA(M): M 的 hash 值,M为待签名的明文。SHA 是一个单向散列函数。DSS中选用SHA1算法,此时SHA(M) 为160 bits长的数字串,其满足不可逆和抗碰撞性。
最终的签名就是证书对(r, s),它们和 M 一起发送到验证方。
尽管 r 和 s 为 0 的概率相当小,但只要有任何一个为 0 ,必须重新生成 k,并重新计算 r 和 s 。
验签过程
验证签名, 计算:
- w = s^(-1)(mod q)
- u1= (SHA(M)*w)(mod q)
- u2= r*w(mod q)
- v =
v=r 签名有效
带密钥的哈希函数
先前的签名方法
- 都是公钥技术
- 计算与数据量较大
- 需要私钥的认证方案
使用快速的哈希函数用于保证数据的完整性
- 密钥与消息同时参加运算KeyedHash =Hash(Key||Message)
- 有一些弱点,易受碰撞攻击
- 随后建议:KeyedHash = Hash(Key1|| Hash(Key2)||Message))
HMAC
- HMAC是使用带密钥的HASH函数的结果
具体形式如下:
Hash((K+XORopad)||Hash((K+XORipad)||M))Hash((K+XORopad)||Hash((K+XORipad)||M))
- K+是经过填充的密钥,长度为b
- opad,ipad特殊的填充值为,opad=01011010重复b/8次,ipad=00110110重复b/8次
- 安全性是基于原来的HASH函数的安全性
信息隐藏与隐写分析
多媒体安全
四种一般类型的攻击
-
中断: 系统资源被破坏或变得不可使用, 对可用性的攻击;就是我拿不到消息了。
-
截获: 未授权方获取了对某个资源的访问, 对机密性的攻击; 就是我的消息被第三者拿到了
-
篡改: 未授权方不仅获得访问, 而且篡改某些数据, 对完整性的攻击;就是第三方拿到我的数据后,还改了我的数据。
-
伪造: 未授权方将伪造的对象插入系统, 对真实性的攻击;就是实际上没人发信息,但是第三者伪造了一个信息发过去
多媒体信息安全的要素
-
机密性: 信息不泄漏给非授权的个人和实体, 或供其利用的特性;
-
完整性: 信息在存储或传输过程中保持不被修改、 不被破坏、 不被插入、 不延迟、 不乱序和不丢失的特性;
-
可用性: 信息可被合法用户访问并按要求使用的特性, 指当需要时可以取用所需信息;
-
真实性: 防止未授权方对信息的篡改和伪造;
-
不可抵赖性: 防止发送方或接收方抵赖所传输的消息;
什么是信息隐藏技术
它是利用人类感觉器官对数字信号的感觉冗余, 将一个消息(秘密信息)隐藏在另一个消息(非秘密信息)之中, 实现隐蔽通信或隐蔽标识。它隐藏了秘密信息的存在(与传统的密码技术有明显的区别), 表面上看起来与一般的非保密信息没有两样, 因而十分容易跳过攻击者的破解。
加密技术是最常见的数字产品保护技术, 但只保护传输过程, 对解密后的产品无法保护。
隐蔽信道
在多级安全水平的系统环境中(比如军事计算机系统),那些既不是专门设计的也不打算用来传输信息的通信路径称为隐蔽信道。
匿名通信
匿名通信就是寻找各种途径来隐藏通信消息的主体,即消息的发送者和接收者。Web应用强调接收者的匿名性,而电子邮件用户们更关心发送者的匿名性。
数字隐写
在不引起任何怀疑的情况下秘密传送消息 。
需求:不被检测,大容量
数字水印
嵌入载体相关信息,目的是进行版权保护、所有权证明、盗版源追踪、完整性保护
要求:鲁棒性,不可感知性。
信息隐藏的分类
按对象分
按可见性分
按鲁棒性分
-
鲁棒水印 (Robust Watermark)
对所有攻击鲁棒,主要应用于认证,版权保护;
-
半易碎水印 (Semi-Fragile Watermark)
对一些攻击鲁棒;
-
易碎水印 (Fragile Watermark)
对恶意改动敏感,主要应用于完整性判定;
按密钥分
- 私钥水印 (Secret Key):水印嵌入和检测用同一密钥;
- 公钥水印 (Public Key):水印嵌入和检测用不同密钥;
按检测需不需要原始数据
- 私有水印 (Private Watermark):检测时需要原始数据;
- 盲水印 (Blind Watermark):检测时不需要原始数据;
按能不能恢复分
信息隐藏的过程
水印生成
-
有意义的水印:例如版权信息,有用信息等。
-
无意义水印:例如任意随机序列。要求:类似噪声,具有不可预测的随机性 。
水印嵌入
嵌入域选择:
- 空域(例如,最低有效位 LSB):
- 空域信息隐藏技术直接在媒体数据的像素值上进行操作,通过修改像素值来隐藏信息。
- 最低有效位(LSB)技术是空域中常用的一种方法,它通过改变像素值的最低有效位来嵌入秘密信息,因为人眼对最低有效位的变化不敏感,所以这种方法具有较好的隐蔽性。
- 变换域(例如,离散傅里叶变换 DFT):
- 变换域信息隐藏技术则是基于对媒体数据进行数学变换,如离散傅里叶变换(DFT)、离散余弦变换(DCT)或离散小波变换(DWT)等,然后在变换后的系数上进行信息的嵌入。
- 变换域方法通常利用人类视觉或听觉系统对某些变换系数不敏感的特性,将信息嵌入到这些系数中,以达到隐藏信息的目的。
- 这种方法的优点是鲁棒性较好,因为变换后的系数对原始媒体数据的小幅度修改不敏感,但计算复杂度相对较高。
嵌入方法:
原始多媒体X0(k),嵌入强度α(k),水印信息ω(k)
水印检测
接收端无法收到没有嵌入水印的信息
水印攻击
正在使用的信息隐藏技术
**图像信息隐藏算法 **
空域信息隐藏算法
空域:直接修改像素值实现隐藏信息嵌入
优点:简单、快速、容量大、对载体图像质量影响小
缺点:鲁棒性差
空域算法的弊端:
- 把信息隐藏在载体的最不重要部分,容易被噪声掩盖,有损压缩后丢失
- 能否隐藏在载体的最重要部分?
- 信息隐藏在载体的最重要部分,则只要载体不被破坏到无法使用的程度,隐藏的信息都能保留。
频域水印算法
- 在频域: 通过修改频域空间的系数实现水印嵌入
- 常用变换域方法:
- 离散傅里叶变换(DFT)
- 离散余弦变换(DCT)
- 离散小波变换(DWT)
- 优点:鲁棒性好
- 缺点:复杂度高
可见水印(Visible Watermark)
应用:
- 数字电视
- 数字图书馆
- 电子商务
隐写分析技术
隐写(信息隐藏)(steganography) :以表面正常的数字载体如静止图象、 数字音频和视频信号等作为掩护,在其中隐藏秘密信息额外数据的嵌入既不改变载体信号的视、 听觉效果, 也不改变计算机文件的大小和格式(包括文件头) , 使隐蔽信息能以不为人知的方式进行传输。
隐写分析(steganalysis) :对多媒体信号进行统计分析, 判断其中是否含有隐蔽信息。
根据达到的效果隐秘分析技术分为三类
- 破坏技术
- 通过对载体对象无意或有意的攻击处理去除和破坏隐藏信息
- 检测技术
- 判断是否存在隐藏信息
- 提取技术
- 部分或完整提取出隐藏的信息内容
隐写分析算法的衡量标准
- 准确性:辨别隐藏信息的准确程度(检测率、虚警率、报率)
- 适用性:对不同隐写术的有效性
- 实用性:可实际推广应用的程度
- 复杂性:对计算所需的时间和内存空间的需求
隐写术和数字水印技术的区别何在?
隐写术和数字水印技术都是信息隐藏技术,主要用来保护信息的安全性和版权,但它们在目的、实现方式和应用场景上存在一些明显的区别。
- 目的:
- 隐写术:隐写术的主要目的是将信息隐秘地嵌入到载体中(如图片、音频、视频等)以达到隐蔽传递信息的效果。隐写信息的存在通常是为了隐藏消息,使其在不被察觉的情况下传送。
- 数字水印技术:数字水印的目的在于标识和保护版权。水印通常是一个可以被识别的信息,它的存在是为了证明某个内容的所有权或进行版权保护,大多情况下,水印是可见或不可见的,但其存在意图是让接收者知道内容的归属。
- 实现方式:
- 隐写术:隐写术通过修改载体的一部分数据(如改变图片中的像素值)来嵌入秘密信息,其修改通常非常微小,以至于不影响载体的外观或使用性。
- 数字水印技术:数字水印同样改动载体数据,但这些修改旨在使得信息的存在能够在一定条件下被检测到,且一般不会破坏内容的可用性。水印信息通常更加显眼或可被检索。
- 应用场景:
- 隐写术:隐写术常用于军事、情报、秘密通信等领域,目的是在不被察觉的情况下传递敏感信息。
- 数字水印技术:数字水印技术通常用于数字版权管理、内容保护、认证、验证等领域,特别是在音乐、视频、图像等数字媒体中,旨在保护创作者的权益。
为了安全地将数据从A公司里的Alice传送到B公司里的Bob,可以采用以下步骤:
- 使用加密技术:
- Alice可以使用对称加密(如AES)或非对称加密(如RSA)对数据进行加密。对于大量数据,对称加密更为高效。
- 生成密钥:
- 如果使用对称加密,Alice需要生成一个随机的加密密钥,并使用Bob的公钥(如果使用非对称加密)对这个密钥进行加密。
- 如果使用非对称加密,直接使用Bob的公钥加密数据。
- 数据传输:
- Alice将加密后的数据和加密后的密钥(如使用非对称加密)通过电子邮件、文件传输协议(FTP)或安全的云存储进行发送。
- 确认身份:
- 为了确保数据接收方确实是Bob,Alice可以使用数字签名(如SHA-256加上RSA签名)对数据进行签名,让Bob在收到数据后核实身份。
- Bob解密数据:
- Bob收到数据后,首先使用自己的私钥解密密钥(如果使用了非对称加密),然后使用解密后的密钥解密数据。
- 传输协议选择:
- Alice和Bob可以选择使用安全的传输协议,如HTTPS、SFTP或TLS,来确保数据传输过程中的安全性和完整性。
通过以上步骤,Alice可以有效地保护数据的安全性和隐私,确保数据安全地发送给Bob。