【网络安全】对称加密和消息机密性(对称加密原理 、对称分组加密算法 、DES、随机数和伪随机数 、流密码和RC4、分组密码工作模式)

对称加密原理

对称加密

  • 也叫常规加密/ 私钥加密/ 单钥加密
  • 发送方和接收方共享同一密钥(如果不是的话,就是非对称加密/公钥加密)
  • 所有的古典加密算法(比如凯撒密码等,都是低价的加密算法,不安全)都是基于私钥加密
  • 在1970年公钥加密(一把密钥是公开的,一把密钥是私有的)出现之前,是唯一被使用的加密类型
  • 仍然属于最广泛使用的两种加密类型之一

一些基本的术语

  • 明文– 原始消息
  • 密文– 编码后消息
  • 密码– 将明文转变成密文的算法
  • 密钥– 在密码中只有发送方和接收方使用的秘密信息
  • 加密器(加密) – 将明文转换成密文
  • 解密器(解密) – 将密文转换成明文
  • 密码编码学 ( Cryptography ) – 学习加密原理/方法 (本门课的重点)
  • 密码分析学 (Cryptanalysis) – 学习在不知密钥的情况下解密密文的原理和方法(偏理论研究)
  • 密码学(Cryptology) – 包含密码编码和密码分析学

对称加密模型

可以理解为A和B之间的快递传输,为了保证传输安全,A提前将保险箱的钥匙寄给B,后面A寄文件的时候,就将文件锁在保险箱里再寄给B,这样在传输的过程中,诸如快递小哥等人因为没有钥匙,就打不开保险箱,偷看不了文件;而B收到快递后,因为提前有了钥匙,就可以打开保险箱看到文件了。

网络上的通讯就像传输快递,密钥就相当于钥匙,加密算法就相当于保险箱。

 

在这里插入图片描述

 

所以,从上述模型可以看出,对称密码的安全使用有以下两个要求:

  • 一个强加密算法(保证加密算法的安全性)
  • 只有发送发和接收方知道私钥(私钥不能被攻击者知道)

数学上表示,Y是密文,X是明文,K是私钥,则:

  • Y = E(K, X) //E是加密算法:
  • X = D(K, Y) // D是解密算法

需要注意的是,现代加密算法是公开的,有标准的,不需保密。但是有一个安全通道去分发密钥,所以即使知道加密算法,但不知道密钥,也可以破解不了通讯。所以,对称加密的安全取决于密钥的保密性而非算法的保密性

那么既然有安全通道可以分发密钥,为什么不直接使用安全通道分发消息呢?主要是因为成本高、效率低。,同时密钥一次分发,可多次使用。

密码体制

密码体制一般从以下3个方面进行分类:

  • 1、明文转换成密文的操作类型
    • 替换 – 明文的每一个元素(比特、字母、一组比特或字母)都映射到另外一个元素
    • 换位 – 明文的元素都被再排列
    • 乘积 – 包括了多级替换和换位组合
  • 2、使用的密钥数
    • 对称/单钥/传统加密 – 发送者和接收者都使用同一密钥
    • 不对称/双钥/公钥加密 – 发送者和接收者使用不同的密钥
  • 3、明文的处理方式
    • 分组密码 – 一次处理一个输入元素分组,产生与该输入分组对应的一个输出分组
    • 流密码 – 在运行过程中连续地处理输入元素,每次产生一个输出元素

密码分析

试图找出明文或者密钥的工作被称为密码分析或破译。目的在于恢复密钥而不仅仅是消息,有一个攻击成功之后,所有加密消息将被破解。一般有两种方法:

  • 密码分析攻击
  • 穷举搜索攻击

密码分析攻击

对称加密消息的攻击类型如下表所示:

所有攻击类型都是已知加密算法的。除了最基本的加密算法和要解密的密文,

  • 唯密文,其他信息都没有;
  • 已知明文,还知道一个或多个明文-密文对样本,这里的样本是破译者不能选择的
  • 选择明文,破译者可以选定明文信息,并得到其对应的密文
  • 选择密文,破译者可以选定密文信息,并得到其对应的明文
  • 选择文本,破译者既有选择明文,又有选择密文。

表中从上往下,破译者已知的信息越来越多,也越来越容易成功。

需要注意的是,是最容易成功的攻击是选择文本攻击;最容易实施的攻击是唯密文攻击。

 

在这里插入图片描述

 

穷举搜索攻击

  • 总是简单地尝试每一个密钥
  • 最基本的攻击, 跟密钥大小成正比
  • 假设明文可以理解
  • 一定可以成功,只是时间问题。

 

在这里插入图片描述

 

