AES算法用于保护文档的机密性.doc_第1页
AES算法用于保护文档的机密性.doc_第2页
AES算法用于保护文档的机密性.doc_第3页
AES算法用于保护文档的机密性.doc_第4页
AES算法用于保护文档的机密性.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. AES算法分析1.1 AES算法产生背景作为传统对称加密算法标准DES的替代者,由美国国家标准与技术研究所(NIST)于1997年面向全球提出征集该算法的公告,要求分组大小为128位,允许3个不同的密钥大小,即128位,192位或256位,算法必须是可公开的。1999年3月22日,NIST从15个候选算法中公布了5个候选算法进入第二轮选择:MARS,RC6,Rijndael,SERPENT和Twofish。2000年10月2日,以安全性(稳定的数学基础,没有算法弱点,算法抗密码分析的强度,算法输出的随机性),性能(必须能在多种平台上以较快的速度实现),大小(不能占用大量的存储空间和内存),实现特性(灵活性,硬件和软件适应性,算法的简单性等)为标准而最终选定了两个比利时研究者Vincent Rijmen和Joan Daemen发明的Rijndael算法。并于2001年12月正式发布了AES标准(FIPS 197)。该算法是迭代分组密码算法,其分组长度和密钥长度都可改变,该算法的扩充形式允许分组长度和密钥长度以32b的步长,从128b到256b范围内进行特定的变化。该算法的主要优点是:设计简单,密钥建立时间短,且灵敏良好,需要的内存空间少,在所有平台上运行良好,支持并行处理,抗所有已知攻击。1.2 AES算法原理堆成密码算法根据对明文消息加密方式的不同,可分为两大类;即分组密码和流密码。分组密码将消息分为固定长度的分组,输出的密文分组通常与输入的明文分组长度相同。AES算法属于分组密码算法,它的输入分组,输出分组以及加/解密过程中的中间分组都是128比特。密钥的长度k为128,192,或265比特。用Nk-4,6,8代表密钥串的字数(1字-32比特),在本文编制的程序中由用户选定。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系见表1)。每一轮都需要一个和输入分组具有同样长度(128比特)的扩展密钥Kc的参与。由于外部输入的加密密钥K长度有限,所以在AES中要用一个密钥扩展程序把外部密钥K扩展成更长的比特串,以生成各轮的加密密钥。1) 加密变换设X是AES的128比特明文输入,Y是128比特的密文输出,则AES密文Y可以用下面的复合变换表示;Y=A k(r+1)*R*S*Akr*C*R*S*A(r-1)*C*R*S*Akl(X)。其中“*”表示复合运算。这里Aki:表示对X的一个变换Aki(X)=X异或Ki(Ki为第i轮的子密钥,为比特串的异或运算)。S:S是一个给定的转换表。R:行置换。C:列置换。S(x)=a(x)异或s(x)1.3 AES算法安全性分析1)AES汇聚了安全性能,效率,可是线性和灵活性等优点,最大的优点是可以给出算法最佳差分特征的概率,并分析算法抵抗差分密码分析及线性密码分析的能力。AES对内存的需求非常低,也使它你适合用于资源受限制的环境。AES操作简单,并可抵御强大和实时的攻击.AES的密钥,分组和轮数的组合对应关系。2)对AES密码的攻击大致有差分和线性分析攻击,变量法攻击和Square攻击等。3)差分和线性分析攻击:差分和线性分析方法是到目前为止二种最有用的通用密码分析方法。对于这些攻击提供轮数低的复杂度是在设计AES密码时的最基本的准则。对于AES密码来说,已经证明对于一个4轮的AES密码来说,差分分析方法的概率上限是2-150,线性分析方法的概率上限是2-75。结合实际AES密码的轮数,这些轮数对于抵抗上述攻击能够提供足够的安全性。已经证明对于一个4轮的AES密码来说,差分分析方法的概率上限是2-150,线性分析方法的概率上限是2-75。结合实际AES密码的轮数,这些轮数对于抵抗上述攻击能够提供足够的安全性。4)变量法攻击:在变量法公布之后,线性和差分攻击方法在某些方面已经做了扩展,也公布了一些和它相关的攻击方法。最好的扩展方法是截段差分分析法(truncated differentials)。但是在设计AES密码的时候就已经考虑到这种攻击方法,AES密码能够比较好地抵抗这种攻击。其他的攻击方法还有:不可能差分攻击:差分密码攻击是利用高概率特征或差分恢复密钥,不可能差分攻击是利用概率为0(或非常小)的特征或差分,其基本思想是排除那些导致概率为0(或非常小)的特征或差分的候选密钥。对5轮的AES密码,可以用不可能差分攻击方法,它要求229.5个选择明文、231个密文、242个存储字和226小时的预先处理时间,使得它可以攻击6轮的AES密码。但是对于轮数更高的AES密码,采用该方法攻击则没有更好的效果。5)Square攻击:对AES密码分析最有效的就是Square攻击,它是一个选择明文攻击,通过研究基于字节结构的密文来进行攻击。它对于和AES密码的其中一轮有相似结构的任何密文都是有效的。这种攻击的其他名字还有“饱和攻击”这种攻击能够破解具有7轮的192位和256位AES密码),L.Knudsen和D.Wagner提出的“积分密码分析”,以及A.Biryukov和A.Shamir提出的“结构攻击”。最初的Square攻击对67轮的AES密码(例如AES-128和AES-192)的破解比穷尽密钥搜索攻击快。N.Ferguson等在减少破解的工作方面做了一些优化,因此,它能够在有256位相关密码的277个明文,2224个密文,破解9轮的AES-256密码。1.4 AES算法应用1) 应用与无线网络中:由于无线网络的通信信道较有线网络更为开发,安全性的要求更高。目前,无线网络主要有两个国际标准:一是用于WLAN的IEEE803.11协议(Wi-Fi);二是用于WMAN的IEEE803.16协议(WiMAX)。这两个协议在制定初期所采用的安全机制分别为RC4和DES, 后来这两个协议也都将AES加入到协议的安全机制中。此外,为了保障数据传输安全性,其他的一些无线网络技术也都使用了AES加密算法。例如ZigBee技术,为确保MAC帧的完整性、机密性、真实性和一致性,其MAC层使用AES算法进行加密,并且生成一系列的安全机制。 ZigBee技术是一种近距离、低复杂度、低功耗、低数据速率,低成本的双向无线通信技术,主要适用于自动控制和远程控制领域,可以嵌入到各种设备中。2) 应用于电子商务中:在电子商务方面,主要是AES在电子商务基础平台中的密码协议和交易安全协议中的应用。例如,将AES加密算法应用在SSL(Secure Sockets Layer安全套接层)协议中。在实施数据传输前,发送方通过身份认证后,用SSL安全通道发送AES密钥到接收方的同时,使用AES算法对实时数据加密,然后基于UDP协议通过互联网发送加密的实时数据到接收方。这样接收方可以用接收到的AES密钥得到具体的实时数据。此外,还可以研究将AES与其他一些公钥加密算法(非对称加密算法)相结合,设计出新的密码。目前比较典型的研究包括:AES加密算法与RSA加密算法相结合的混合加密体系;利用NTRU公钥密码体系分配AES密钥;AES加密算法与ECC(椭圆曲线加密算法)相结合的加密体系;AES加密算法在数据签名中的应用;AES加密算法在公钥加密体系PKI中的应用等等。3) 应用与软件中:在AES软件实现方面,其应用领域包含语音、视频信息的加密,数据库中的数据加密等。随着计算机对多媒体信息处理能力的增强,多媒体信息加密的问题日渐凸显。由于多媒体信息的数据量很大,直接对其加密效率较低。所以,不仅要考虑数据加密算法AES的使用方法,还要设计相应的对多媒体信息进行加密的过程。关于AES加密算法在数据库方面的应用,主要在于如何在数据输入、输出中生成、分配和管理所用的密钥以及安全的数据加密策略。4)应用与硬件中:在AES硬件实现方面,主要方向有射频IC卡中的数据安全、智能安全卡和对硬盘数据的加密等方面。目前射频IC卡的应用范围很广,如公交IC卡、校园一卡通、门禁卡和新一代的居民身份证中都嵌入了IC芯片。其中所存储的数据通常都含有持卡人的私人信息,这些信息如果不经过加密处理,很可能泄露出去。因此,如何在射频IC卡中加入数据加密功能是AES硬件应用的一个研究方向。随着密码技术的高速发展,高级加密标准AES加密算法将逐渐取代DES加密算法在IPSec、SSL和ATM中的使用,并广泛应用于虚拟专用网、远程访问服务器(RAS)、SONET(同步光网络)、高速ATM/Ethernet路由器、卫星通信、移动通信、电子金融业务等领域。此外,网络保密系统、财政保密、电子游戏保密等方面也将采用AES加密算法,将现有的关于AES研究成果与其他领域的相关技术与应用相结合,从应用的角度拓展数据加密技术,从而获得新的应用,是AES(Rijndeal)的发展方向。2. 算法实现2.1 AES算法每一轮都是用代替和混淆处理整个数据分组,由4个不同的阶段组成,包括:1)字节代替SubBytes:用一个S盒完成分组中的按字节的代替;2)行移位ShiftRows:一个简单的置换;3)列混淆MixColumns:一个利用在域GF(28)上的算术特性的代替;4)轮密钥加AddRoundKey:一个利用当前分组和扩展密钥的一部分进行按位异或。2.2 给定一个明文X,将State初始化为X,并进行AddRoundKey操作,将轮密钥与State异或。对前Nr-1轮中的每一轮,用S盒进行一次SubBytes代替操作;对State做一次ShiftRows行移位操作;再对State做一次MixColumns列混淆操作;然后进行AddRoundKey操作。最后一轮(即第Nr轮)依次进行SubBytes,ShiftRows,AddRoundKey操作。将最后State中的内容定义为密文Y。即在第一轮之前要进行一个AddRoundKey操作,中间各轮依次进行SubBytes,ShiftRows,MixColumns,AddRoundKey操作,最后一轮中没有MixColumns操作。伪代码描述为:Cipher(byte in4*Nb, byte out4*Nb, word wNb*(Nr+1)BeginByte state4, NbState=inAddRoundKey(state,w)for round=1 step 1 to Nr-1 /前Nr-1轮 SubBytes(state)ShiftRows(state)MixColumns(state)AddRoundKey(state, wound*Nb)end forSubBytes(state)ShiftRows(state)AddRoundKey(state, w+Nr*Nb)out=stateend其中in,out,w和state中分别存储加密处理的输入,输出,密钥和中间态数据;Nr和Nb分别为迭代轮数和中间态的列数。2.3基本加密变换2.3.1 S盒变换-SubBytes(字节运算)SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节用过一个简单的查表操作,将其映射为另一个字节。映射方法是:把输入字节的高4位作为S盒的行值,低4位作为列值,然后取出S盒中对应行和列的元素作为输出。例如,输入为“95(十六进制表示)”的值所对应的S盒的行值为9,列值为5,S盒中相应位置的值为2a,就说明95被映射为2a。SubBytes()的伪代码描述如下:SubBytes(byte state4, Nc, Nc)Beginfor r=0 step 1 to 3for c=0 step 1 to Nc-1Stater,c=Sboxstater,c end forend forend S盒(十六进制)2.3.2 列混合变换-MixColumns(字运算)MixColumns()实现逐列混合,其方式是:S(x)=c(x)*s(x)mod(x4 + 1)式中,c(x)=03*x3+01*x+02,内的数表示是字节;s(x)=s0,c+s1,c*x+s2c*x2+s3,c*x3;s(x)=s0c+s1c+s2c*x2+s3c*x3.伪代码描述为:MixColumns(byte state4,Nc, Nc)beginbyte t4for c=0 step 1 to Nc-1 for r=0 step 1 to 3 tr=stater,cend for for r=0 step 1 to 3 stater,c=FFmul(0x02, tr)xorFFmul(0x03,t(r+1)mod4)xort(r+2)mod4xor t(r+3)mod4end for end for end2.3.3 行移位运算-ShiftRowsShiftRows()完成基于行的循环移位操作,变换方法如图所示,即行移位变换作用在中间态的行上,第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。ShiftRows()的伪代码描述:ShiftRows(byte state4,Nc,Nc)begin byte tNcfor r=1 step 1 to 3for c=0 step 1 to Nc-1tc=stater,(c+h(r,Nc)moodNcend for for c=0 step 1 to Nc-1 stater,c=tcend for end for end2.3.4 轮密钥加变换-AddRoundKeyAddRoundKey()用于将输入或中间态S的每一列与一个密钥字Ki进行按位异或,即AddRoundKey(S,Ki)=S+Ki,Ki(i=0,1,2,3,4.,Nr)由原始密钥k扩展算法产生。每一个轮密钥由Nb个子组成,w表示第r轮的第c个轮密钥字。轮密钥加变换可表示如图所示:AddRoundKey()的伪代码描述如下:AddRoundKey(byte state4,Nc, word kround,-, Nc)begin for c=0 step 1 to Nc-1 for r=0 step 1 to 3 stater,c=stater,c xor xbyte(r, kround, c)end for end for end2.4解密过程与加密过程类似,主要区别在于轮密钥要逆序使用。3. AES算法应用编程3.1软件说明文档:该软件的目的是对文件加密。在弹出的窗口中选中一个文件,点击“加密”按钮会对文件进行加密,并将文件的原始路径和加密路径保存到数据库aes的files表中;如需解密只需点击“查看以加密文件”按钮,此时会查询数据库将已经加密的文件显示出来。选择想要解密的文件,点击下面的解密按钮会将选中文件解密并恢复到原来的路径中。程序主要的流程图:3.2 加密主界面的实现设计思想如下:在该主界面上有个“查看以加密的文件”按钮,点击该按钮将会查询数据库,将已经加密的文件信息以表格形式显示出来。接着是选择文件;在这里你可以选择你想要加密的文件(注意必须是春文本文件,不然加密会出错),选中之后点击有下家的“加密”按钮,会将选中的文件加密并保存到指定的位置(这里我指定的位置为:f:/aesencrypt目录下),同事也会将该文件的基本信息(如文件加密前的路径和加密后的路径)保存到数据库aes的files表中,以便点击“查看以加密的文件”按钮时会将该信息查询出来。主界面实现后运行结果如下:3.3 实现加密过程并将该事件绑定到“加密”按钮3.3.1新建一个类并在该类中定义一个静态的方法实现加密。该方法接收两个参数:分别是加密文件的上层目录和文件名称。然后取得初始化的密码器Cipher,之后调用该类的update()方法循环对文件加密,最后调用doFinal()方法完成最后一次加密。加密过程中将已加密的内容输入到新创建的加密文件中。加密过程代码如下:1) 首先是初始化密码器的代码:public static Cipher initEncrypt(String password)try/密钥产生器,密钥产生器对象可重复使用KeyGenerator kgen = KeyGenerator.getInstance(AES);/* 对于给定的密钥长度和用户提供的随机数来初始化密钥* new SecureRandom(password.getBytes()是产生一个SecureRandom的实例以给定的password*/kgen.init(128, new SecureRandom(password.getBytes();/生成一个密钥SecretKey secretKey = kgen.generateKey();/返回密钥的初始编码格式,如果该密钥不支持编码则返回nullbyte enCodeFormat = secretKey.getEncoded();/* SecretKeySpec,指定一个密钥在provider-independent中如何使用* 从给定的字节数组构造一个密钥*/SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);Cipher cipher = Cipher.getInstance(AES);/ 创建密码器cipher.init(Cipher.ENCRYPT_MODE, key);/ 初始化为加密return cipher;catch (Exception e)e.printStackTrace();System.out.println(加密密码器初始化异常);finallyAESUtil.flag = true;return null;2) 然后是加密过程的代码:package com.aes.encrypt;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import javax.crypto.Cipher;import com.aes.util.AESMethod;import com.aes.util.AESUtil;/* * 将加密文件保存到f:/aesencrypt文件夹中 * author HP */public class AESEncrypt/* * 加密 * param parent 要加密文件的目录 * param name 要加密文件名称 * throws Exception */public static void encrypt(String parent, String name) throws Exception/创建缓冲输入流对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream(parent + / + name);Cipher cipher = AESMethod.initEncrypt(AESUtil.PASSWORD);int blockSize = cipher.getBlockSize();int outputSize = cipher.getOutputSize(blockSize);/将读到的数据写入该缓冲数组byte buffer = new byteblockSize;int length = 0;byte outBytes = new byteoutputSize;boolean more = true;/* * 创建加密文件和缓冲输出流对象 */BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(AESUtil.PATH + / + name);while(more)length = bis.read(buffer);if(length = blockSize)int outLength = cipher.update(buffer, 0, blockSize, outBytes);bos.write(outBytes, 0, outLength);elsemore = false;if(length 0)outBytes = cipher.doFinal(buffer, 0, length);elseoutBytes = cipher.doFinal();bos.write(outBytes);bos.flush();/关闭输入流和输出流bos.close();bis.close();System.out.println(加密成功);3.3.2 将加密文件事件绑定到“加密”按钮上在加密主界面类中写了一个内部类:private class EncryptButtonListener implements ActionListenerOverridepublic void actionPerformed(ActionEvent arg0)/* 取得文件路径和名字作为参数传给加密类*/String parent = chooser.getSelectedFile().getParent();String name = chooser.getSelectedFile().getName();/ 将文件加密tryAESEncrypt.encrypt(parent, name);/* 将文件加密路径和解密路径保存到数组库aes中*/String encryptpath = AESUtil.PATH + /+ chooser.getSelectedFile().getName();String decryptpath = chooser.getSelectedFile().getPath();DBConn.save(encryptpath, decryptpath);/ 加密完之后将源文件删除chooser.getSelectedFile().delete();catch (Exception e)e.printStackTrace();然后是添加事件:encrypt.addActionListener(new EncryptButtonListener();3.4实现“查看以加密的文件”按钮事件3.4.1 当点击该按钮时,会弹出一个解密窗口,该窗口会将已经加密的文件以表格的形式显示出来。然后你可以选择一个文件,点击下面的“解密”按钮会将该文件解密,恢复到原来的路径中。点击该按钮出现的解密窗口如下:实现的代码:package com.aes.ui;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.LinkedList;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTable;import javax.swing.WindowConstants;import javax.swing.table.DefaultTableModel;import com.aes.bean.Files;import com.aes.db.DBConn;import com.aes.encrypt.AESDecrypt;import com.aes.util.AESUtil;public class AESDecryptUIprivate JFrame frame;private JButton decrypt; / 解密文件按钮private JTable table; / 将加密文件以列表的形式显示出来private LinkedList list; / 接受从数据库中查询出来的数据public void UI()frame = new JFrame(AES解密窗口);decrypt = new JButton(解密);/* * frame添加按钮 */frame.add(decrypt, BorderLayout.SOUTH);/* * 查询数据库并将已加密的文件显示到解密窗口中 */ 从数据库中将加密文件查询出来list = DBConn.findAllEncryptFile();table = new JTable();DefaultTableModel model = (DefaultTableModel) table.getModel();model.setColumnIdentifiers(new Object id, username, password ); / 设置列名称model.setRowCount(0);/ 文件显示到table上Files file = null;for (int i = 0; i list.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论