AES加解密的JAVA实现

来源:m.fanwen118.com时间:2021.10.14

一、实验目的

1、深入理解AES加解密算法;

2、用JAVA编程完成一个明文分组的加密和解密,其中密钥是十六进制,长度为128比特(32个16进制数),并且进行加密后,能够进行正确的解密。

二、实验条件

1、熟悉JAVA开发环境,能熟练运用JAVA进行程序编写;

2、掌握AES加解密算法知识,了解其算法原理;

3、安装了JAVA环境的计算机。

三、实验背景

随着对称密码的发展,3DES用软件实现速度相对较慢,它使用的64位分组长度显得不够高效和安全的缺点使得需要一种新的高级加密标准来替代它。AES的全称是 Advanced Encryption Standard,即高级加密标准。该项目由美国国家标准技术研究所 (NIST)于19xx年开始启动并征集算法,在20xx年确定采用Rijndael作为其最终算法,并于 20xx年被美国商务部部长批准为新的联邦信息加密标准 (FIPS PUB 197),该标准的正式生效日期是20xx年5月26日。20xx年10月2日,NIST对Rijndael做 出了最终评估。

AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations)和替换(substitutions)输入数据。

四、实验原理

1、AES加密模块

AES加解密的JAVA实现

AES加解密的JAVA实现

字节替代:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节;

行移位:将矩阵中的每个横列进行循环式移位;

列混合:为了充分混合矩阵中各个直行的操作,这个步骤使用线性转换来混合每行内的四个字节;

轮密钥加:矩阵中的每一个自己都与该次循环的子密钥做XOR逻辑运算;每个子密钥有密钥生成方案产生;

最后一个加密循环中省略列混合步骤,而以另一个轮密钥加取代。

2、AES解密模块:

逆行移位:与行移位操作相反;

逆字节替代:与字节替代一样,只是查表操作变为逆S盒;

轮密钥加:与加密算法中一样;

逆列混合:与列混合操作一样,只是多项式不同;

最后一个解密循环中省略逆列混合步骤,以另一个轮密钥加取代 。

3、AES密钥扩展模块

AES加解密的JAVA实现

首先初始密钥按照矩阵列进行分组,前4列初始密钥记为K0,K1,K2,K3,那么新的列Ki递归如下:

1)如果Ki中,i不是4的倍数,那么i列由如下等式确定:

Ki = K(i-4) XOR K(i-1)

2)如果ki中,i是4的倍数,那么i列由如下等式确定:

Ki = K(i-4) XOR T[K(i-1)]

其中是4的倍数的转换形式,按以下方式实现:

a 将K(i-1)循环左移位,每次一个字节,如abcd变成bcda; b 将这4个字节作为S盒的输入,输出新的4个字节efgh;

c 计算一轮的常量r(i)=2(i-4)/4;

d 这样生成转换后的列:[e XORr(i),f,g,h] 。

第i轮的轮密钥组成了列K4i,K(4i+1),K(4i+2),K(4i+3) 。

五、程序设计

1、程序开发平台及工具

平台:windows xp

软件版本:jdk1.6.0_21

2、源代码

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

public class AES{

private final static String algorithm = "AES";

private static String asHex(byte buf[]){

StringBuffer strbuf = new StringBuffer(buf.length * 2);

for (int i = 0; i < buf.length; i++){

if (((int) buf[i] & 0xff) < 0x10) strbuf.append("0");

strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); }

return strbuf.toString();

}

private static byte[] asBin(String src){

if(src.length()<1)

return null;

byte[] encrypted = new byte[src.length()/2];

for(int i=0;i<src.length()/2;i++){

int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1 ), 16); int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16); encrypted[i] = (byte)(high * 16 + low);

}

return encrypted;

}

public static String getRawKey() {

try{

KeyGenerator kgen = KeyGenerator.getInstance(algorithm); kgen.init(128); // 192 and 256 bits may not be available

SecretKey skey = kgen.generateKey(); // Generate the secret key specs. byte[] raw = skey.getEncoded();

return asHex(raw);

}catch (Exception e) {

return "";

}

}

public static String getEncrypt(String message, String rawKey){ byte[] key = asBin(rawKey);

try{

SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm); Cipher cipher = Cipher.getInstance(algorithm);

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(message.getBytes()); return asHex(encrypted);

}catch (Exception e) {

return "";

}

}

public static String getDecrypt(String encrypted, String rawKey){ byte[] tmp = asBin(encrypted);

byte[] key = asBin(rawKey);

try{

SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm); Cipher cipher = Cipher.getInstance(algorithm);

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] decrypted = cipher.doFinal(tmp);

return new String(decrypted);

}catch (Exception e) {

return "";

}

}

public static void main(String[] args) throws Exception{

String message = "what are you doing?";

String rawKey = getRawKey();

System.out.println("Key = " + rawKey);

String encrypted = getEncrypt(message,rawKey);

System.out.println("org text = " + message);

System.out.println("encrypted = " + encrypted);

String decrypted = getDecrypt(encrypted,rawKey);

System.out.println("decrypted = " + decrypted);

}

}

六、程序运行结果

AES加解密的JAVA实现

七、实验小结

本实验的核心是AES的工作原理分析、基于AES加解密算法的编程实现。重点是对AES算法的流程做一个详细的描述,应用JAVA语言实现AES的最基本的核心算法,从而对AES有更深的理解。

通过此次实验,不仅使自己对密码学有了更深入的了解,同时使自己对JAVA编程也有了一定的提高。基本掌握了JAVA面向对象程序设计。基本掌握了密码学中一个重要的算法—AES密码算法。受益匪浅。


第二篇:AES加解密实现JAVA 1200字

AES加解密实现JAVA

byte[] encrypted1 = hex2byte(sSrc);

try {

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original);

return originalString;

} catch (Exception e) {

System.out.println(e.toString());

return null;

}

} catch (Exception ex) {

System.out.println(ex.toString());

return null;

}

}

//判断Key是否正确

public static String Encrypt(String sSrc, String sKey) throws Exception { if (sKey == null) {

System.out.print("Key为空null");

return null;

}

//判断Key是否为16位

if (sKey.length() != 16) {

System.out.print("Key长度不是16位");

return null;

}

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(sSrc.getBytes());

return byte2hex(encrypted).toLowerCase();

}

public static byte[] hex2byte(String strhex) {

if (strhex == null) {

return null;

}

int l = strhex.length();

if (l % 2 == 1) {

return null;

}

byte[] b = new byte[l / 2];

for (int i = 0; i != l / 2; i++) {

b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16); }

AES加解密实现JAVA

更多类似范文
┣ 电算化实验总结 1400字
┣ 会计电算化实验总结 900字
┣ 会计电算化实验总结 2000字
┣ 计算机原理实验总结 600字
┣ 更多加密算法实验总结
┗ 搜索类似范文