AES算法测试用例程序Java实现(密钥长度128比特)
——2018.10.22
2.3.3逆列混合(InvMixColumns)... 10
1引言
1.1任务概要
- 实现AES加密和解密基本功能;
- 实现AES加密测试用例功能,具体如下:
- 随机产生n组128比特明文,加密产生n组128比特密文,密钥不变;b)操作简单,界面美观。
- 输入和输出要求:
- 用函数实现AES加密和解密
- 输入和输出的128比特明文和密文采用十六进制
- 要求至少有一组来自标准fips-197的测试。
- 随机产生的明文和加密后的明文(即密文)保存为txt文件,保存格式为每行记录一组明文和对应密文。如txt文件格式
明文:0xbce3 …… 密文:0x……
明文:0x…… 密文:0x……
加密密钥为:0x……
- 解密验证,从(4)中txt文件,获取任意一组密文和密钥,解密输出明文,并输出显示在屏幕上。
1.2运行环境和开发环境
- 运行环境:JVM;
- 开发环境:Windows10;JDK1.8;eclipse;
1.3密码算法原理简单介绍
美国国家标准技术研究所在2001年发布了高级加密标准(AES)。AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准。根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128、AES-192和AES-256。本课题设计主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加。
如图1所示,AES加密过程涉及到4种操作:字节替(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥(AddRoundKey)。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16字节的明文、密文和轮密钥都以一个4x4的矩阵表示。
2 程序各模块详细设计
2.1核心模块主要实现算法的流程
AES程序流程如图2所示
2.2 AES加密的算法说明和实现方式
2.2.1字节代替(Subbyte)
AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。 状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。
// 字节代替
public byte[][] subbyte(byte[][] sub) {
byte row, col;
byte[][] temp = new byte[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {