三 对称加密算法

3.1 概念

​ 对称加密的加密秘钥和解密秘钥是完全相同的,其安全性依赖于两个因素:加密算法必须足够强,可以抵抗现有各种密码分析方法的攻击;依赖于秘钥的秘密性,而非算法的保密性。

​ 常用的对称加密算法有:

  • RC系列,包括RC2、RC4、RC5、RC6
  • TEA系列,包括TEA、XTEA、XXTEA
  • DES系列,包括DES、3DES、AES、IDEA
  • Fish系列,包括BlowFish、TwoFish
  • SM4

3.2 RC系列算法原理

3.2.1 RC2

​ RC2是传统的一种对称分组加密算法,可作为DES算法的建议替代算法。其输入和输出都是64bit。秘钥长度是1byte到128byte。

3.2.2 RC4

​ RC4生成一种称为秘钥流的伪随机流,与明文通过异或操作混合,达到加密的目的。解密时与密文进行异或操作得到明文。秘钥留由两部分组成,分别是KSA和PRGA。

(1)KSA (Key-Scheduling Algorithm, 秘钥调度算法)
在这里插入图片描述
(2)PRGA (Pseudo-Random Generation Algorithm, 伪随机生成算法)
在这里插入图片描述
​ 明文通过和密码 k 进行XOR运算,得到密文。

​ 密文通过和密码 k 进行XOR运算,得到明文。

3.2.3 RC5

​ RC5是一种因简洁著称的参数可变的、对称分组加密算法。可变的参数为:分组大小、秘钥大小和加密轮数,在算法中使用了三种运算:异或、加和循环。

变量定义
w以bit表示的字的尺寸16,32,64
r加密轮数0-255
b秘钥字节长度0-255
c[]表示向上取整[b*8/w]
t2r+2
PwOdd取最接近给定输入的奇数Odd((e-2)*2^{w})
QwPHI黄金比例(1.618)Odd((PHI-1)*2^{w})
S[]伪随机序列
K[]密钥
L[]在密钥生成的临时数组,用来按字初始化密钥

​ 常数Pw, Qw的表示如下所示:

w163264
Pw0xB7E10xB7E151630xB7E151628AED2A6B
Qw0x9E370x9E3779B90x9E3779B97F4A7C15

伪代码实现如下

(1)KSA及PRGA的过程

u=w/8
for i = b-1 to 0 do:
    L[i/u] = (L(i/u) << 8) + K[i]
S[0] = Pw
for i = 1 to t-1:
    S[i] = S[i-1] + Qw
i = j = 0
A = B = 0
do 3*max(t, c) times:
    A = S[i] = (S[i]+A+B) <<< 3  # 循环左移
	B = L[j] = (L[j]+A+B) <<< (A+B)
    i = (i+1)%t
    j = (j+1)%c

(2)加密过程

A, B # 要加密的明文的两个字
A = A+S[0]
B = B+S[1]
for i = 1 to r do:
    A = ((A^B)<<<B)+S[2*i]
    B = ((B^A)<<<A)+S[2*i+1]

(3)解密过程,加密的逆过程

for i =  r down to 1 do:
    B = ((B-S[2*i+1]>>>A)^A
    A = ((A-S[2*i])>>>B)^B
B = B-S[1]
A = A-S[0]

3.3 TEA系列算法原理

​ TEA (Tiny Encryption Algorithm, 微型加密算法)系列算法,是一种易于描述和执行的块密码。通常只需要很少的代码可以实现。

3.3.1 TEA算法

​ TEA的加密过程为:
在这里插入图片描述
​ TEA的解密过程是加密的逆过程,如下所示:
在这里插入图片描述

3.3.2 XTEA算法

​ XTEA是在TEA算的基础上进行了改进,使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,计算速度会变慢。

​ XTEA的加密过程:
在这里插入图片描述
​ XTEA的解密过程:
在这里插入图片描述

3.3.3 XXTEA

​ XXTEA 是在XTEA的基础上进行的改进, 在处理块中每个字时利用了相邻字。它利用一个更复杂的 MX 函数代替了 XTEA 轮循函数,MX 使用 2 个输入量。

#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const key[4]) {
    uint32_t y, z, sum;
    unsigned p, rounds, e;
    if (n > 1) {          /* Coding Part */
      rounds = 6 + 52/n;
      sum = 0;
      z = v[n-1];
      do {
        sum += DELTA;
        e = (sum >> 2) & 3;
        for (p=0; p<n-1; p++) {
          y = v[p+1]; 
          z = v[p] += MX;
        }
        y = v[0];
        z = v[n-1] += MX;
      } while (--rounds);
    } else if (n < -1) {  /* Decoding Part */
      n = -n;
      rounds = 6 + 52/n;
      sum = rounds*DELTA;
      y = v[0];
      do {
        e = (sum >> 2) & 3;
        for (p=n-1; p>0; p--) {
          z = v[p-1];
          y = v[p] -= MX;
        }
        z = v[n-1];
        y = v[0] -= MX;
        sum -= DELTA;
      } while (--rounds);
    }
  }

