对称加解密相关

对称加密分为分组密码和序列密码

  • 分组密码:也叫块加密(block cyphers)将明文按一定长度分组,一次加密一个明文块。常见分组加密算法有--ECB、CBC、CFB、OFB
  • 序列密码:也叫流加密(stream cyphers)一次加密明文中的一个位。实现简单、异或运算速度快、错误传播少;但秘钥长度需要与大于等于明文长度,并且随机性不好保证。因为一次一密,秘钥交换不易实现。流密码的核心是伪随机数发生器(PRG)

工作模式

模式名称优点缺点备注
ECB

Electronic

CodeBook

电子密码本模式

  • 简单
  • 快速
  • 支持并行计算(加密、解密)
  • 明文中的重复排列会反映在密文中
  • 删除、替换密文分组能操作明文
  • 不能抵御重放攻击
不应使用
CBC

Cipher Block Chaining

密文分组链接模式

  • 明文重复不反映在密文中
  • 支持并行计算(解密)
  • 能够解密任意密文分组
  • 密文比特位出错,当前分组全错及后以分组响应比特位出错
  • 机密不支持并行计算
推荐使用
CFB

Cipher FeedBack

密文反馈模式

  • 不需要填充
  • 支持并行计算(解密)
  • 能够解密任意密文分组
  • 加密不支持并行计算
  • 密文比特位出错,当前分组全错及后以分组响应比特位出错
  • 不能抵御重放攻击
推荐用CTR模式替代
OFB

Output FeedBack

输出反馈模式

  • 不需要填充
  • 可事先加解密准备
  • 密文比特位出错时只有明文对应比特位出错
  • 加解密使用相同结构
  • 不支持并行计算
  • 主动攻击这反转密文中某些比特时,明文中对应比特也会被反转
推荐用CTR模式替代
CTR

Counter

计数器模式

  • 不需要填充
  • 可事先加解密准备
  • 支持并行计算(加密、解密)
  • 密文比特位出错只影响明文对应比特位
主动攻击这反转密文中某些比特时,明文中对应比特也会被反转推荐使用

1、电码本模式ECB(Electronic Codebook Book )

分段,各自加密

         ECB模式是最基本的加密模式,即仅仅使用明文和密钥来加密数据,相同的明文块会被加密成相同的密文块,这样明文和密文的结构将是完全一样的,就会更容易被破解,相对来说不是那么安全,因此很少使用。

2、密码分组链接模式CBC(Cipher Block Chaining)

分段,明文与上一段密文(初始IV)进行异或再加密

        CBC模式则比ECB模式多了一个初始向量IV,加密的时候,第一个明文块会首先和初始向量IV做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全,我们常用的就是CBC加密模式

3、计算器模式CTR(Counter)

自增算子,相当于一次一密

 4、密码反馈模式CFB(Cipher FeedBack)

 分段,将初始块IV或上一段密文块进行加密,再将加密结果与明文块进行运算得到密文块

5、输出反馈模式OFB(Output FeedBack)

只对初始化向量和加密结果进行加密,加密输出与明文块进行运算得到密文块

OFB模式

 不对明文直接加密,而是将“分组明文”和“加密输出”进行运算

 

CFB模式和OFB模式的对比

OFB模式和CFB模式的区别仅仅在于密码算法的输入。

CFB模式中,密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,因此有了“密文反馈算法”这个名字。

OFB模式中,密码算法的输入则是密码算法前一个加密输出,也就是将加密输出反馈给密码算法,因此就有了“输出反馈模式”这个名字。

AES

Rijndael 算法 是一个分组密码算法族,其分组长度包括 128 比特、160 比特、192 比特、224 比特、256 比特,密钥长度也包括这五种长度。

AES 标准算法 是选取了分组长度128 Bit,密钥长度为 128 Bit、192 Bit 和 256 Bit 的三个版本,名称分别为 AES-128AES-196AES-256。如果分组长度不等于 128 Bit,那么它不可以被称为 AES 标准算法,只能称为 Rijndael 算法的一种实现方式。

  • 分组加密算法:支持 128 位分组大小,128/192/256 位密钥
  • 安全性不低于 3DES,但实施与执行要比 3DES 的更高效

AES加密流程主要有上图左侧的轮函数转换和右侧的秘钥扩散

轮函数主要包含 4 种运算,但不同的运算轮所做的具体运的算组合并不相同。

主要区别是初始轮(Round 0)和最后一轮(Round Nr),所有中间轮的运算都是相同的,会依次进行 4 种运算,即:

  • [数据混淆] 字节代换(SubByte)
  • [数据混淆] 行移位(ShiftRow)
  • [数据混淆] 列混合(MixColumn)
  • [数据加密] 轮密钥加(AddRoundKey)

字节代换(SubstituteBytes)

AES 标准算法将 128 位(16字节)的明文以特定次序生成一个 4x4 的矩阵(每个元素是一个字节,8位),即初始状态(state),经由轮函数的迭代转换之后又将作为下一轮迭代的输入继续参与运算直到迭代结束。

字节代换(SubBytes)是对 state 矩阵中的每一个独立元素于置换盒 (Substitution-box,S盒)中进行查找并以此替换输入状态的操作。字节代换是可逆的非线性变换,也是 AES 运算组中唯一的非线性变换。字节代换逆操作也是通过逆向置换盒的查找及替换来完成的。

S 盒是根据设计原则严格计算得出的 16x16 的查询表,共 256 个元素,如下图所示:

 

行移位(ShiftRows)

行移位主要目的是实现字节在每一行的扩散,属于线性变换。

列混合(MixColumns)

列混合是通过将 state 矩阵与常数矩阵 C 相乘以达成在列上的扩散,属于代替变换。列混合是 Rijndael 算法中最复杂的一步,其实质是在有限域GF(256) 上的多项式乘法运算。

轮密钥加(AddRoundKey)

密钥加是将轮密钥与 state 矩阵进行运算,此步骤属于真正意义上的加密。

密钥扩展算法(Key Expansion)

AES加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4×4的矩阵表示。

密钥扩展算法是Rijndael的密钥编排实现算法,其目的是根据种子密钥(用户密钥)生成多组轮密钥。轮密钥为多组128位密钥,对应不同密钥长度,分别是11,13,15组。

密钥扩展的原理图如下:

密钥扩展过程说明:

1)  将种子密钥按图(a)的格式排列,其中k0、k1、……、k15依次表示种子密钥的一个字节;排列后用4个32比特的字表示,分别记为w[0]、w[1]、w[2]、w[3];

2)  按照如下方式,依次求解w[j],其中j是整数并且属于[4,43];

3)  若j%4=0,则w[j]=w[j-4]⊕g(w[j-1]),否则w[j]=w[j-4]⊕w[j-1];

函数g的流程说明:

a)  将w循环左移8比特;

b)  分别对每个字节做S盒置换;

c)  与32比特的常量(RC[j/4],0,0,0)进行异或,RC是一个一维数组,其值如下。(RC的值只需要有10个,而此处用了11个,实际上RC[0]在运算中没有用到,增加RC[0]是为了便于程序中用数组表示。由于j的最小取值是4,j/4的最小取值则是1,因此不会产生错误。)

RC = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值