时间: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加密算法。受益良多。
声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。
图文推荐
2022-05-01 08:58:04
2022-04-30 19:58:03
2022-04-30 18:58:03
2022-04-30 17:58:05
2022-04-30 16:58:03
2022-04-30 15:58:03
热点排行
精彩文章
2022-05-01 08:58:07
2022-04-30 19:58:05
2022-04-30 18:58:06
2022-04-30 18:01:41
2022-04-30 17:58:14
2022-04-30 16:58:06
热门推荐