Feistel 密码结构

对于很多对称分组加密算法(包括 DES),其结构由 IBM 的 Horst Feistel 在 1973 年首次详细描述基于可逆乘积密码的概念,如下图所示,主要包括以下步骤:

  • 将明文分组分成两半
  • 经过多轮处理
  • 在左半部分采用替换
  • 基于子密钥,对右半部边数据应用轮函数(F函数)
  • 接着两部分数据进行对换

 

 

Feistel 密码设计要素

  • 分组大小:越大的分组越安全,但减小了加密/解密速率
  • 密钥大小 :越长的密钥越安全
  • 迭代轮数:越多轮越安全。经典是16轮
  • 子密钥生成算法:越复杂越难破解
  • 论函数:越复杂越难破解
  • 快速软件加密/解密:嵌入式实现,要求快速执行速度
  • 容易分析:如果算法能被简明清楚地解释,则容易分析该算法的弱点并因此给出对其强度更高级别的保障。例如,DES 不具有容易分析的性质

对称分组加密算法

数据加密标准 (DES)

这里仅对DES做一些基本介绍,详细DES算法实现可以查看我的另一篇文章:
【网络安全】数据加密标准(DES算法)详细介绍( 分组密码、Feistel密码结构、轮函数、子密钥生成算法)

【DES是什么】

  • DES是世界上广泛使用的分组密码,在1977被NBS (现在是NIST)使用,采用 56-bit 密钥,加密 64-bit 数据。
  • 虽然DES 标准是公开的(只需要密钥保密就可以了)
  • 越来越多的应用采用DES(特别是在金融领域)
  • 在设计方面的安全性具有具有的争议,涉及到DES的安全强度

DES的安全强度

对DES强度的分析可以分解为两部分:

  • 对算法本身的分析:指得是通过研究DES算法的性质而找到破译算法的可能性。DES是现存加密算法中被研究得最彻底的一个,至今没有成功找到DES的致命缺陷。
  • 对使用56-bit密钥的分析:计算速度的提升使得56-bit密钥的使用变得不安全,在有限时间内使用超算技术可以穷举搜索56-bit密钥的所有组合。

但是在当前的技术下,不需要使用特殊的专用硬件即可破解 DES(存在穷举搜索密钥攻击的可能性)。所以需要对DES进行替换。

AES 是一个新的密码选择。但在这个选择之前,采用的是对DES进行多重加密的方法:也就是我们接下来要讲的:Triple-DES(三重DES)

三重DES

【双重DES】

双重DES意思是:能够在每个块上使用两个DES加密 C = E_{K2}(E_{K1}(P)) ,也就是先使用K1对明文P进行加密,再使用K2加密第二次。

