关闭

关闭

关闭

封号提示

内容

首页 AES算法的实现与分析.doc

AES算法的实现与分析.doc

AES算法的实现与分析.doc

上传者: ltcy 2011-09-19 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《AES算法的实现与分析doc》,可适用于IT/计算机领域,主题内容包含、AES简介课程设计(论文)AES算法的实现与分析年摘要随着现代密码分析水平、芯片处理能力和计算技术的不断进步高级加密标准AES的Rijndael算符等。

、AES简介课程设计(论文)AES算法的实现与分析年摘要随着现代密码分析水平、芯片处理能力和计算技术的不断进步高级加密标准AES的Rijndael算法将在各行业各部门获得广泛的应用成为虚拟专用网、SONET、远程访问服务器、高速ATM以太路由器、移动通信、卫星通信、电子金融业务等的加密算法并逐渐取代DES在IPSec、SSL和ATM中的加密功能。目前IEEEi草案已经定义了AES加密的两种不同运行模式成功解决了无限局域网标准中的诸多安全问题。在这种情形下AES算法的安全性及其快速实现问题显得格外突出本文对此进行了全面的论述希望能为有意进行这一方面研究和应用的同行提供有益的参考。文章阐述了Rijndael算法的设计特色介绍了AES在密码分析方面国内外已有的一些理论分析成果描述了AES算法采用软件和硬件实现方案。此外本文章从数学基础的知识上阐明了AES算法的四个步骤。从AES算法抵抗强力攻击能力抵抗差分分析和线性密码分析的能力抵抗渗透攻击能力抵抗代数计算攻击能力抵抗XSL攻击能力弱密钥的分析这几个方面进行了分析从而说明AES的安全性能。我们根据算法的安全性、代价以及算法与实现特性的原则实现了AES的算法从密钥编排方案分析了密钥的设计准则和选取。关键词:AES算法加密解密安全性能分析AbstractWiththemoderncodeofthelevelofanalysis,processingpowerandchiptechnologyadvances,AESRijndaelalgorithminvariousindustriesanddepartmentstoobtainawiderangeofapplications,virtualprivatenetworksbecome,SONET,remoteaccessservers,highspeedATMEthernetrouters,mobilecommunications,satellitecommunications,electronicfinancialservicessuchasencryptionalgorithm,AndgraduallyreplacedbyDESinIPSec,SSLandencryptionintheATMAtpresent,IEEEidraftdefinitionoftheAESencryptionhastwodifferentmodesofoperation,thesuccessfulresolutionofanunlimitednumberoflocalareanetworkstandardofsafetyInthiscase,AESalgorithmforthesafetyofitsrapidrealizationoftheproblemisparticularlyprominentinthisarticlehaveconductedathoroughdiscussioninthehopeofintentiontoconductthestudyandapplicationofpeertoprovideausefulreferenceThearticledescribesthedesigncharacteristicsoftheRijndaelalgorithm,introducedattheAEScodeanalysisathomeandabroadhavebeensomeofthetheoreticalanalysisoftheresultsoftheAESalgorithmusedtodescribesoftwareandhardwaretoachievefastprogramInaddition,thearticlefromthemathematicalknowledgebasedAESalgorithmonasetoffourstepsAESalgorithmresistancefrompowerfulattackcapabilityagainstdifferentialcryptanalysisandlinearanalysisoftheabilitytoresistinfiltrationattackcapability,theabilitytoresistattacksoncalculatealgebra,theabilitytoresistattacksXSL,weakanalysisofthesekeyaspectsoftheanalysisthatinordertoAESSafetyperformanceAccordingtothesecurityofouralgorithm,aswellasthecostofalgorithmandimplementationoftheprinciplecharacteristicsoftherealizationoftheAESalgorithmFromtheanalysisofthekeyprogramsscheduledforthekeycriteriaforthedesignandselectionKeywords:AESalgorithmEncryptionDecryptSafetyPerformanceAnalysis目录TOCo""hzuHYPERLINKl"Toc"第一章绪论HYPERLINKl"Toc"题目背景HYPERLINKl"Toc"AES算法密码分析的进展HYPERLINKl"Toc"第二章基础设置HYPERLINKl"Toc"AES简介HYPERLINKl"Toc"AES算法的分析HYPERLINKl"Toc"AES和Rijndael的区别HYPERLINKl"Toc"AES的结构HYPERLINKl"Toc"AES算法的设计原理HYPERLINKl"Toc"AES算法的框架描述HYPERLINKl"Toc"AES加、解密的输入输出HYPERLINKl"Toc"AES加密算法实现的理论分析HYPERLINKl"Toc"轮的数目的设定HYPERLINKl"Toc"轮变换HYPERLINKl"Toc"密钥扩展(KeyExpansion)HYPERLINKl"Toc"字节替换(SubBytes)HYPERLINKl"Toc"行位移变换(ShiftRows)HYPERLINKl"Toc"列混合变换(MixColumns)HYPERLINKl"Toc"密钥加变换(AddRoundKey)HYPERLINKl"Toc"解密HYPERLINKl"Toc"两轮AES的解密HYPERLINKl"Toc"代数性质HYPERLINKl"Toc"第三章AES的实现HYPERLINKl"Toc"软件系统概述HYPERLINKl"Toc"AES的C实现HYPERLINKl"Toc"第四章AES算法的抗攻击能力分析HYPERLINKl"Toc"AES算法抵抗强力攻击能力分析HYPERLINKl"Toc"AES算法抵抗差分分析和线性密码分析的能力分析HYPERLINKl"Toc"AES算法抵抗渗透攻击能力分析HYPERLINKl"Toc"AES算法抵抗代数计算攻击能力分析HYPERLINKl"Toc"AES算法抵抗XSL攻击能力分析HYPERLINKl"Toc"结论HYPERLINKl"Toc"工作分工和安排HYPERLINKl"Toc"小组成员个人心得HYPERLINKl"Toc"参考文献HYPERLINKl"Toc"附录第一章绪论题目背景科技的发展特别是网络的发展使计算机深入到了各行各业的方方面面计算机在带来方便和提高了工作效率的同时却也带来了各种各样的新问题其中信息安全问题最为突出随着计算机信息安全要求的不断提高,计算机保密系统已变得越来越重要密码学应用不再是局限于军事、国防等有限领域而是迅速的走进了千家万户。AES算法密码分析的进展年亚洲密码分析研讨会上Courtois提出一种称为XSL攻击的分组密码分析新方法主要思想是用一系列次数低、方程数大于变元数的超定方程组来描述密码系统通过解方程组来破解分组密码。同年美洲密码分析研讨会上Murphy设计了一种新的算法BES(BigEncryptionSystem)将AES中GF()和GF()上的两种域运算归结为域GF()上的运算使AES成为某种消息空间和密钥空间下的BES通过研究形式更为简洁的BES可以更清晰地了解AES算法内部的数学结构。年第期《科学》杂志高度评价了这两个最新分析成果。中国的研究人员也对AES算法进行了大量研究分析。吴文玲用能量攻击对Rijndael算法进行了分析攻击复杂度在到之间大大降低了攻击的规模曾祥勇等用布尔函数的迹表示给出置换函数的表达式对由幂函数合成可逆仿射变换产生的S盒间的关系进行了研究李娜通过研究q多项式的性质给出了一种求解S盒代数表达式的简易算法具有可预先计算、操作简单的特点和一定的通用性并对曾祥勇提出的一类S盒进行了仿射等价划分明确了这些S盒间的相互关系冯国柱对Rijndael算法作了变动和改进使新算法在不降低抗差分攻击性能、牺牲少许密钥装填速度的情况下提高统计效果并可部分抵抗Square攻击胡辛征研究发现Rijndael算法S盒在有限域GF()上的迭代循环周期过短设计了一种新的仿射变换对之加以改进曾游调整Rijndael算法轮变换的顺序采用密钥的变形形式通过合理安排求取密钥的顺序利用密钥相关性将轮简化算法的密钥穷尽量减少到。韦宝典利用Walsh谱理论分析Rijndael算法S盒的严格雪崩特性、扩散特性和相关免疫性等密码性质提出了广义自相关函数的概念解决了严格雪崩准则和扩散准则阶数的确定问题基于等价类的划分、线性方程组的求解和标准基之对偶基的计算给出了域元素分量代数表达式的种求法提出了一种基于生日悖论、利用活动性进行攻击的新方法指出了Square攻击是不成功的并给出了修正攻击方案。第二章基础设置AES算法是一些相当复杂的运算虽然本文要实现的只是位处理器上实现位的运算但还是很有必要采用模块化思想按照层次结构来设计及实现一些其它的辅助函数而不是把它们内嵌在算法函数内这样既能够避免算法函数的程序代码的过分冗长、使代码清晰易懂、突出算法过程又能够使程序易于测试、排错、更新和复用。由于本文重点在乘法类算法下面只介绍一些关键的辅助函数其它辅助函数要到相关算法使用到时再简略介绍。AES简介随着对称密码的发展DES用软件实现速度相对较慢它使用的位分组长度显得不够高效和安全的缺点使得需要一种新的高级加密标准来替代它。AES的全称是AdvancedEncryptionStandard即高级加密标准。该项目由美国国家标准技术研究所(NIST)于年开始启动并征集算法在年确定采用Rijndael作为其最终算法并于年被美国商务部部长批准为新的联邦信息加密标准(FIPSPUB)该标准的正式生效日期是年月日。年月日NIST对Rijndael做出了最终评估。AES是一个迭代的、对称密钥分组的密码它可以使用、和位密钥并且用位(字节)分组加密和解密数据。与公共密钥密码使用密钥对不同对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构在该循环中重复置换(permutations)和替换(substitutions)输入数据。AES算法的分析一个密码算法的有效性首先体现在可靠的安全性上。Rijndael算法设计采用针对差分和线性密码分析提出的宽轨迹策略(WTS)其最大优势是可以给出算法最佳差分特征的概率以及最佳线性逼近偏差的界使用简单的部件组织成清晰的结构便于算法安全性的分析。当然在密码学界永远没有绝对的安全Rijndael算法也不例外如其明显的代数结构对安全性的潜在威胁已经受到一些学者的质疑。本文从简化算法攻击、算法结构性质分析以及密码分析的进展等方面对AES算法的密码分析状况进行讨论。简化算法攻击目前尚未出现对完整Rijndael算法的成功攻击只提出了几种针对简化算法的攻击方法。最有名的当数密码设计者自己提出的Square攻击其主要思想是利用第轮字节替换前后平衡性的改变来猜测密钥字节对比特密钥下到轮简化算法有效。Biham等对Square攻击进行改进时间复杂度降为原来的一半并认为颠倒轮密钥的顺序可将攻击复杂度降低。Lucks利用密钥生成算法的弱点将Square攻击的密钥长度扩展到和比特攻击轮简化算法比穷尽搜索快。Ferguson利用“部分和”技术将轮Square攻击的复杂度从降到并推广到轮和轮简化算法指出密钥生成算法中几个违背设计准则的特性利用慢扩散性设计了一个针对比特密钥下轮简化算法的密钥相关攻击方案。Gilbert利用局部函数间的冲突特性对到轮简化算法进行了攻击。Cheon等将轮不可能差分攻击推广到轮复杂度高于相应的Square攻击但仍快于密钥穷尽搜索。Koeune描述了一种计时攻击通过对每个密钥数千次的测量展现攻破一个不良的现实设计的过程。Golic则指出AES算法虽然能够通过乘法掩盖来抵抗简单能量攻击(SPA)对差分能量攻击(DPA)却无能为力。算法结构性质分析密码代数结构的任何弱点都将有利于密码的分析和破译。因此在对Rijndael简化算法进行攻击尝试的同时人们也把相当多的精力集中到算法内部结构各种性质的研究上。Ferguson给出了Rijndael算法一个直观而紧凑的代数表示形式Filiol则将算法的每一输出比特看作以明文比特和密钥比特为变量的布尔函数用Mōbius变换将之计算出来研究其低次项的分布情况比较与完全随机的布尔函数代数正规式的差异结果发现Rijndael算法布尔函数的随机特性并不十分理想。Barkan替换算法中的不变常量(如既约多项式、列混合运算中的系数和S盒中的仿射变换)产生新的等价对偶密码(平方对偶、对数对偶和自对偶等数百种之多)。在此基础上可以选择比原算法快的对偶算法在加解密中使用不同的对偶密码或每次随机选择不同的对偶密码以抵抗错误攻击和能量攻击。但是由于对偶密码的结构容易分析并易于转换成原算法可能会有助于实施差分或线性攻击所以对偶密码的存在也可能是对Rijndael算法的一种潜在威胁。Song为SPN分组密码引入了替换差分的概念研究S盒替换距离的分布特性并认为如果知道给定分组密码S盒的替换距离便可在密码分析中选择有一定输入差分的明文来确定可能的密钥这种分析方法不依赖于密钥可用于分析Rijndael算法的第轮。Fuller等指出Rijndael算法S盒的分量函数之间存在等价关系。这种等价关系有助于降低S盒硬件实现成本但从安全角度看可能会引发对Rijndael算法的攻击。他们利用布尔函数局部结构中的相邻特性通过寻找等价参数、a、b和c的方法间接证明了分量函数之间的等价关系。Youssef则将S盒分量函数间的等价关系推广到整个轮函数。Murphy发现任何明文或明文差分经过Rijndael算法线性扩散层轮迭代后会重现Wernsdorf则指出Rijndael算法的轮函数构成交换群。AES和Rijndael的区别Rijndael和AES之间的唯一差别在于各自所支持的分组长度和密码密钥长度的范围不同。Rijndael是具有可变分组长度和可变密钥长度的分组密码。其分组长度和密钥长度均可独立地设定为比特的任意倍数最小值为比特最大值是比特。我们可以定义具有更大分组长度和密钥长度的各种版本的Rijndael但目前似乎没有必要。AES将分组长度固定为比特而且仅支持、或比特的密钥长度。在AES的选择过程中Rijndael所具有的额外的分组长度和密钥长度没有评估。因此这定在当前的FIPS标准中也为被采用。AES的结构Rijndael是一个密钥迭代分组密码包含了轮变换对状态的重复作用。用表示轮数它依赖于分组长度和密钥长度。值得注意的是本章中的轮变换包含了密钥加法这一点与()~()式的定义相反。这样做的目的是使本章的描述与FIPS标准相一致。根据BGladman的建议我们对最初所提交的AES提案中描述的一些步骤的名称进行了修改。这些新的名称更加统一已被FIPS标准采用。同时也做了更进一步的改进均为了使描述更加清楚、全面但对分组密码本身没有做任何改变。Rijndael的加密过程包括一个初始密钥加法记作AddRoundKey接着进行次轮变换Round最后再使用一个轮变换FinalRound。初始的密钥加法和每个轮变换均以状态State和一个轮密钥作为输入。第i轮的轮密钥记为ExpandedKeyi初始密钥加法的输入记为ExpandedKey。从CipherKey导出ExpandedKey的过程记为KeyExpansion。Rijndael的高级语言伪C符号描述见列表。列表使用Rijndael进行加密的高级算法Rijndael(State,Cipherkey){KeyExpansion(CipherKey,ExpandedKey)AddRoundKey(State,ExpandedKey)For(i=i<i)Round(State,ExpandedKeyi)FinalRound(State,ExpandedKey)}AES算法的设计原理GF()中乘法使用的多项式是次不可约多项式列表中的第一个多项式。ByteSubstitution(称为S盒)在设计时考虑到抵抗差分密码分析、线性密码分析的要求应满足以下条件:可逆性输入比特的线性组合与输出比特的组合之间的最大非平凡相关性的极小化异或差分表中最大非平凡值的极小化GF()中代数表示的复杂性描述的简单性。满足前条准则的S盒的构造方法已被给出AES的作者从众多候选构造中选择将x映射到它的逆的S盒。该映射过于简单为了抵抗插入攻击加入仿射变换:模数多项式选择为可能是最简单的模数多项式。可以找到其它的S盒满足以上准则。MixColumn变换符合以下准则:可逆性GF()中的线性性适当的扩散性能位处理器上实现速度快对称性描述的简单性。选择模数多项式可满足准则、、。准则、、要求系数的值要小故选、、、。ByteRotation符合以下准则:个位移量互不相同且能抵抗差分截断攻击能抗Square攻击简单。从满足准则和准则出发AES的作者选取了最简单的组合。AES算法的框架描述Rijndael算法是一个可变数据块长和可变密钥长的分组迭代加密算法数据块长和密钥长可分别为或比特但为了满足AES的要求分组长度为比特密钥长度为或比特。AES密码算法采用的是代替一置换网络(SPN)结构每一轮操作由层组成:第层(字节替换)为非线性层用S盒对每一轮中的单个字节分别进行替换第层(行移位)和第层(列混合)是线性混合层对当前的状态阵按行移位按列混合第层(密钥加层)用子密钥与当前状态阵进行字节上的异或。具体算法结构如图所示。图中(a)图给出了算法的整体结构输入明文x与子密钥I(异或然后经过r轮迭代最终生成密文Y其中第到r一轮迭代结构为图(b)第r轮与前面各轮稍微有点不同缺少混合层。AES加、解密的输入输出Rijndael的输入输出可看作位字节的一维数组。对加密来说其输入是一个明文分组和一个密钥输出是一个密文分组。对解密而言输入是一个密文分组和一个密钥而输出是一个明文分组。Rijndael的轮变换及其每一步均作用在中间结果上我们将该中间结果称为状态。状态可以形象地表示为一个矩形的字节数组该数组共有行。状态中的列数记为它等于分组长度除以将明文分组记为其中表示第一个字节表示明文分组的最后一个字节。类似地将密文分组记为将状态记为这里表示位于第i行第i列的字节。输入字节依次映射到状态字节上。当加密是输入是一个明文分组映射是当解密是输入是一个密文分组映射是在加密结束时密文分组以相同的顺序从状态字节中取出在解密结束时明文分组按以下顺序从状态中得到类似地密钥被映射到两维密码密钥上。密码密钥可以形象地表示为一个与状态类似的矩形数组该数组也有行。密码密钥的列数记为它等于密钥长度除以。密钥的各字节被依次映射到密码密钥的各字节上:。如果将密钥记为那么状态与密码密钥的表示以及明文状态与密钥密码密钥的映射如图所示当=、=时状态和密码密钥的大致分布AES加密算法实现的理论分析AES中的操作均是以字节作为基础的用到的变量也都是以字节为基础。State可以用的矩阵表示。AES算法结构对加密和解密的操作算法由轮密钥开始并用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表所示)。AES算法的主循环State矩阵执行轮迭代运算每轮都包括所有个阶段的代换分别是在规范中被称为SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换)和AddRoundKey(由于外部输入的加密密钥K长度有限所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串以生成各轮的加密和解密密钥。)最后执行只包括个阶段(省略MixColumns变换)的最后一轮运算。表AES参数密钥长度(bits)明文分组长度(bits)轮数每轮密钥长度(bits)扩展密钥长度(bytes)轮的数目的设定当前的密码分析研究表明迭代型分组密码抗击密码分析攻击的能力随轮数的增加而增加。我们通过考虑抗击捷径攻击来确定轮的数目因为捷径攻击明显比穷尽密钥搜索攻击更有效。在此基础上又增加了一个适当的安全余量。对分组长度和密钥长度均是比特的Rijndael我们尚未发现能够对具有六轮以上的简化版本实施的捷径攻击又增加轮作为安全余量。这是一个保守的做法因为:Rijndael中两轮即可提供以下意义上的“全扩散”。每个状态比特均依赖与两轮之前的所有状态比特或者一个状态比特的改变均可能对两轮之后的半数状态比特产生影响。在增加轮可以看作是在密码的开始和结束时增加了一个“全扩散步骤”。Rijndael轮变换的高扩散性归功于它在所有状态比特上的均匀结构。对于所谓的Feistel密码没轮仅对半数的状态比特进行作用三轮后才可以获得全扩散。在实际中这种密码一般采用四轮或更多。为了攻击密码的第n或n轮相信密码分析,差分密码分析和截短差分析攻击通常采用一个直到n轮的传播轨迹。渗透攻击也是如此它利用一个四轮的传播结构来攻击六轮。在这方面我们增加四轮实际上使得找到一个传播轨迹所遍历的轮数增加一倍。对于具有较长密钥的Rijndael版本密码密钥每增加比特伦德数目就增加一轮。原因如下:主要目的之一是是比穷举密钥搜索攻击更有效的捷径攻击失效。因为穷举密钥搜索的工作量随密钥长度的增加而增加而捷径攻击对具有更长密钥的密码的攻击效率不高。(部分的)已知密钥和相关密钥攻击利用了密码密钥中的比特信息或者具有利用不用密码密钥的能力。如果增加密码密钥的长度密码分析者的搜索范围也将随之增加。关于具有更长密钥的Rijndael的安全性研究文献已经表明这一策略带来了足够的安全余量。而对具有较长分组的Rijndael版本分组长度每增加比特轮的数目就增加一轮。理由如下:如果密码的分组长度大于比特就采用三轮来实现全扩散这是因为轮变换的扩散能力将随分组长度的增加而降低。更大的分组长度将增加可能出现的模式的选取范围这些模式可用在某几轮的输入输出上。这一附加的灵活性可使攻击所必须处理的范围扩大一轮或者几轮。对于具有更大分组长度比特的Rijndael版本我们已经发现即使将攻击的处理范围扩大一轮也难以实现。因此这是一个保守的余量。表列出了作为和函数的值。对于AES取固定值为对于比特的密钥(=)=对于比特的密钥(=)=对于比特的密钥==表对不用的(=分组长度)和(=分组长度)轮的个数值轮变换轮变换Round由个变换组成其中的每个变换称为步骤如列表所示。该密码的最后一轮FinalRound稍有不同也如列表所示。在这个列表中变换(RoundSubBytesShiftRows,…)作用在指针(StateExpndedKeyi)所指向的数组上。容易验证:若将Round变换中的MixColumns步骤去掉则它等价于FinalRound变换。这些步骤以及每一步所采用的设计准则将在下面的各节中详细讨论。除了具体到可不的准则以外还采用了以下两个通用的设计准则:可逆性。Rijuael轮变换的结构要求所有步骤都是可逆的。简单性。我们更倾向于使用简单的组件而避免负责组件。列表Rijufael的轮变换Round(State,ExpandedKeyi){SubBytes(State)ShiftRows(State)MixColumns(State)AddRoundKey(State,ExpandedKeyi)}FinalRound(State,ExpandedKey){SubBytes(States)ShiftRows(States)AddRoundKEY(States,ExpandedKey)}密钥扩展(KeyExpansion)为了防止已有的密码分析攻击AES使用了与轮相关的轮常量(Rconj是一个字这个字的右边三个字节总为)防止不同轮中产生的轮密钥的对称性或相似性。AES在加密和解密算法使用了一个由种子密钥字节数组生成的密钥调度表AES规范中称之为密钥扩展例(KeyExpansion)。密钥扩展例程从一个原始密钥中生成多重密钥以代替使用单个密钥大大增加了比特位的扩散在AES密钥扩展算法的输入值是字密钥输出是一个字的一一维线性数组。这足以为初始轮密钥扩展例程阶段和算法中的其他轮中的每一轮提供字节的轮密钥。通过生成器产生轮轮密钥每个轮密钥由个字组成共有个字Wii=…。在加密过程中需要个子密钥需要构造个位字。Rijndael的密钥扩展方案的伪码描述如下:KeyExpansion(bytekey*Nk,wordwNb*(Nr),Nk){Nk代表以位字为单位的密钥的长度及Nk=密钥长度begini=while(I<Nk)wi=wordkey*i,key*i,key*i,key*ii=iendwhilei=Nkwhile(i<Nb*(Nr))wordtemp=wiif(ImodNk=)temp=SubWord(RotWord(temp))xorRconiNkelseif(Nk=andImodNk=)temp=SubWord(temp)endifwi=wiNkxortempi=iendwhileend}其中key和w分别用于存储扩展前扩展后的密钥。SubWord()、RotWord()分别是与S盒的置换和以字节为单位的循环移位。。前个轮常数RCi的值(用十六进制表示)如表所示其对应的Rconi如表所示。表RCiiRCib表RconiIRconiIRconib输入密钥直接被复制到扩展密钥数组的前四个字中得到w、w、w、w然后每次用四个字填充扩展密钥数组余下的部分。在扩展密钥数组中wi的值依赖于wi和wi(i)。对w数组中下标不为的倍数的元素只是简单地异或其逻辑关系为:(i不为的倍数)对w数组中下标为的倍数的元素采用如下的计算方法:将一个字的四个字节循环左移一个字节即将字变为基于S盒对输入字中的每个字节进行S代替:将步骤和步骤的结果再与轮常量Rconi相异或。字节替换(SubBytes)AES定义了一个S盒State中每个字节按照如下方式映射为一个新的字节:把该字节的高位作为行值低位作为列值然后取出S盒中对应行和列的元素作为输出。例如十六进制数{}。对应S盒的行是列是S盒中该位置对应的值是{F}。S盒是一个由x字节组成的矩阵包含了位值所能表达的种可能的变换。S盒按照以下方式构造:逐行按照升序排列的字节值初始化S盒。第一行是{}{}{}…{OF}第二行是{}{l}…{F}等。在行X和列Y的字节值是{xy}。把S盒中的每个字节映射为它在有限域GF()中的逆。GF代表伽罗瓦域GF()由一组从x到xff的个值组成加上加法和乘法。。{}被映射为它自身{}。把S盒中的每个字节记成。对S盒中每个字节的每位做如下变换:上式中是指值为{}字节C第i位即。符号()表示更新后的变量的值。AES用以下的矩阵方式描述了这个变换:行位移变换(ShiftRows)State的第一行字节保持不变State的第二行字节循环左移一个字节State的第三行字节循环左移两个字节State的第四行循环左移三个字节。变化如图所示。列混合变换(MixColumns)列混合变换是一个替代操作是AES最具技巧性的部分。它只在AES的第…Nr一轮中使用在第Nr轮中不使用该变换。乘积矩阵中的每个元素都是一行和一列对应元素的乘积之和。在MixColumns变换中乘法和加法都是定义在GF()上的。State的每一列()i=…,J=…被理解为GF()上的多项式该多项式与常数多项式相乘并模约化。这个运算需要做GF()上的乘法。但由于所乘的因子是三个固定的元素、、所以这些乘法运算仍然是比较简单的(注意到乘法运算所使用的模多项式为)。设一个字节为b=(bbbbbbbb)则b‘’=bb‘’=(bbbbbbb)(bbbb)b‘’=b‘’b’’。(请注意加法为取模的加法即逐比特异或)写成矩阵形式为:密钥加变换(AddRoundKey)AddRoundKey称为轮密钥加变换位的State按位与位的密钥XOR:对j=…L轮密钥加变换很简单却影响了State中的每一位。密钥扩展的复杂性和AES的其他阶段运算的复杂性却确保了该算法的安全性。解密解密算法可通过直接利用步骤InvSubBytes、InvShiftRows、InvMixCloumns和AddRoundKey的逆并倒置其次序而得到此算法称为直接解密算法。在这个算法中不仅步骤本身与加密不同而且步骤出现的顺序也不相同。为了便于实现通常将惟一的非线性步骤(SubBytes)放在轮变换的第一步(见第四章)我们在设计时已经考虑到这一点。Rijndael的结构使得有可能定义一个等价的解密算法其中所使用的步骤次序与加密相同只是将每一步改成它的逆并改变密钥编排方案。注意这种结构上的一致性不同于采用Feistel结构的许多密码中的组件和结构的一致性IDEA也是一样。两轮AES的解密两轮Rijndael的直接解密算法依次由FinalRound的逆、Round的逆和密钥加法组成。Round的逆变换记作InvRoundFinalRound的逆记作InvFinalRound这两个变换均在列表中描述。列表给出了两轮Rijndael的直接解密算法。列表直接解密算法的轮变换InvRound(State,Expandedekyi){AddRounddeky(State,Expandedkeyi)InvMixCloumns(State)InvShiftRows(State)InvSubBytes(State)}InvFinalRound(State,Expandedeky){AddRounddeky(State,Expandedkey)InvShiftRows(State)InvSubBytes(State)}列表两轮AES的直接解密算法AddRounddeky(State,Expandedkey)InvShiftRows(State)InvSubBytes(State)AddRounddeky(State,Expandedkey)InvMixCloumns(State)InvShiftRows(State)InvSubBytes(State)AddRounddeky(State,Expandedkey)代数性质为了得到等价的解密算法我们利用了一些步骤的以下两个性质:InvShiftRows和InvSubBytes的次序无关紧要。如果调整相应的轮密钥AddRoundKey和InvMixColumns的次序可以颠倒。对第一个性质可做如下解释:InvShftRows只对字节进行换位而不影响字节的值。InvSubBytea作用在单字节上而与这些字节的位置无关。因此这两步可以交换。对第二个性质的解释有些巧妙。对于任意的线性变换A:xy=A(x),有定义:A(xk)=A(x)A(k)由于步骤AddRoundKey仅将常量ExpandedKeyi与其输入相加而且InvMixColumns是一个线性运算因此步骤AddRounddeky(State,Expandedkeyi)InvMixCloumns(State)可用以下等价的步骤来代替:InvMixCloumns(State)AddRounddeky(State,Expandedkeyi)其中,Expandedkeyi通过将InvMixCloumns作用于,Expandedkeyi上而得到。第三章AES的实现软件系统概述AES不但具有良好的安全性,但而且适合在多种处理器办软件编程上方便快捷的实现。本文是基于位操作系统下用VisualC软件开放了一个界面友好的MFC平台。下面介绍AES的典型软件实现的主要方法和遇到的问题。程序界面:程序功能介绍:本程序分为两部分一部分是字符串加密解密另一部份是文本加密解密。字符串加密部分可以选择密钥长度:分别为、、比特并且可以自己设置密码。然后只要在待加密的字符串窗口中输入要加密的字符串就可以相应的进行加密解密。以密码长度选bits设置为文本加密部分能够入*txt格式的文本然后按比特每组分组进行加密再保存为*txten文本以和原来文本区分解密时即需要导入以*txten为后缀的文本解密后保存为*txtende文本。如下图所示:AES的C实现对AES的C实现这里只做加密过程解密过程是按相反的顺序进行逆变换的加密。cipher是加密和解密时使用的算法。首先对出现在代码中的变量和函数做一下介绍如表所示以便读程序的过程更加方便。首先声明一个Aes的类功能描述:以面向对象的方式建立了一个类对象包含了AES加密过程中要实现各项功能的函数这样能够清晰的看到整个加密程序的结构有利于对程序的模块化管理。实现代码:classAes{public:~Aes()Aes()Aes()构造函数用密钥长度keySize和密钥内容keyBytes作为参数。voidCipher()加密函数input为位为要加密的明文InvCipher()解密函数input为位要解密的密文private:intNbintNkintNrunsignedcharkeyunsignedcharw*SetNbNkNr(intkeySize)设置轮数AddRoundKey(intround)轮密钥加SubBytes()S盒字节代换InvSubBytes()逆S盒字节代换ShiftRows()行移位InvShiftRows()MixColumns()列混淆InvMixColumns()KeyExpansion()密钥扩展unsignedchar*SubWord(unsignedchar*word)密钥S盒字代换unsignedchar*RotWord(unsignedchar*word)密钥移位}成员函数的实现:迭代分组列数、密钥列数、迭代次数设置函数功能描述:因为AES分组长度为bitsNb固定为。再根据界面密钥长度窗口keySize的选择判断是密钥是、、比特然后设置密钥列数Nk然后可得到Nr。(根据第章“轮数的确定”一节)实现代码:Aes::SetNbNkNr(intkeySize){Nb=if(keySize==Bits){Nk=*字节位密钥轮加密Nr=}elseif(keySize==Bits){Nk=*字节位密钥轮加密Nr=}elseif(keySize==Bits){Nk=*字节位密钥轮加密Nr=}}构造函数功能描述:实现了设置密钥块数轮数并且将设定了密码和为密钥扩展提前做的初始化。实现代码:Aes::Aes(intkeysize,unsignedchar*keyBytes){SetNbNkNr(keysize)设置密钥块数轮数memcpy(key,keyBytes,keysize)字符串拷贝函数把keyBytes的keysize个字符复制到key中KeyExpansion()密钥扩展必须提前做的初始化}密钥扩展函数功能描述:加密和解密过程分别需要Nr个子密钥。所以需要对密钥进行扩展。实现方式:主密钥的扩展首先将从界面输入的子密钥拷贝并按一维数组排成*Nk矩阵然后取Nk列进行RotWord()移位变换将第一位移到第四位再进行SubWord()字节代换最后再和上一个密钥的第列做模二加法得到新的子密钥块的第列密钥然后第、、列是直接由前一列和上一子密钥模二加法得到。实现代码:Aes::KeyExpansion(){memset(w,,*)for(introw=row<Nkrow)拷贝seed密钥{w*row=key*roww*row=key*roww*row=key*roww*row=key*row}byte*temp=newbytefor(row=Nkrow<*(Nr)row){temp=w*row当前列的前一列temp=w*rowtemp=w*rowtemp=w*rowif(rowNk==)逢nk时对当前列的前一列作特殊处理{temp=SubWord(RotWord(temp))先移位再代换最后和轮常量异或temp=(byte)((int)temp^(int)AesRcon*(rowNk))temp=(byte)((int)temp^(int)AesRcon*(rowNk))temp=(byte)((int)temp^(int)AesRcon*(rowNk))temp=(byte)((int)temp^(int)AesRcon*(rowNk))}elseif(Nk>(rowNk==))这个还没有搞清楚{temp=SubWord(temp)}wrow=wrowNkxortempw*row=(byte)((int)w*(rowNk)^(int)temp)w*row=(byte)((int)w*(rowNk)^(int)temp)w*row=(byte)((int)w*(rowNk)^(int)temp)w*row=(byte)((int)w*(rowNk)^(int)temp)}forloop}轮密钥加功能描述:在每一轮的加密过程实现了将分组的待加密字符串的第一列与一个密钥字进行按位异或。实现代码:Aes::AddRoundKey(intround){inti,ji行j列因为密钥w是一列一列排列的即kkkkfor(j=j<j)kkkk{kkkkfor(i=i<i)kkkk{所以i行j列的下标是*((round*)j)i即*round*jiStateij=(unsignedchar)((int)Stateij^(int)w*((round*)j)i)}}}字节代换函数功能描述:字节代换是基于S盒(见附录)的非线性转换它用于将输入的每一个字节通过一个简单的查表操作将其映射为别一个字节。映射方法是:把输入的字节高位作为S盒的行值低位作为列值然后取出对应行和列的元素作为输出。代码实现:Aes::SubBytes(){inti,jfor(j=j<j){for(i=

热点搜索换一换

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/48
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部