用java实现AES密码算法(一)

来源:互联网 发布:python 自动登录签到 编辑:程序博客网 时间:2024/06/08 15:23

继上次的计算机网络的socket实验之后,又迎来了新的挑战,那就是密码学的实验。

这个实验要求我实现AES算法的加密与解密,那么什么是AES算法呢。

AES算法是一种对称密码算法

一下是百度对它的介绍:

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
大多数AES计算是在一个特别的有限域完成的。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
  1. AddRoundKey — 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
  2. SubBytes — 通过个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  3. ShiftRows — 将矩阵中的每个横列进行循环式移位。
  4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。
最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。


当然,只懂得它的原理是不够的,我们怎么通过编程来实现呢?用什么实现呢?当然,这个想都不用想,博主就决定用博主的最爱——JAVA来做这次实验。

通过大量的查阅书籍,以及充分利用网络资源,博主把需要知道的列在下面:

在JAVA的世界里,密码学是其安全模块的重要组成部分。

JAVA的安全领域总共分为4个部分:JCA(Java Cryptography Architecture,Java加密体系结构),JCE(Java加密拓展包),JSSE(Java安全套接字拓展包),JAAS(Java鉴别安全服务)

JCA提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器。

JCE在JCA的基础上做了拓展,提供了各种加密算法、消息摘要算法和秘钥管理等功能


下面我们要对JAVA提供的包要有了解:

java.security:java.security包作为安全框架提供类和接口。这是探索JAVA加密世界的第一步。通过该包中的JAVA实现,仅能完成消息摘要算法的实现,并且其源代码是可见的,要实现真正的加密与解密,要参考javax.crypto包中的内容。




SubBytes(字节替换)的实现(思路):使用一个表(被称为S盒)对分组进行逐一字节替换。S盒是AES算法定义的矩阵,把State中每个字节的高4位作为行值,低4位作为列值,然后取出S一盒中对应行列的元素作为输出。这个步骤提供了AES算法加密的非线性变换能力。S盒与有限域乘法逆元有关,具有良好的非线性特性。为了避免简单代数攻击,S盒结合了乘法逆元及可逆的仿射变换矩阵建构而成。

0 0
原创粉丝点击