在这里插入图片描述

3.4 DES系列

3.4.1 DES算法

​ DES(Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,它基于使用56位密钥的对称算法。DES是一种典型的块密码—一种将固定长度的明文通过一系列复杂的操作变成同样长度的密文的算法。对DES而言,块长度为64位。同时,DES使用密钥来自定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。密钥表面上是64位的,然而只有其中的56位被实际用于算法,其余8位可以被用于奇偶校验,并在算法中被丢弃。因此,DES的有效密钥长度仅为56位。
在这里插入图片描述
在这里插入图片描述

3.4.1.1 初始置换与逆初始置换

​ 初始置换 I P IP IP 与逆初始置换$IP^{-1} $都是按位置换,可以看作是简单的交叉连接。但没有增加DES的安全性。
在这里插入图片描述

​ 初始置换的表从左到右、从上到下阅读。如输入58位将映射到第1个输出位置。逆初始置换 I P − 1 IP^{-1} IP1 I P IP IP的操作完全相反。
在这里插入图片描述
在这里插入图片描述

3.4.1.2 f f f函数

f f f函数的输出将用作XOR-掩码,用来加密左半部分输入位 L i − 1 L_{i-1} Li1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
​ 每个S-盒是一个查找表,它将6位的输入映射为4位的输出。

​ S-盒是DES的核心,也是该算法中唯一的非线性元素,并提供了混淆。设计准则如下:
在这里插入图片描述
32位的输出会根据表3-12中给出的置换 P P P进行按位置换。
在这里插入图片描述

3.4.1.3 密钥编排

​ 密钥编排从原始的56位密钥中得到16个轮密钥 k i k_i ki,也称为子密钥。其中每个轮密钥 k i k_i ki都是48位。DES输入密钥通常是64位,其中每组第8个都是签名7位的奇偶校验位(不造这种规范设计的原因)。这8个校验位不是真正的密钥位,也没有增加密码的安全性,因此DES是一个56位的密码。
在这里插入图片描述
​ 在初始PC-1置换时去除第8位的校验位,将64位密钥缩短为56位。
在这里插入图片描述
在这里插入图片描述

3.4.1.4 解密

在这里插入图片描述

3.4.2 3DES算法

​ 3DES(即Triple DES)是DES向AES过渡的加密算法,它使用2条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。
在这里插入图片描述
k 1 = k 2 = k 3 k_1=k_2=k3 k1=k2=k3,则3DES将执行单重DES加密。

https://blog.csdn.net/a745233700/article/details/102316398

3.4.3 AES算法

​ AES(Advanced Encryption Standard, 高级加密标准),是目前使用最广泛的一种对称密码。针对AES最有效的攻击是蛮力攻击,AES拥有三种不同的密钥长度抵抗蛮力攻击,分别为128位、192位和256位。只有分组长度为128位,才被称为AES算法。
在这里插入图片描述
在这里插入图片描述
​ AES在一次迭代中就加密了所有128位,AES共有三种不同类型的层。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.3.1 字节代换层

​ 每轮的第一层都是字节代换层,可以看做是16个并行的S-盒,且每个S-盒的输入和输出都是8位,S-盒是完全相同的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
​ DES的S-盒本质上是满足某些特性的随机表,而AES的S-盒具有非常强的代数结构,可以看做是一个两步的数学变换:
在这里插入图片描述

3.4.3.2 扩散层

​ 扩散指将单个位的影响扩散到整个状态中,AES的扩散层由两个子层组成:ShiftRow(行移位)变换和MixColumn(列混淆)变换。

  1. ShiftRow子层
    在这里插入图片描述
  2. MixColumn子层

​ MixColumn是一个线性变换,混淆了状态矩阵的每一列,是AES中的主要扩散元素。
在这里插入图片描述

3.4.3.3 密钥加法层

在这里插入图片描述

3.4.3.4 密钥编排

​ 密钥编排将原始输入密钥作为输入,得到AES的子密钥,在输入和输出的过程中都使用了XOR加法,这个过程也称为密钥漂白。子密钥的个数等于轮数加1,因为第一个密钥加法层进行密钥漂白时也需要密钥。

  1. 128位密钥AES的密钥编排
    在这里插入图片描述
  2. 192位密钥AES的密钥编排
    在这里插入图片描述
    在这里插入图片描述
  3. 256位密钥AES的密钥编排
    在这里插入图片描述
    在这里插入图片描述
    https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86

https://juejin.im/entry/59eea418f265da4320026b1f

https://zhuanlan.zhihu.com/p/78913397

3.4.3.5 解密

在这里插入图片描述

3.5 Fish算法

3.5.1 TwoFish算法

​ Twofish算法是典型的分组加密算法,即对固定长度的一组明文进行加密的算法。它将明文按一定的位长分组,明文组和密钥组的全部经过加密运算得到密文组。Twofish算法采用的明密文分组长度为128比特,支持128、192、256比特的密钥长度。
在这里插入图片描述
**(1)s-boxes。**是一种非线性的置换运算,可以用表格来表示。不同的S-box可由随机的方式产生,或用特定的算法产生出来。S-box输入和输出个数,随分组密码算法的不同而有所不同。Twofish使用四个8x8位的S-boxes,是由两个固定的8x8位的置换,再加上密钥的数据所产生出来的。

**(2)MDS矩阵。**是一个作用在域上的线性映射,从一个包含a个元素的向量映射到有b个元素的向量,会产生一个含有a+b个元素的合成向量,而这个向量有一个性质就是:任何非零的向量它的非零元素个数至少有b+1个。换句话说,MDS通常表示成含有。axb个元素的矩阵型态,而Twofish本身就使用了一个作用在GF(28)上4 x4的MDS矩阵。
在这里插入图片描述
**(3)whitening。**是在第一个回合之前和最后一个回合之后,将密钥的数据和分组数据进行XOR的操作。

**(4)PHT。**PHT是一种可以快速执行的简单混合操作。假设给定两个输入a和b,则32位的PHT定义为:

a 1 = a + b m o d 2 32 a^1=a+b mod 2^{32} a1=a+bmod232;

b 1 = a + 2 b m o d 2 32 b^1=a + 2b mod 2^{32} b1=a+2bmod232

**(5)函数g。**函数g是整个Twofish最重要的部分,其输入X是32位的数据,分成4个字节,每一个字节运算时都有属于自己的S一boxes。

https://www.jiamisoft.com/blog/22642-ofis.html

http://www.jiamisoft.com/blog/22590-twof.html

3.5.2 BlowFish算法

​ Blowfish是一个64位分组及可变密钥长度的分组密码算法,可用来加密64Bit长度的字符串,密钥为1至448位的可变长度。 算法由两部分组成:密钥扩展和数据加密。
在这里插入图片描述
​ 一般分为64位一组,一组分左右部分,进行一般为16轮的迭代运算,每次迭代完后交换左右位置,可以自己进行设计的有:分组大小、密钥长度、轮次数、子密钥生成、轮函数。

​ 密钥扩展把长度可达到448位的密钥转变成总共4168字节( 18 ∗ 32 / 8 + 4 ∗ 256 ∗ 32 / 8 18*32/8+4*256*32/8 1832/8+425632/8)的几个子密钥。所有的运算都是32位字的加法和异或,仅有的另一个运算是每轮的四个查表。

​ BlowFish算法使用两个源密钥,即通常所谓的两个“盒”——unsigned long pbox[18]和unsigned long sbox[4,256]。其中,P盒由18个32位子密钥组成:P1,P2,P3,……P18;而S盒为一个4×256矩阵,其中矩阵中每个元素都为一个32位子密钥。

​ BlowFish算法中,有一个核心加密函数:BF_En,该函数输入64位信息,运算后, 以64位密文的形式输出。

https://80x86.io/post/blowfish-cipher

http://www.voidcn.com/article/p-gdwaotkd-ub.html

3.6 SM4算法

​ SM4算法是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://halfrost.com/symmetric_encryption/
https://blog.csdn.net/cg129054036/article/details/83016958
https://neuqzxy.github.io/2017/06/15/%E6%AC%A3%E4%BB%94%E5%B8%A6%E4%BD%A0%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8SM4%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/
https://halfrost.com/symmetric_encryption/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮姑娘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值