最新新闻:

AES明文分组的加密和解密,你知道吗?(上)

时间:2022-05-01 09:01:01来源:网络整理

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

2、用JAVA编程完成一个明文包的加解密,其中密钥为16进制,长度为128位(32位十六进制),加密后可以正确解密。

二、实验条件

1、熟悉JA V A开发环境,熟练使用JA V A进行编程;

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

3、一台安装了 JAVA 环境的电脑。

三、实验背景

随着对称密码的发展,3DES 在软件中实现的速度相对较慢,并且其使用 64 位块长度的效率和安全性不够高,需要一个新的高级加密标准来取代它。 AES的全称是Advanced Encryption Standard,即高级加密标准。该项目于 1997 年由美国国家标准与技术研究院 (NIST) 发起并征集算法,2000 年 Rijndael 被选为其最终算法,并于 2001 年被美国商务部长批准为新的联邦信息加密标准( FIPS PUB 197),该标准的正式生效日期是 2002 年 5 月 26 日。2000 年 10 月 2 日aes算法原理,NIST 对 Rijndael 进行了最终评估。

AES 是一种迭代的对称密钥块密码,可以使用 128、192 和 256 位密钥,并以 128 位(16 字节)块加密和解密数据。与使用密钥对的公钥密码不同,对称密钥密码使用相同的密钥来加密和解密数据。分组密码返回的加密数据与输入数据具有相同的位数。迭代加密使用循环结构,其中重复输入数据的排列和替换。

1、AES 加密模块

字节替换:通过非线性替换函数,通过查找表将每个字节替换为对应的字节;

行移位:循环移位矩阵中的每一行;

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

轮键加法:矩阵中的每个self与轮的子键进行异或逻辑运算;每个子密钥由密钥生成方案生成;

在最后一轮加密中省略了列混合步骤,并由另一轮密钥添加代替。

2、AES解密模块:

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

逆字节替换:与字节替换相同,只是查表操作变成了逆S盒;

轮密钥加法:同加密算法;

逆列混合:与列混合相同,但多项式不同;

在最后一轮解密中省略了逆列混合步骤aes算法原理,并由另一轮密钥添加代替。

3、AES 密钥扩展模块

首先根据矩阵列对初始keys进行分组,初始keys的前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 Shift 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、源码

导入 javax.crypto.Cipher;

导入 javax.crypto.KeyGenerator;

导入 javax.crypto.SecretKey;

导入 javax.crypto.spec.SecretKeySpec;

公共类 AES{

私有最终静态字符串算法 = "AES";

私有静态字符串 asHex(byte buf[]){

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

for (int i = 0; i

if (((int) buf[i] & 0xff)

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

}

返回 strbuf.toString();

}

私有静态字节[] asBin(String src){

if(src.length()

返回空值;

字节[] 加密 = 新字节[src.length()/2];

for(int i=0;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);

加密[i] = (byte)(high * 16 + low);

}

返回加密;

}

公共静态字符串 getRawKey() {

试试{

KeyGenerator kgen = KeyGenerator.getInstance(算法);

kgen.init(128); // 192 和 256 位可能不可用

SecretKey skey = kgen.generateKey(); // 生成密钥规范。

byte[] raw = skey.getEncoded();

返回为十六进制(原始);

}catch(异常 e){

返回 "";

}

}

public static String getEncrypt(String message, String rawKey){

byte[] key = asBin(rawKey);

试试{

SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm);

Cipher cipher = Cipher.getInstance(算法);

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] 加密 = cipher.doFinal(message.getBytes());

返回为十六进制(加密);

}catch(异常 e){

返回 "";

}

}

public static String getDecrypt(String encrypted, String rawKey){

byte[] tmp = asBin(加密);

byte[] key = asBin(rawKey);

试试{

SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm);

Cipher cipher = Cipher.getInstance(算法);

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] 解密 = cipher.doFinal(tmp);

返回新字符串(已解密);

}catch(异常 e){

返回 "";

}

}

public static void main(String[] args) 抛出异常{

String message = "你在做什么?";

String rawKey = getRawKey();

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

字符串加密 = getEncrypt(message,rawKey);

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

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

字符串解密 = getDecrypt(encrypted,rawKey);

System.out.println("解密 = " + 解密);

}

}

六、程序运行结果

七、实验总结

本实验的核心是分析AES的工作原理和基于AES加解密算法的编程实现。重点是对AES算法的过程进行详细的描述,并用JAVA语言实现AES最基本的核心算法,从而对AES有更深入的了解。

通过这个实验,我不仅让自己对密码学有了更深入的了解,而且在一定程度上提高了自己的JAVA编程。基本掌握JAVA面向对象编程。基本掌握密码学中的一个重要算法——AES加密算法。受益良多。

声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。

图文推荐

热点排行

精彩文章

热门推荐