第十七个知识点:描述和比较DES和AES的轮结构

这是密码学52件事中的第17篇.本周我们描述和比较DES和AES的结构.

DES和AES都是迭代分组密码的例子.分组密码通过重复使用一个简单的轮函数来得到它的安全性.轮函数得到一个n-bit的输入和返回一个n-bit的输出,其中n是密码块的大小.轮数r可以是可变的也可以是固定的.一般来说轮数的增加会增强块密码的安全水平.Round函数每轮使用的密钥都是从主密钥k获得的,使用密钥调度算法将k生成多个k分别使用在不同的轮.解密过程就试每轮的密钥都是可逆的,解密只需要反过来使用.在DES中,函数需要是不可逆的,但是整个函数是可逆的.对于AES(Rijndael)来说,不仅仅整个函数都是可逆的,每轮函数也都是可逆的.

DES

实际上,DES密码是Feistel密码的变种.Feistel密码有趣的属性就是每轮的轮函数都是可逆的,无论\(F\)怎么选择:

\[L_i = R_{i-1}
\]
\[R_i = L_{i-1} \oplus F(K_i,L_i)
\]

因此,解密形式就是

\[R_{i-1} = L_i
\]
\[L_{i-1} = R_i \oplus F(K_i,L_i)
\]

通过这种方法,我们可以为函数F选择任意的函数,并且我们仍然可以得到一个加密函数,它可以使用秘钥进行反转。加密和解密功能可以使用相同的代码/电路。我们只需要以相反的顺序使用圆形密钥来解密。作为Feistel密码设计的一个变体,DES具有以下明显的特点:

  • 轮数r是16
  • 块的长度是64bits
  • 密钥长度是56bits
  • 轮密钥\(K_1,K_2...K_16\)每个是48bits
  • 在Feistel网络最开始和结束都使用了一个置换

总结一下DES密码对64位明文的加密操作:

  • 执行一个初始的置换
  • 将块的左半部分和右半部分分开
  • 执行下面的步骤十六轮,每轮有六个步骤
    • 扩展置换,右半部分的32bit被扩展成48bit
    • 上面的48bit和密钥异或相乘得到48bit长的输出
    • 将上面的48bit分割成8个6bit的值
    • S-Box:每6bit的值通过8个不同S-Box之一,产生4bit的输出.每个S-Box是一个四行六列的矩阵.六个输入和矩阵进行乘积,得到列.Bits 1和6生成行号,bits 2,3,4,5指定列号.最后S-Box的输出就是这个表中的元素
    • P-Box:我们现在有8个4bit的输出,把他们组合成一个32bit的值.然后用这个p-box置换,就得到了F的值
  • 将另外半块加在一起
  • 执行一个最终的置换

DES密钥调度算法接受56bit的密钥,这个56bit的密钥实际上是一个64bit的密钥,有8bit是校验位.首先最开始置换这个密钥(64bit输入同时56bit输出,因此丢失了奇偶校验位).然后用一个叫PC-1的矩阵来置换一下:

这样就从一个64bit的流中得到了一个56bit的输出.对这个56bit的输出,我们分割成左右两部分\(C_0,D_0\),每个有28bit,然后我们生成一些\(C_i,D_i\),其中\(1 \le i \le 16\).这个算法就是每次循环移动一位或者两位,具体按照下面的表格:

这样得到了16个\(C_i,D_i\).每对组合起来还是56bit,在分别用下面的PC-2来置换.生成48bit的密钥.

注意,对于许多现代应用程序来说,56位的密钥长度是不够的,因此通常使用DES时要使用三个密钥和主密码的三个迭代。这种版本称为三重DES或3DES。在3DES中键长等于168。还有另一种使用DES三次的方法,但是使用两个键而不是三个键,键长为112。在这个3DES的双键版本中,我们使用了3DES的基本结构,但是第一键和第三键是相等的。然而,双密钥3DES并不像人们最初认为的那样安全。

有关实际值(S-Boxes、P-Boxes和所有排列表)的更多细节可以在[1]中找到。

AES

AES算法,不像DES,是一个不依赖Feistel网络的块密码设计方案.然而AES和DES还是有很多相似的地方.它使用一个重复的轮数来获取安全性.每一轮由替换和置换,还有一个密钥叠加组成.AES有一个强数学结构,它的大部分操作都是基于\(GF(2^8)\)的.然而不像DES,加解密操作都是不同的.

AES在\(F_2^8[x]\)中用多项式识别32位的字.AES是参数化的,即可以使用128,192,256三种形式.对每一个形式,密钥长度和轮数都是不同的.

