




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.zAES加密算法原理〔图文〕随着对称密码的开展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密平安性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1]。经过三轮的筛选,比利时JoanDaeman和VincentRijmen提交的Rijndael算法被提议为AES的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准会聚了强平安性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍[2]。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。
AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位〔16字节〕分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用一样的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据一样。迭代加密使用一个循环构造,在该循环中重复置换〔permutations〕和替换(substitutions〕输入数据。Figure1显示了AES用192位密钥对一个16位字节数据块进展加密和解密的情形。Figure1局部数据AES算法概述AES算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES使用了几种不同的技术来实现置换和替换。为了说明这些技术,让我们用Figure1所示的数据讨论一个具体的AES加密例子。下面是你要加密的128位值以及它们对应的索引数组:00112233445566778899aabbccddeeff0123456789101112131415
192位密钥的值是:000102030405060708090a0b0c0d0e0f101112131415161701234567891011121314151617181920212223Figure2S-盒〔Sbo*〕当AES的构造函数〔constructor〕被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。S-盒的前五行和前五列如Figure2所示。在幕后,加密例程获取该密钥数组并用它来生成一个名为w[]的密钥调度表,Figure3所示。Figure3密钥调度表〔KeySched〕w[]最初的Nk(6)行被作为种子,用原始密钥值〔0*00到0*17〕。剩余行从种子密钥来产生。变量Nk代表以32位字为单位的种子密钥长度。稍后我分析AES实现时你将清楚地看到w[]是怎样产生的。关键是这里现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥〔roundkeys〕以将它们与原始种子密钥区别开来。Figure4State〔态〕数组AES加密例程开场是拷贝16字节的输入数组到一个名为State〔态〕的4×4字节矩阵中。〔参见Figure4〕。AES加密算法取名为Cipher,它操作State[],其过程描述的伪代码参见Figure5。
在规中,加密算法实现的一个预备的处理步骤被称为AddRoundKey〔轮密钥加〕。AddRoundKey用密钥调度表中的前四行对State矩阵实行一个字节一个字节的异或〔*OR〕操作,并用轮密钥表w[c,r]异或输入State[r,c]。
举个例子,如果State矩阵的第一行保存的字节是{00,44,88,cc},第一列密钥调度表是{00,04,08,0c},则新的State[0,2]值是用w[2,0](0*08或0*80)异或State[0,2](0*88)的结果:1000100000001000*OR10000000
AES算法的主循环对State矩阵执行四个不同的操作,在规中被称为SubBytes〔字节替换〕、ShiftRows〔行位移变换〕、Mi*Columns〔列混合变换〕和AddRoundKey。除了每次循环AddRoundKey都被调用并使用密钥调度表的下面四行外,AddRoundKey与预备处理步骤中的AddRoundKey一样。SubBytes例程是一个代替操作,它将State矩阵中的每个字节替换成一个由Sbo*决定的新字节。比方,如果State[0,1]的值是0*40如果你想找到它的代替者,你取State[0,1]的值(0*40)并让*等于左边的数字(4)并让y等于右边的数字(0)。然后你用*和y作为索引进到Sbo*表中寻找代替值,如Figure2所示。
ShiftRows是一个置换操作,它将State矩阵中的字节向左旋转。Figure6示了ShiftRows如何操作State[]。State的第0行被向左旋转0个位置,State的第1行被向左旋转1个位置,State的第2行被向左旋转2个位置,而State的第3行被向左旋转3个位置。Figure6对State进展ShiftRows操作Mi*Columns是一个代替操作,它是理解AES算法时最具技巧〔或者说是最需要动脑筋的局部〕的局部。它用State字节列的值进展数学域加和域乘的结果代替每个字节。我将在下一节中详细解释专门的域加和域乘细节。
假设State[0,1]的值是0*09,并且列1上的其它值分别为0*60,0*e1和0*04,则State[0,1]的新值计算如下:
[cpp]viewplaincopyState[0,1]
=
(State[0,1]
*
0*01)
+
(State[1,1]
*
0*02)
+(State[2,1]
*
0*03)
+(State[3,1]
*
0*01)=
(0*09
*
0*01)
+
(0*60
*
0*02)
+
(0*e1
*
0*03)
+(0*04
*
0*01)=
0*57
此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。
SubBytes、ShiftRows、Mi*Columns和AddRoundKey四个操作在一个执行Nr次的循环里被调用,Nr为给定密钥大小的轮数减1。加密算法使用的轮数要么是10,12,要么是14,这依赖于种子密钥长度是128位、192位还是256位。在这个例子中,因为Nr等于12,则这四个操作被调用11次。该迭代完成后,在拷贝State矩阵到输出参数前,加密算法调用SubBytes、ShiftRows和AddRoundKey后完毕。
大致说来,AES加密算法的核心有四个操作。AddRoundKey使用从种子密钥值中生成的轮密钥代替4组字节。SubBytes替换用一个代替表替换单个字节。ShiftRows通过旋转4字节行的4组字节进展序列置换。Mi*Columns用域加和域乘的组合来替换字节。有限域GF(28)的加法和乘法正如你所看到的,AES加密算法使用相当简单明了的技术来代替和置换,除Mi*Columns例程以外。Mi*Columns使用特殊的加法和乘法。AES所用的加法和乘法是基于数学〔译者注:近世代数〕的域论。尤其是AES基于有限域GF(28)。
GF(28)由一组从0*00到0*ff的256个值组成,加上加法和乘法,因此是(28)。GF代表伽罗瓦域,以创造这一理论的数学家的名字命名。GF(28)的一个特性是一个加法或乘法的操作的结果必须是在{0*00...0*ff}这组数中。虽然域论是相当深奥的,但GF(28)加法的最终结果却很简单。GF(28)加法就是异或〔*OR〕操作。
然而,GF(28)的乘法有点繁难。正如你稍后将在C*实现中所看到的,AES的加密和解密例程需要知道怎样只用七个常量0*01、0*02、0*03、0*09、0*0b、0*0d和0*0e来相乘。所以我不全面介绍GF(28)的乘法,而只是针对这七种特殊情况进展说明。
在GF(28)中用0*01的乘法是特殊的;它相当于普通算术中用1做乘法并且结果也同样—任何值乘0*01等于其自身。
现在让我们看看用0*02做乘法。和加法的情况一样,理论是深奥的,但最终结果十分简单。只要被乘的值小于0*80,这时乘法的结果就是该值左移1比特位。如果被乘的值大于或等于0*80,这时乘法的结果就是左移1比特位再用值0*1b异或。它防止了“域溢出〞并保持乘法的乘积在围以。
一旦你在GF(28)中用0*02建立了加法和乘法,你就可以用任何常量去定义乘法。用0*03做乘法时,你可以将0*03分解为2的幂之和。为了用0*03乘以任意字节b,因为0*03=0*02+0*01,因此:b*0*03=b*(0*02+0*01)=(b*0*02)+(b*0*01)这是可以行得通的,因为你知道如何用0*02和0*01相乘和相加,同哩,用0*0d去乘以任意字节b可以这样做:[cpp]viewplaincopyb
*
0*0d
=
b
*
(0*08
+
0*04
+
0*01)
=
(b
*
0*08)
+
(b
*
0*04)
+
(b
*
0*01)
=
(b
*
0*02
*
0*02
*
0*02)
+
(b
*
0*02
*
0*02)
+
(b
*
0*01)
在加解密算法中,AESMi*Columns例程的其它乘法遵循大体一样的模式,如下所示:[cpp]viewplaincopyb
*
0*09
=
b
*
(0*08
+
0*01)
=
(b
*
0*02
*
0*02
*
0*02)
+
(b
*
0*01)b
*
0*0b
=
b
*
(0*08
+
0*02
+
0*01)
=
(b
*
0*02
*
0*02
*
0*02)
+
(b
*
0*02)
+
(b
*
0*01)b
*
0*0e
=
b
*
(0*08
+
0*04
+
0*02)
=
(b
*
0*02
*
0*02
*
0*02)
+
(b
*
0*02
*
0*02)
+
(b
*
0*02)
总之,在GF(28)中,加法是异或操作。其乘法将分解成加法和用0*02做的乘法,而用0*02做的乘法是一个有条件的左移1比特位。AES规中包括大量有关GF(28)操作的附加信息。
密钥扩展AES加密和解密算法使用了一个由种子密钥字节数组生成的密钥调度表。AES规中称之为密钥扩展例程〔KeyE*pansion〕。从本质上讲,从一个原始密钥中生成多重密钥以代替使用单个密钥大大增加了比特位的扩散。虽然不是无法抵御的困难,但理解KeyE*pansion仍是AES算法中的一个难点。KeyE*pansion例程高级伪代码如下所示:KeyE*pansion(byte[]key,byte[][4]w){copytheseedkeyintothefirstrowsofwforeachremainingrowofw{usetwoofthepreviousrowstocreateanewrow}}“用前面两行来产生一个新行〞〔“usetwoofthepreviousrowstocreateanewrow〞〕的例程用到了两个子例程,RotWord和SubWord以及一个名为“Rcon〞的常数表〔作为“轮常数〞〕。让我们先来逐个看一下这三东西,然后再回到整个KeyE*pansion的讨论中来。
RotWord例程很简单。它承受一个4个字节的数组并将它们向左旋转一个位置。因为轮调度表w[]有四列,RotWord将w[]的1行左旋。注意KeyE*pansion使用的这个RotWord函数与加密算法使用的ShiftRows〔行位移变换〕例程非常相似,只是它处理的是单行密钥调度w[],而不是整个加密状态表State[]。
SubWord例程使用替换表Sbo*对一给定的一行密钥调度表w[]进展逐字节替换。KeyE*pansion操作中的替换实际上就像在加密算法中的替换一样。被代替的输入字节被分成(*,y)对,它被当作进入替换表Sbo*的索引。举例来说,0*27的代替结果是*=2和y=7,并且Sbo*[2,7]返回0*cc。
KeyE*pansion例程使用一个被称为轮常数表的数组Rcon[]。这些常数都是4个字节,每一个与密钥调度表的*一行相匹配。AES的KeyE*pansion例程需要11个轮常数。你可以在Figure7中看到这些常数清单。
每个轮常数的最左边的字节是GF(28)域中2的幂次方。它的另一个表示方法是其每个值是前一个值乘上0*02,正如前一局部讨论GF(28)乘法时所描述的那样。注意0*80×0*02=0*1b是0*80左移1个比特位后紧接着与0*1b进展异或,如前所述。
现在让我们更进一步看看KeyE*pansion幕中的循环。这里所用的伪码比以前更为详细,这个循环是:[cpp]viewplaincopyfor
(row
=
Nk;
row
<
(4
*
Nr+1);
++row)
{
temp
=
w[row-1]
if
(row
%
Nk
==
0)
temp
=
SubWord(RotWord(temp))
*or
Rcon[row/Nk]
elseif
(Nk
==
8
and
row
%
Nk
==
4)
temp
=
SubWord(temp)
w[row]
=
w[row-Nk]
*or
temp
}
先不要去看if子句,你将看到密钥调度表w[]的每一行都是前面一行与行Nk异或的结果〔4,6,或8取决于密钥的长度〕。if条件的第一局部用SubWord、RotWord以及与轮常数的异或修改密钥调度表的每个第4、第6或第8行,取决于是否密钥的长度是128、192或256位。这个条件的第二局部将修改行12、20和28等等——对于256位密钥而言——每一个第8行都将添加密钥调度额外的可变性。
让我们用本文开头所举的例子来考察KeyE*pansion是如何开场的。种子密钥是192-bit/6-word值:000102030405060708090a0b0c0d0e0f1011121314151617密钥调度字节表w[]的维数是4列并且Nb×(Nr+1)等于4×(12+1),或52行。KeyE*pansion将种子密钥的值拷贝到密钥调度字节表w[]的第一行。因为我的种子密钥是192位〔24字节〕,并且w[]表总是4列,在这种情况下KeyE*apansion将种子密钥拷贝到w[]的前面6行。现在让我们看看KeyE*apansion例程是如何填充密钥调度表其余局部的。在我的例子里,第一个被计算的行是第6行,因为第0-5行已被种子密钥的值填上了:temp=w[row-1]=14151617条件(row%Nk==0)为真,因此首先RotWord子程序被应用:
temp=15161714这时SubWord被应用:temp=5947f0fa用Rcon[row/Nk]=Rcon[6/6]=01000000进展异或:temp=5847f0fa这时用w[row-Nk]=w[6-6]=00010203异或,产生了下面结果:w[6]=5846f2f一.AES对称加密:AES加密分组二.分组密码的填充分组密码的填充PKCS*5填充方式三.流密码四.分组密码加密中的四种模式:3.1ECB模式优点:1.简单;2.有利于并行计算;3.误差不会被传送;缺点:1.不能隐藏明文的模式;2.可能对明文进展主动攻击;3.2CBC模式:优点:1.不容易主动攻击,平安性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。缺点:1.不利于并行计算;2.误差传递;3.需要初始化向量IV3.3CFB模式:优点:1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送小于分组的数据;缺点:1.不利于并行计算;2.对明文的主动攻击是可能的;3.误差传送:一个明文单元损坏影响多个单元;优点:1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送小于分组的数据;缺点:1.不利于并行计算;2.误差传送:一个明文单元损坏影响多个单元;3.唯一的IV;3.4OFB模式:下面是例如代码:[java]viewplaincopypackage
mini.code.test.t20210810;
import
java*.crypto.*;
import
java*.crypto.spec.*;
publicclass
AES
{
publicstatic
String
asHe*(byte
buf[])
{
StringBuffer
strbuf
=
new
StringBuffer(buf.length
*
2);
int
i;
for
(i
=
0;
i
<
buf.length;
i++)
{
if
(((int)
buf[i]
&
0*ff)
<
0*10)
strbuf.append("0");
strbuf.append(Long.toString((int)
buf[i]
&
0*ff,
16));
}
return
strbuf.toString();
}
publicstaticvoid
main(String[]
args)
throws
E*ception
{
String
message
=
"这是个加密的例子";
System.out.println("
原文:
"
+
message);
System.out.println("
原文转换格式显示:"
+
asHe*(message.getBytes()));//
string=?byte=?He*
//
======生成密码
KeyGenerator
kgen
=
KeyGenerator.getInstance("AES");//
获取密
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政岗面试试题及答案
- 西医临床研究性试题及答案解读
- 2024学年六年级语文下册第一单元5手指教案1含反思新人教版
- 2024年五年级语文下册第五单元17爱如茉莉教案2苏教版
- 探讨光电工程师证书考试的学习习惯培养试题及答案
- 药剂学中常见错误及避免策略试题及答案
- 2024-2025学年二年级语文下册第五单元课文412寓言二则作业设计新人教版
- 2024-2025学年九年级历史与社会上册第二单元开辟新的发展道路第二课民族民主运动的高涨教案人教版
- 教师资格笔试前瞻性思考试题及答案
- 工程造价岗试题及答案
- 中考语文古诗欣赏试题汇编(课内古诗比较阅读)(截至2024)
- 云梯车作业交底
- 《孙权劝学》历年中考文言文阅读试题40篇(含答案与翻译)(截至2024年)
- 全国飞盘运动竞赛规则(试行)
- 新型可瓷化膨胀防火涂料的制备及性能研究
- DB11-T 367-2021 地下室防水技术规程
- 《机械设计课程设计》课程标准
- 2025年贵州高速集团有限公司招聘笔试参考题库含答案解析
- 2025版融资租赁合同履行监管服务合同3篇
- 肺结核防治知识培训课件
- 《基于作业成本法的S公司物流成本分析研究》8300字(论文)
评论
0/150
提交评论