基于AES算法采用不同加密模式实现文件加解密
基于AES算法采用不同加密模式实现文件加解密
本文将介绍如何基于AES算法采用不同加密模式实现文件加解密。通过使用电子密码本模式(ECB)和分组链接模式(CBC),利用AES算法对文件进行加密和解密的程序设计。文章详细描述了需求分析、总体设计、详细设计、核心代码以及测试结果等关键环节,旨在帮助读者深入理解AES算法以及不同的加密模式的工作原理和应用。
一、需求分析和总体设计
1.1 主要功能
- 使用电子密码本模式(ECB)和分组链接模式(CBC),利用AES算法对文件进行加密和解密的程序
- 通过UI界面可以实现用户加密时可以使用检索本机文件的方式来确定需要加密的文件,同样可以检索加密后文件的路径
- 支持程序自动生成16位随机密钥供用户使用
- 支持用户自己选择程序提供的两种加解密模式
- 程序具有图形化界面,输出美观
- 能在程序后台输出相关日志,便于调试
1.2 体系结构设计
体系结构风格:面向对象系统
此次课题中的程序使用java语言编写,jdk环境为8.0,采用调用-返回的结构,不同的功能封装在各个不同的类中,相互调用,由UI类作为程序入口。
图 1 体系结构设计
上述体系结构:
- ConNum:存放AES加/解密需要使用到的常量,S盒/逆S盒等
- Utils:工具类,包括打印4x4矩阵/异或/密钥分组等static方法
- Encrypt:实现加密,包含encryptECB/encryptCBC
- EncryptFile:此类中实现对文件流的处理,调用Encrypt进行对文件的加密功能
- Decrypt:实现解密,包含decryptECB/decryptCBC
- DecryptFile:此类中实现对文件流的处理,调用Decrypt进行对文件的解密功能
- UI:UI界面,作为整个程序的入口
1.3 主要功能界面设计
使用java语言中的awt和swing进行UI设计
图 2 UI界面
二、相关功能模块详细设计
2.1 模块内的数据结构设计
AES处理数据的方式是一长段数据,分为多个长度为16字节(128 bits)的组(也叫块,英文中多用block一词),然后依次处理每一个块。因此AES不是流密码,而是分组密码。
(当今的AES,是AES竞赛优胜者Rijndael的精简版,相比于原版的Rijndael,其block size即块大小被限定为了128 bits,而192 bits和256 bits块大小不再被支持)
AES通过密钥来加密、解密信息,并且加密和解密过程使用的密钥完全相同,加密过程和解密过程具有一定的对称性,因此AES属于密码学中的对称密钥算法。AES支持三种密钥大小(key size):128 bits、192 bits和256 bits。一般认为其加密强度随密钥长度的增大而增大。
图 3 加密过程中使用到的数据结构
2.2 模块程序流程图设计
图 5 AES加解密详细流程
三、部分核心代码
3.1 ConNum类
- 初始向量/列混合矩阵
- S盒/逆S盒
图 6 ConNum类 初始向量/列混合矩阵
图 7 ConNum类 S盒/逆S盒
3.2 Encrypt类
- 加密过程
图 8 Encrypt类 加密过程
3.3 EncryptFile类
- 调用encrypt方法处理文件流
图 9 EncryptFile类 调用encrypt方法处理文件流
3.4 Decrypt类
- 解密
图 10 Decrypt类 解密
3.5 DecryptFile类
- 解密文件
图 11 DecryptFile类 解密文件
3.6 Utils类
- 打印矩阵
- 将明文转换成矩阵
- 生成随机16位密钥
- 转换16进制字符串
- 密钥拓展
- 字节代换操作
- 行移位操作
- 列混淆操作
- S盒替换操作
- 矩阵异或操作
图 12 Utils类 打印矩阵
图 13 Utils类 将明文转换成矩阵
图 14 Utils类 生成随机16位密钥
图 15 Utils类 转换16进制字符串
图 16 Utils类 密钥拓展
图 17 Utils类 字节代换操作
图 18 Utils类 行移位操作
图 19 Utils类 列混淆操作
图 20 Utils类 S盒替换操作
图 21 Utils类 矩阵异或操作
四、软件测试及其结果分析
对功能单元、集成模块以及系统功能进行相关测试,并给出与输入数据相匹配的算法执行结果,并进行分析。
图 22 单元测试 encryptFile
图 23 单元测试 decryptFile
图 24 测试 加密
图 25 测试 加密结果展示
图 26 测试 解密
图 27 测试 解密结果展示
五、课题完成过程中遇到的问题及解决方法
问题1:
UI界面显示中文时会乱码,当修改编译器系统设置fileencoding为UTF-8时仍就会码
解决方法:
图 29 解决问题1方法
问题2:
使用fileInputStream节点流处理文件时遇到中文或其他特殊符号会乱码
解决方法:
将节点流包装成fileInputStreamReader流
问题3:
在使用二进制进行异或的时候结果会出现错误的情况
解决方法:
原来是类似0011这样的情况会被程序中忽略00,转换成二进制字符串。
附gitee地址:https://gitee.com/andoyd/aes.git