AES加解密的JAVA实现_第1页
AES加解密的JAVA实现_第2页
AES加解密的JAVA实现_第3页
AES加解密的JAVA实现_第4页
AES加解密的JAVA实现_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

一、实验目的1、深入理解AES加解密算法;2、用JAVA编程完成一个明文分组的加密和解密,其中密钥是十六进制,长度为128比特(32个16进制数),并且进行加密后,能够进行正确的解密。二、实验条件1、熟悉JAVA开发环境,能熟练运用JAVA进行程序编写;2、掌握AES加解密算法知识,了解其算法原理;3、安装了JAVA环境的计算机。三、实验背景随着对称密码的发展,3DES用软件实现速度相对较慢,它使用的64位分组长度显得不够高效和安全的缺点使得需要一种新的高级加密标准来替代它。AES的全称是AdvancedEncryptionStandard,即高级加密标准。该项目由美国国家标准技术研究所(NIST)于1997年开始启动并征集算法,在2000年确定采用Rijndael作为其最终算法,并于2001年被美国商务部部长批准为新的联邦信息加密标准(FIPSPUB197),该标准的正式生效日期是2002年5月26日。2000年10月2日,NIST对Rijndael做出了最终评估。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations)和替换(substitutions)输入数据。四、实验原理1、AES加密模块字节替代:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节;行移位:将矩阵中的每个横列进行循环式移位;列混合:为了充分混合矩阵中各个直行的操作,这个步骤使用线性转换来混合每行内的四个字节;轮密钥加:矩阵中的每一个自己都与该次循环的子密钥做XOR逻辑运算;每个子密钥有密钥生成方案产生;最后一个加密循环中省略列混合步骤,而以另一个轮密钥加取代。2、AES解密模块:逆行移位:与行移位操作相反;逆字节替代:与字节替代一样,只是查表操作变为逆S盒;轮密钥加:与加密算法中一样;逆列混合:与列混合操作一样,只是多项式不同;最后一个解密循环中省略逆列混合步骤,以另一个轮密钥加取代。3、AES密钥扩展模块首先初始密钥按照矩阵列进行分组,前4列初始密钥记为K0,K1,K2,K3,那么新的列Ki递归如下:1)如果Ki中,i不是4的倍数,那么i列由如下等式确定:Ki=K(i-4)XORK(i-1)2)如果ki中,i是4的倍数,那么i列由如下等式确定:Ki=K(i-4)XORT[K(i-1)]其中是4的倍数的转换形式,按以下方式实现:a将K(i-1)循环左移位,每次一个字节,如abcd变成bcda;b将这4个字节作为S盒的输入,输出新的4个字节efgh;c计算一轮的常量r(i)=2(i-4)/4;d这样生成转换后的列:[eXORr(i),f,g,h]。第i轮的轮密钥组成了列K4i,K(4i+1),K(4i+2),K(4i+3)。五、程序设计1、程序开发平台及工具平台:windowsxp软件版本:jdk1.6.0_212、源代码importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;publicclassAES{privatefinalstaticStringalgorithm="AES";privatestaticStringasHex(bytebuf[]){StringBufferstrbuf=newStringBuffer(buf.length*2);for(inti=0;i<buf.length;i++){if(((int)buf[i]&0xff)<0x10)strbuf.append("0");strbuf.append(Long.toString((int)buf[i]&0xff,16));}returnstrbuf.toString();}privatestaticbyte[]asBin(Stringsrc){if(src.length()<1)returnnull;byte[]encrypted=newbyte[src.length()/2];for(inti=0;i<src.length()/2;i++){inthigh=Integer.parseInt(src.substring(i*2,i*2+1),16);intlow=Integer.parseInt(src.substring(i*2+1,i*2+2),16);encrypted[i]=(byte)(high*16+low);}returnencrypted;}publicstaticStringgetRawKey(){try{KeyGeneratorkgen=KeyGenerator.getInstance(algorithm);kgen.init(128);//192and256bitsmaynotbeavailableSecretKeyskey=kgen.generateKey();//Generatethesecretkeyspecs.byte[]raw=skey.getEncoded();returnasHex(raw);}catch(Exceptione){return"";}}publicstaticStringgetEncrypt(Stringmessage,StringrawKey){byte[]key=asBin(rawKey);try{SecretKeySpecskeySpec=newSecretKeySpec(key,algorithm);Ciphercipher=Cipher.getInstance(algorithm);cipher.init(Cipher.ENCRYPT_MODE,skeySpec);byte[]encrypted=cipher.doFinal(message.getBytes());returnasHex(encrypted);}catch(Exceptione){return"";}}publicstaticStringgetDecrypt(Stringencrypted,StringrawKey){byte[]tmp=asBin(encrypted);byte[]key=asBin(rawKey);try{SecretKeySpecskeySpec=newSecretKeySpec(key,algorithm);Ciphercipher=Cipher.getInstance(algorithm);cipher.init(Cipher.DECRYPT_MODE,skeySpec);byte[]decrypted=cipher.doFinal(tmp);returnnewString(decrypted);}catch(Exceptione){return"";}}publicstaticvoidmain(String[]args)throwsException{Stringmessage="whatareyoudoing?";StringrawKey=getRawKey();System.out.println("Key="+rawKey);Stringencrypted=getEncrypt(message,rawKey);System.out.println("orgtext="+message);System.out.println("encrypted="+encrypted);Stringdecrypted=getDecrypt(encrypted,rawKey);System.out.println("decrypted="+decrypt

温馨提示

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

评论

0/150

提交评论