密码学 - AES 对称加密算法原理及原生实现

一. 概述

美国政府在 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(28) 上的一个元素。有限域(Finite Field)又名伽罗瓦域(Galois field),简单言之就是一个满足特定规则的集合,集合中的元素可以进行加减乘除运算,且运算结果也是属于此集合。

1. 有限域

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

  • 一个字节的全体 256 种取值构成一个 GF(28)
  • 一个 GF(2) 上的 8 次既约多项式可生成一个 GF(28)
  • GF(28) 的全体元素构成加法交换群、线性空间。
  • GF(28) 的非零元素构成乘法循环群。

2. AES 在有限域上的表示

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

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

例:例:字节57=01010111的多项式表示为:

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

例: 57+83=D4 等价于

定义 3 : 在 GF(28) 上的乘法定义为二进制多项式的乘积模一个次数为8的不可约多项式

其系数的十六进制表示为 11B,例: 57×83=C1 等价于

定义 4 : 在 GF(28) 中,二进制多项式 b(x) 满足乘法逆为式a(x)b(x) mod m(x) = 1的二进制多项式。

定义 5 : 在 GF(28) 中,倍乘函数 xtime(b(x)) 定义为x·b(x) mod m(x)。具体的运算规则是:把字节B左移一位,若 b7=1, 则减去 m(x),而在 GF(28) 上加减法等价,即加上 m(x)。例:

3. AES 的字表示与运算

3.1. 字表示

AES 数据处理的单位是字节和字,一个字由四个字节组成,表示为系数取自 GF(28) 上的次数低于 4 次的多项式,例如: 字57 83 4A D1等价于

3.2. 字运算

字运算是基于上述关于 AES 在 GF(28) 中的运算规则的。

字加法 : 两多项式系数按位模 2 加

字乘法 : 设 a 和 c 是两个字, a(x) 和 c(x) 是其字多项式, AES 定义 a 和 c 的乘积 b 为

如:设 a(x)、c(x) 和 b(x) 分别分别如下面(图 2-1)中所示, 由 b(x) = a(x)c(x) mod x4+1 得(图 2-1)表达式组

写成矩阵形式如下面的(图 2-3)所示,x4+1 是可约多项式,字 c(x) 不一定有逆,但 AES 选择的 c(x) 有逆,

从而使得 b(x) 的表达式可以使用上面(图 2-4)的矩阵表示,从而使得下面的MixColumns变换变为矩阵的乘法运算。

字 x 乘法

矩阵形式如下图所示,因为模 x4+1,字 x 乘法相当于按字节循环移位

三. AES 的加密过程

1. 状态

在 AES 中除了字节和字外,还有一种被称为状态的数据处理方式,它用来存储加解密过程中的中间数据,一般用以字节为元素的矩阵或二维数组表示。

如果用 Nb 代表明密文所含的字数。 Nk 代表密钥所含的字数。 Nr 代表迭代轮数,则当 Nb 和 Nk 都等于 4 时的状态与密钥数组分别如下面的(图 3-1)和(图 3-2) 所示

根据 Rijndael 算法的定义,加密轮数会针对不同的分组及不同的密钥长度选择不同的数值

2. 加密过程概述

AES 加密算法的主要步骤有

  • 轮密钥生成
  • 初始轮密钥加变换:将最初的第一个(Nk 个字长)轮密钥亦即主密钥与初始状态进行比特位异或操作
  • 标准轮(前 9, 11 或 13 轮)变换:* S 盒变换* 行移位变换* 列混合变换* 轮密钥加变换
  • 最后一轮(第10, 12 或 14 轮)变换* S 盒变换* 行移位变换* 轮密钥加变换

3. AES 有限域上的加法

/**
 * 有限域GF(2)上的加法,<tt>modeSize</tt>位的异或操作
 * xor corresponding byte in two state arrays
 * @param first first operand
 * @param second second operand
 * @return xor result
 */
private short[][] xor(short[][] first, short[][] second) {short[][] result = new short[first.length][4];int length = first.length;for (short i = 0; i < length; i+
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值