电子说
安全加密在IC领域也是相当重要的部分了,这次我们简单了解下经典加密算法,DES和AES。
DES简介
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。DES加密算法出自IBM的研究,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥(密钥长度越长越安全),随着现代计算能力的提升,破解难度越来越低。对于加密算法而言,这意味着它将慢慢淡出主流。
DES安全性
(1)如果DES密钥太短经不起穷尽攻击。
(2)DES存在弱密钥和半弱密钥。
不过,在某些简单应用中,DES加密算法还是有使用空间的。
DES算法的入口参数有三个:Key、Data、Mode。
·其中Key为8个字节共64位,是DES算法的工作密钥;
·Data也为8个字节64位,是要被加密或被解密的数据;
·Mode为DES的工作方式,有两种:加密或解密。
DES算法是这样工作的:
如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;
如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。
DES加密
初始置换IP
将64 bit明文的位置进行置换,得到一个乱序的64 bit明文组,而后分成左右两段,每段为32bit,以L0和R0表示,IP中各列元素位置号数相差为8,相当于将原明文各字节按列写出,各列比特经过偶采样和奇采样置换后,再对各行进行逆序。
1. 初始置换IP作用是:将64位明文打乱重新排列。如,初始置换IP就是将原名来64位明文数据的第58位换到第1位,原来的50位换到第2位,…,依次类推。
2.初始置换结果分为两组:左L0(32位)、右R0(32位)
初始置换表
乘积变换
乘积变换是DES算法的核心部分,此步骤需要经历16轮,而且每一轮变换都需要一个48bit子密钥,共需要16个48bit密钥。将经过IP置换后的数据分成32 bit的左右两组,在迭代过程中彼此左右交换位置。
每次迭代时只对右边的32 bit进行一系列的加密变换,在此轮迭代即将结束时,把左边的32 bit与右边得到的32bit做异或运算,作为下一轮迭代时右边的段,并将原来右边未经变换的段直接送到左边的寄存器中作为下一轮迭代时左边的段。
在每一轮迭代时,右边的段要经过选择扩展运算E、密钥加密运算、选择压缩运算S、置换运算P和左右数据段的异或运算。
乘积变换中的加密变换
(1)选择扩展运算E
选择扩展运算E
选择扩展运算效果图
(2)获取子密钥进行加密运算
子密钥产生算法
1) 置换1
置换1后的效果
2) 循环左移
每个寄存器所需移动的数据位数
3) 压缩置换
压缩置换表
(3)选择压缩算法S
S盒信息
(4)置换运算P
P盒置换表
逆初始置换
逆初始置换是DES加密过程的最后一步,它的作用打乱重排第十六次加密迭代的结果然后形成64位密文。
1. 把64位中间密文打乱重排。初始置换IP与逆初始置换是互逆的。如,在IP中把输入的第2位置换到第8位,而在逆初始置换中,把输入的第8位置换到第2位。
2. 形成最终的64位密文。
3DES简介
3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法。
另起一段对它进行简单介绍的原因,是因为它特殊的价值:承上启下。
3DES(Triple DES)是DES向AES过渡的加密算法,是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。
3DES有两种加密方式:
1. 第一、三次加密使用同一种密钥,这种方式密钥长度128位(112位有效)
2. 三次加密使用不同密钥,这种方式密钥长度192位(168位有效)
3DES的密钥长度为24个字节,而 DES 的密钥长度为8的倍数,比如8,16,24都可以。
AES简介
AES,Advanced Encryption Standard,高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。它的出现主要是为了取代DES加密算法。
虽然出现了3DES的加密方法,但由于它的加密时间是DES算法的3倍多,64Bit的分组大小相对较小,所以还是不能满足人们对安全性的要求。
1997年,美国国家标准技术研究所宣布希望征集高级加密标准,最终5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS。而Rijndael算法笑到了最后。
AES原本指的是一套标准FIPS 197,而AES算法一般指分组大小为128bits的Rijndeal算法。这也是AES与Rijndeal的一个区别。
AES与R的区别
下面简单介绍下各个部分的作用与意义:
明文P
没有经过加密的数据。
密钥K
用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
AES加密函数
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
密文C
经加密函数处理后的数据
AES解密函数
设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
在这里简单介绍下对称加密算法与非对称加密算法的区别。
对称加密算法
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
非对称加密算法
加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。
AES的基本结构
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。
密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:
AES加密有AES-128、AES-192、AES-256三种,分别对应三种密钥长度128bits(16字节)、192bits(24字节)、256bits(32字节)。当然,密钥越长,安全性越高,加解密花费时间也越长。
默认的是 AES-128,其安全性完全够用。
这里实现的是AES-128,也就是密钥的长度为128位,加密轮数为10轮。
AES的加密公式为C = E(K,P),在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。
AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。
一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。
该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图所示:
分组密码体制
所谓分组密码体制就是指将明文切成一段一段的来加密,然后再把一段一段的密文拼起来形成最终密文的加密方式。AES 采用分组密码体制,即 AES 加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用 Padding 来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文。
初始向量IV
初始向量 IV 的作用是使加密更加安全可靠,我们使用 AES 加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量 IV 的长度规定为128位16个字节,初始向量的来源为随机生成。
AES加密模式
AES只是个基本算法,实现AES有几种加密模式。分组密码有五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。
ECB模式(电子密码本模式:Electronic codebook)
ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。
CBC模式(密码分组链接:Cipher-block chaining)
CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。
CFB模式(密文反馈:Cipher feedback)
与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。
OFB模式(输出反馈:Output feedback)
OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。
CTR模式(计数器:Counter)
计数器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计数器不能维持很长的情况下,密钥只能使用一次。
AES有五种加密模式,我们一般使用的是CBC模式,而ECB则相对不安全。ECB 模式是最基本的加密模式,仅仅使用明文和密钥来加密数据,相同的明文块会被加密成相同的密文块,这样明文和密文的结构将是完全一样的,就会更容易被破解,相对来说不是那么安全,因此很少使用。
而CBC模式则比 ECB模式多了一个初始向量 IV,加密的时候,第一个明文块会首先和初始向量 IV 做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全,因而我们常用的就是CBC加密模式。
AES加密
开始加密,进入4个轮函数:
1、AddRoundKey:轮密钥加运算
2、ByteSub:字节变换 (S盒变换)
3、ShiftRows:行变换
4、MixColumns:列变换
轮密钥加 / AddRoundKey
简单的把当前状态 (state) 与扩展密钥进行按位异或
字节变换 / ByteSub
这一步就是将state中每一个字节替换为S_box中的对应字节。S_box是一个有256个元素的一维数组,直接查找当前字节所对应的新的字节并替换即可。
行变换 / ShiftRow
这个就比较好理解了,就是把每行左环移,第一行不变,第二行环移1位,第三行环移2位,第三行环移3位。
列混合 / MixColumn
这是整个AES加密流程中最复杂的一步,同时要应用到之前在S盒变换里提到过的GF(256)域,如果真的想要理解这一步的话建议先去仔细了解一下GF(256)再来继续阅读,此处不多加阐述。
密钥扩展 / KeyExpansion
万事俱备,只欠东风。4个轮函数已经全部齐了,现在只差一步——密钥扩展。
简述DES与AES的区别
AES中的S盒运用了GF(28)的数学基础,DES中的S盒主要是为了确保非线性。与DES相比,AES用到了非常深的数学基础。
与AES算法相比,DES在参数特性方面主要区别体现在以下几个方面:
1、DES的数据块大小为8个字节,而AES的数据块大小为16个字节。
2、DES的密钥长度是64位(其中8位用于校验),而AES的密钥长度是128位(AES算法比DES算法更安全)。
3、这两种算法在加/解方面的具体原理是不一样的,但DES加密算法的块大小及密钥长度都不能满足现在的安全需求了,就像最开始提到的那样,所以现在比较少使用这种加密算法,而是使用像AES或者3DES之类更高级的加密算法。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !