AES加密算法原理及Java实现

貌似博客园的“草稿”支持,而“发布文章”不支持数学公式的markdown语法,如果你想要更好的阅读体验请移步我的Hugo个人博客 一、概述

美国政府在1997年9月12日公开征集更高效更安全的替代DES加密算法,第一轮共有15种算法入选,其中5种算法入围了决赛,分别是MARS,RC6,Rijndael,Serpent和Twofish。又经过3年的验证、评测及公众讨论之后Rijndael算法最终入选。

Rijndael算法之所以最终能够被选为AES的原因是其安全、性能好、效率高、实用灵活。

Rijndael算法支持多种分组及密钥长度,介于128-256之间所有32的倍数均可,最小支持128位,最大256位,而AES标准支持的分组大小固定为128位,密钥长度有3种选择:128位、192位及256位。

二、AES算法的数学基础

Rijndaels算法中的许多运算是按字节和4字节的字来定义的。把一个字节看成是在有限域GF(2^8)上的一个元素。有限域(Finite Field)又名伽罗瓦域(Galois field),简单言之就是一个满足特定规则的集合,集合中的元素可以进行加减乘除运算,且运算结果也是属于此集合。

1. AES的基础域是有限域 GF(28)

一个字节的全体256种取值构成一个GF(28)

一个GF(2)上的8次既约多项式可生成一个 GF(28)

GF(28)的全体元素构成加法交换群、线性空间。

GF(28)的非零元素构成乘法循环群。

2. AES的GF(28)表示

有限域GF(2^8)上的元素有多种表示方法,为了方便,Rijndaels算法采用多项式表示法,下面是与还表示方法相关的几个定义

定义1 : 一个由比特位b7b6b5b4b3b2b1b0 组成的字节可表示成系数为(0, 1)的二进制多项式:b7X7 + b6X6 + b5X5 + b4X4 + b3X3 + b2X2 + b1X + b0

例:字节57=01010111的多项式表示为: $$x^6 + x^4 + x^2 + x + 1$$

定义2 : 在GF(28)上的加法定义为二进制多项式的加法,其系数按位模2加。

例: 57+83=D4等价于 $$(x6+x4+x2+x+1)⊕(x7+x+1)= x7+x6+x4+x2$$

定义3 : 在GF(28)上的乘法定义为二进制多项式的乘积模一个次数为8的不可约多项式 $$m(x) = x8+x4+x^3+x+1$$

其系数的十六进制表示为11B

例: 57×83=C1等价于

\[(x^6+x^4+x^2+x+1)×(x^7+x+1) \ mod \ m (x) = x^{13 }+ x^{11}+x^9+x^8+x^6+x^5+x^4+x^3+1 \ mod \ x^8+x^4+x^3+x+1 = x^7+x^6+1 \]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxgjg.html