为了让我们的讨论更加简单,我们仅仅考虑10轮,128bit的情况.AES操作一个内部的4*4的矩阵(S(4,4)),称为状态矩阵.每轮密钥也是一个4*4的矩阵.AES使用下面四个操作.

下面是算法的伪代码:

AddRoundKey(S, K0)
for i = 1 to 9 do
SubBytes(S)
ShiftRows(S)
MixColumns(S)
AddRoundKey(S, Ki)
end
SubBytes(S)
ShiftRows(S)
AddRoundKey(S, K10)

下面是密钥扩展算法

W0 =K0,W1 =K1,W2 =K2,W3 =K3
for i = 1 to 10 do 
T = RotBytes(W4i−1)
T = SubBytes(T)
T = T ⊕ RCi
W4i = W4i−4 ⊕ T
W4i+1 = W4i−3 ⊕ W4i
W4i+2 = W4i−2 ⊕ W4i+1
W4i+3 = W4i−1 ⊕ W4i+2
end
\[K_i = (W_{i,0},W_{i,1},W_{i,2},W_{i,3})
\]

for all \(i\),\(0 \le i \le 10\)

References: [1] http://www.cs.bris.ac.uk/~nigel/Crypto_Book/

第十七个知识点:描述和比较DES和AES的轮结构的更多相关文章

  1. 第二十七个知识点:什么是对称密码加密的AEAD安全定义?

    第二十七个知识点:什么是对称密码加密的AEAD安全定义? AEAD 在之前的博客里,Luke描述了一种被广泛使用的操作模式(ECB,CBC和CTR)对块密码.我们也可能会想我们加密方案的完整性,完整性 ...

  2. 第三十七个知识点: The Number Field Sieve

    第三十七个知识点: The Number Field Sieve 数域筛法(The Number Field Sieve ,NFS)是已知的分解算法中最有效率的.它的运行时间取决于被分解的数的大小而不 ...

  3. 第四十七个知识点:什么是Fiat-Shamir变换?

    第四十七个知识点:什么是Fiat-Shamir变换? 只要Alice和Bob同时在线,Sigma协议能快速的完成Alice向Bob证明的任务.Alice向Bob发送承诺,Bob返回一个挑战,最后Ali ...

  4. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(加解密)

    转自http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后 ...

  5. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)

    最先附上 下载地址 背景(只是个人感想,技术上不对后面的内容构成知识性障碍,可以skip): 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后对一些数据进行一些加密解密的操作. 笔 ...

  6. When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)

    关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...

  7. C#中使用DES和AES加密解密

    C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...

  8. DES、AES、TEA加密算法的比较

    1.     DES算法介绍: DES算法具有对称性, 既可以用于加密又可以用于解密.对称性带来的一个很大的好处在于硬件实现, DES 的加密和解密可以用完全相同的硬件来实现.DES 算法的明文分组是 ...

  9. java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

    概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...

随机推荐

  1. set、multiset深度探索

    set/multiset的底层是rb_tree,因此它有自动排序特性.set中的元素不允许重复必须独一无二,key与value值相同,multiset中的元素允许重复. set的模板参数key即为关键 ...

  2. Mybatis中 SIMPLE、REUSE、BATCH的区别

    Executor分成两大类,一类是CacheExecutor,另一类是普通Executor. 普通类又分为: ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情.它为每个语句的执行 ...

  3. 【Linux】【Services】【Package】Basic

    Linux程序包管理           概述         API:Application Program Interface         ABI:Application Binary Int ...

  4. 【JS】toLocaleString 日期格式,千分位转换

    https://blog.csdn.net/Seven521m/article/details/108866881 类似于c里printf(m%)的意思 可以指定整数最少位数,小数最少与最多位数,有效 ...

  5. 【C/C++】vector 动态二维数组

    声明 vector<vector<int> vec; //赋值思路可以从这个很基础的操作里看出来 vector<int> a; a.push_back(1); a.pus ...

  6. 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用

    含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...

  7. 论文翻译:2021_A Perceptually Motivated Approach for Low-complexity, Real-time Enhancement of Fullband Speech

    论文地址:一种低复杂度实时增强全频带语音的感知激励方法 论文代码 引用格式:A Perceptually Motivated Approach for Low-complexity, Real-tim ...

  8. 【死磕Java并发】—–深入分析volatile的实现原理

    通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized.如果一个变量使用volatile,则它比使 ...

  9. 转:KVC 与 KVO 理解

    KVC 与 KVO 理解 On 2012 年 6 月 7 日, in iPhone, by donly KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

  10. CTF靶场

    CTF靶场测试报告 一.跨站脚本攻击(XSS) 实验原理:跨站脚本攻击( Cross Site Script),本来的缩写应为CSS,但是为了与层叠样式表(Cascading Style CSS)区分 ...