所以解密的过程就是 P = D_{K1}(D_{K2}(C) ,表示先用K2进行解密,再用K1进行解密。(注意密钥的使用顺序)

但是双重DES存在很大问题:

  • 存在着退化成单个加密的问题,
  • 存在“中途相遇”攻击的问题这里我介绍一下什么是“中途相遇”攻击,很有意思的问题。

我们知道,DES一共有64bit密钥,其中56bit是需要我们手动设置的,剩下8位为奇偶校验位,因此暴力破解的话最坏情况下需要2^{56}。那如果使用二重DES的话,那么需要设置的密钥为112bit(2*56bit),暴力破解需要计算的次数为2^{112}次吗?

其实不是的,因为存在一个中间状态X=E_{K1}(P)=D_{K2}(C)(参考上面加密和解密的公式),所以通过采用所有密钥加密P并储存密文。接着采用所有密钥解密C,并与X进行对比只,需要 O(2^{56})步骤。

所以双重DES存在中途相遇的问题,也不安全。


【三重DES】

因此,必须使用3重加密,也就是需要3个不同密钥。

但也可以在E-D-E序列下使用2个密钥: C = E_{K1}(D_{K2}(E_{K1}(P))),那么解密的过程也就是: P=D_{K1}(E_{K2}(D_{K1}(C)))

在安全上加密和解密是等效的,当K1=K2,相当于单个DES(这样就可以兼容一些比较老的程序,他们还只能用单DES)

这种方式在ANSI X9.17 & ISO8732 标准化了,且至今没有已知的实际攻击。

虽然对两个密钥的三重DES没有实际的攻击,但是有一些迹象表明其可能性。

所以能够采用三个密钥的三重DES去避免这些攻击 C = E_{K3}(D_{K2}(E_{K1}(P))),那么解密的过程也就是: P=D_{K1}(E_{K2}(D_{K3}(C)))。(要推出P=P)

 

 

在一些互联网应用中已有采用如:

  • PGP (完美隐私,加密套件)
  • S/MIME(多用途网际邮件扩充协议)

高级加密标准(AES)

通过上面分析,我们知道DES迟早会被替换(存在理论攻击能攻破它,且已经表明遭受穷举搜索攻击),即使能够使用三重DES ,但是也存在速度慢,小分组的问题。

关于AES的历史:US NIST 在1997年公开征集新的高级加密标准,在1998年6月接受15个候选算法,1999年8月缩减到5个 ,在2000年10月,NIST选择了Rijndael 作为AES 算法。并且在2001年11月,NIST发布了FIPS PUB 197 标准。

AES由 Rijmen-Daemen 在比利时设计,有128/192/256 bit 密钥, 来加密128 bit 消息。(对比DES用64bit密钥加密64bit)

AES是一个迭代算法(但不是 feistel 密码,AES没有继承),以4列(每列4字节)为分组进行处理,在一轮处理整个数据分组。所以具有以下优点:

  • 能抵抗已知攻击
  • 在很多CPUs上运行速度快和代码简洁
  • 设计简单

关于AES的详细介绍可以参考这篇文章:AES加密算法的详细介绍与实现

随机数和伪随机数

随机数的应用

在密码学中,有很多算法需要使用随机数,比如

  • 防止重放的身份认证协议中使用的临时标签
  • 会话密钥(临时对话中使用)
  • 公钥产生(RSA)
  • 一次一密的密钥流(对称流密码的密钥流生成)

真正的随机数具有以下特点:

  • 统计意义上随机, 平均分布,独立
  • 不可预测性

接下来我们真正需要关心的是生成的随机数。

真随机数发生器、伪随机数生成器和伪随机函数

【伪随机数生成器 (PRNGs)】

经常使用确定性算法去生成“随机数”,虽然不是真正地随机,但是能通过很多“随机性”测试,这被认为是 “伪随机数”,可以从 “伪随机数生成器” 产生。

下图将一个真随机数发生器(TRNG)和两个伪随机数发生器进行了对比。生活中的真正随机数其实是很少的,比如摇骰子。

需要注意的是伪随机数是需要有一个种子的。比如很多语言如python都有生成伪随机数的函数,这里面的种子可能是系统时间之类的,总之就是也是有所根据的。

 

 

  • 伪随机数发生器:一种用来生产一个开路型比特流的算法被称为 PRNG。
  • 伪随机函数(PRF): PRF 被用来产生一些固定长度的伪随机比特串。例如对称的加密密钥和随机数。

这两个其实都是一样的含义,不用刻意去区分。生活中用的更多的是伪随机函数,结果是出来一个数。

流密码和RC4

流密码结构

我们前面讲的EDS是分组密码的一种,每次处理一个输入分组,并为每个输入分组产生一个输出分组。流密码则是连续处理输入元素,在运行过程中,一次产生一个输出元素。

流密码的结构其实很简单,只要将密钥输入到一个伪随机字节生成器(相当于种子),产生一个表面随机的8bit数据流,这个输出的数据流称为密钥流。再跟明文进行一次异或操作就完成了加密过程,一次一个字节。

 

 

举个例子:

 

 

那这么简单的结构安全吗?其实是安全的,因为如果不知道输入密钥,伪随机流就不可预测的,但也有一些问题。流密码一些设计方面的考虑是:

  • 无重复的长周期
  • 统计意义上随机
  • 依赖于大量足够的密钥
  • 线性复杂度

其实流密码通过合理的设计(条件是不重复使用密钥),可以跟同等密钥长度的分组密码具有相当安全性,而且一般更简单,更快。

RC4算法(考试重点)

RC4 是 Ron Rivest 在 1987 年为 RSA Security 公司设计的流密码。它是密钥大小可变的流密码,使用面向字节的操作。(不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。— 区分分组模式和流模式

这个算法基于随机交换的使用。密钥由所有8比特的值随机置换生成,采用这个置换去扰乱(异或)输入消息,每次处理一个字节 。

首先需要理解算法的几个关键变量:

  • 密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是一样的。最终的密文就是使用密钥流和明文做异或操作得到。
  • 状态向量S:长度为256,初始化为 S[0],S[1]…..S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换
  • 临时向量T:长度也为256,每个单元也是一个字节。初始化过程如下:如果密钥 K 的长度为 256 字节,就把 K 直接赋给 T,否则,对于 keylen 字节长度的密钥,将 K 赋值给 T 的前 keylen 个元素,并循环重复用 K 的值赋给 T 剩下的元素,直到 T 的所有元素都被赋值
  • 密钥K:长度为1-256字节,注意密钥的长度keylen与明文长度、密钥流的长度没有必然关系,通常密钥的长度取为16字节(128比特)

RC4算法分为三个步骤:(其实就是一个随机数生成的过程,不断地乱动)

  • 初始化S和T
    for i=0 to 255 do
     S[i]=i;                                //按顺序初始化为0-255
     T[i]=K[ imodkeylen ]; //根据密钥K轮转填入
    
  • 初始排列S:使用密钥去彻底打乱S排序 ,S 形成了密码的中间状态
    j=0;
    for i=0 to 255 do
     j= ( j+S[i]+T[i])mod256;
     swap(S[i],S[j]);
    
  • 产生密钥流:加密将继续扰乱数组S的值,两个被扰乱的值进行相加,得到流密钥在数据S的位置,采用流密码去(加/解密)异或下一消息字节 S[t]
    i,j=0;
    for r=0 to len do  //r为明文长度,r字节
     i=(i+1) mod 256;
     j=(j+S[i])mod 256;
     swap(S[i],S[j]);
     t=(S[i]+S[j])mod 256;
     k[r]=S[t];
    

RC4安全

  • 声称对抗已知攻击,目前仍是安全的
  • 由于RC4 是一个流密码,必须永不重复使用一个密钥(重要!不能重用密钥K)
  • 有一个在WEP(无线网络)的应用问题, 但问题在于RC4的密钥产生方法,而不是RC4本身。

分组密码工作模式(考试重点)

分组密码使用加密固定长度的分组(例如: DES采用56-bit 密钥 加密 64-bit 分组),但在实际应用中,我们需要一些方法去加/解密任意长度的消息。

NIST SP 800-38A 定义了5种模式:拥有分组和流模式、能覆盖大多数的应用、能够被任意分组密码所使用 。我们一一来看。

电子密码本模式 (ECB)

【介绍】

  • 消息被独立分成分组进行加密
  • 每一个分组是一个值,将会被替换,就像一个密码本一样,因此命名为电子密码本模式
  • 每一个分组都是独立其它分组进行编码 C_i = E_K(P_i)
  • 使用: 单一数值是可以安全传输,对于过长的消息,ECB模式可能不安全

【优势和缺点】

  • 消息重复可能在密文中出现(与消息分组对齐,特别是处理如图片的消息。或者是与改变很少的消息, 这个将变成一个密码本分析问题 )
  • 缺点是因为这些加密的消息是独立处理而造成
  • 主要应用在发送少量消息分组时可用

密码分组链接模式 (CBC)

分组密码链接模式主要是用来解决电子密码本模式中的消息重复在密文出现的问题。

  • 消息被分成分组
  • 在加密操作时链接在一起
  • 每一个现在的明文分组与前面密文分组链接(做异或操作)
  • 采用初始向量去开始处理 C_i = E_K(P_i XOR C_{i-1}) C_{-1} = IV (通过异或操作之后,即使跟前面是重复的信息,加密后也不会重复。)
  • 使用: 批量数据加密, 认证

 

 

密码反馈模式 (CFB)

【介绍】

  • 消息被当成是比特流(CFB属于流密码)
  • 在分组密码的输出进行增加,结果是在下一阶段进行反馈
  • 标准允许任意比特(1,8, 64 or 128 等) 进行反馈 (也就是传到下一轮)
  • 最高效率使用分组里的每一比特 (XOR是异或的意思):不直接对P_i加密,而是加密上一轮密文C_{i-1}
    C_i = P_i XOR E_K(C_{i-1})
    C_{-1} = IV
  • 使用: 流数据加密,认证

 

 

【CFB的优点和缺点】

  • 适合于消息以比特/字节到达时 (流密码)
  • 最常见的流模式
  • 缺点是在做分组加密,需要延迟每n比特 (加密不会延迟,做随机数的时候会延迟)
  • 注意在做分组密码时,加密函数在加密和解密时都使用
  • 传输错误会延递几个分组

计数器模式(CTR)

【介绍】

  • 虽然很早提出,但是是一种 “新” 模式
  • 类型于CFB,但是加密每个计数值,而不是任何反馈值
  • 对每个明文分组,必须有不同的密钥和计数值 (从不重复使用)
    O_i = E_K(i)
    C_i = P_i XOR O_i
  • 使用: 快速网络加密

【CTR的优点和缺点】

  • 高效率
  • 在硬件和软件实现上能够并行加密
  • 如果需要,能提前预处理
  • 适用于突发性高速链路
  • 随机访问加密消息分组
  • 可证明安全 (与其它模式一样)
  • 但必须保证永不重复使用密钥和计数器值,否则能被破解
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