这篇文章是 对我的上一篇博文的延续,之前讲解了 AxCrypt的安装于环境配置,这一章就开始谈谈其内部算法的实现。下面一篇是对其加密部分的讲解。

Rijndael算法是一种对称的密码算法。它允许可变动的数据区块及金钥的长度。数据块与金钥长度的变动是各自独立的。块长和密钥长度可以分别指定程128、192或者256位。其在某些操作是在字节级上定义的。字节表示有限字段GF(2^8)中的元素,一个字节中有8位。其他操作都根据4字节来定义。程序的功能架构如图1-1所示:

图1-1 程序功能流程

一、程序的输入数据

在Rijndael算法中,外部输入数据有两部分构成,一个是State、一个是Cipher Key。State是运算过程中锁产生的中间值,是一个4xNb的矩阵,Nb由数据长度除以32位求得,其实际的操作结果是把输入数据分割成了Nb个区块。Cipher Key是用来加密的密钥,也是一个4xNk的矩阵,Nk可由密钥长度除以32位求得,与State类似,实际的操作结果是把密钥分割成Nk个32位的子密钥。

在操作过程中,数据均用十六进制表示法表示,例如:

32 = 00110010(1 byte)

在程序执行部分,主要分为两大部分:1、加密操作2、密钥编制

二、加密操作

在这里的加密操作的对象就是上面介绍的State,按照该算法的标准文档可知,加密算法可以简单的描述为先将State进行AddRoundKey操作,而后经过多次的循环转置操作(包括:SubBytes操作、ShiftRows操作、MixColumns操纵、AddRoundKey操作),进行的次数Nr由上面提到的Nb和Nk来共同决定,具体如表2-1所示。

表2-1 Nr取值表

Nr

Nb = 4

Nb = 6

Nb = 8

Nk = 4

10

12

14

Nk = 6

12

12

14

Nk = 8

14

14

14

通过上表我们很容易得知对我我们的128位的操作,所进行的次数为10次。程序的大概执行框架图如图2-1所示。

图2-1 程序执行框架图

程序的执行流程图与程序执行框架图类似,如图2-2所示

图2-2 加密部分程序流程图

下面就对该部分中的Transformations算法一一介绍。

1、1-SubBytes算法

1-SubBytes也叫做字节取代转换,是一个以字节为单位的非线性取代运算,取代表(S-Box)是经过两个运算过程而建立的。而且是可逆的。以下所说的运算数据是State与Cipher Key通过异或运算获得的。(异或运算可表示为(a^b)=(a’and b) or (a and b’))这里用Data表示,在改运算中是通过Data在S-Box中的一个映射进行的,用S-Box对应的坐标中的数值取代Data中的数值,例如在Data中的一个数值是十六进制的19,则在S-Box中X坐标就为1,Y坐标就为9。则在S-Box中对应坐标的数值为d4,依次类推,将这个4xNr的矩阵中每个数值都进行映射替换。

2、2-ShiftRows算法

该操作也即为移位转换操作。在这个转换中Data(其实也就是State)的每一列以不同的偏移量做环状位移,第0列不动,接下来的几列按照Nb的大小进行相应的移位操作,我们现在的Nb=4,所以第1列移位1位,第2列移位2列,第3列移位3位。该移位是循环左移操作。具体的偏移量与区块数目Nb的关系如表2-2所示。

Nb

C1

C2

C3

4

1

2

3

6

1

2

3

8

1

3

4

3、3-MixColumns算法

该部分算法实则是一个混行转换算法,将Data(也即State)中的每一列单列出来,与一个固定的多项式进行乘法运算。

固定的多项式为:02  03 01  01

0102  03  01

0101  02  03

0201  01  02

在这部分就要涉及到一个多项式问题。假设一个字节b由b7b6b5b4b3b2b1b0组成,那么就可以将其表示成为一个多项式形式:b7*x7+b6*x6+b5*x5+b4*x4+b3*x3+b2*x2+b1*x+b0.

多项式的乘法:在乘法里面,多项式相乘之后的结果很容易造成溢位的问题,解决溢位的方式是把相乘的结果,再模余一个不可分解的多项式m(x)。在Rijndael中,定义一个这样子的多项式为

m(x)=x8+x4+x3+x+1或是(11B)16

将Data也即State)中的每一列都进行同样胡操作。

4、4-AddRoundKey算法

该部分主要是把每一个回合的子密钥通过与Data(也即State)位异或操作。可以以列的形式将Data中的数值与子密钥进行异或运算。有关每一个回合的子密钥来说在第三部分将会详细介绍。

一、密钥的编制(Key Schedule)

回合子密钥(Round Key)是从加密密钥(Cipher Key)经过运算产生出来的。密钥编制(Key Schedule)是由密钥扩充(Key Expansion)及回合密钥的选择(RoundKey Selection)组成的,基本的理论如下:

所有回合密钥的总位数是把区块长度(block length)乘上回合数加1,(有Nr-1个回合,加上一个终止回合(final round)),例如,128个位的区块长度经过10个回合运算,所需要用到的所有回合密钥的总位数为1408个位。

加密密钥(Cipher Key)必须扩充为扩充密钥(Expanded Key)。

回合金钥是从扩充金钥中选出来的,选择的方式如下:第一个回合金钥由前Nb个字组组成,第二个回合金钥由接下来的Nb个字组组成,余此类推。

在该部分首先将Cipher Key中的第四列提取出来,将其循环下移一位(可以理解成将这一列数据旋转成为一行,而后对其循环右移一位),而后将该列进行1-SubBytes运算,与S-Box矩阵进行映射置换操作,接着将其结果与第一列以及回合常数进行异或操作。这边生成了第一回合的第一列子密钥,而后第二列与第一回合第一列子密钥进行异或运算后生成第一回合的第二列子密钥,一次类推,第三列与第二回合的第二列子密钥异或运算,得到第一回合的第三列子密钥等。接下来的第二轮回合则是拿第一回合的子密钥进行相同操作的。知道进行Nr次以后。回合常数如表3-1所示。

表3-1 回合常数

01

02

04

08

10

20

40

80

1b

36

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

而后接下来的便是sha-1算法了,有关sha-1算法的介绍在我之前的博文http://yiluohuanghun.blog.51cto.com/3407300/950450中有所介绍。

本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/1211182,如需转载请自行联系原作者

对称密码算法Rijndael解析—加密相关推荐

  1. PHP-密码学算法及其应用-对称密码算法

    转自:http://www.smatrix.org/bbs/simple/index.php?t5662.html // 目录 1.    PHP的散列函数及其应用 2.    PHP中的对称密码算法 ...

  2. 01. 对称密码——算法

    密码算法 DES 首先声明!!! 由于DES的密文可以在短时间内被破译,现已不再使用. 是什么? DES(Data Encryption Standard)是1977年美国联邦信息处理标准(FIPS) ...

  3. 密码学:分组密码.(块密码:是一种对称密码算法)

    密码学:分组密码. 分组加密(Block Cipher) 又称为分块加密或块密码,是一种对称密码算法,这类算法将明文分成多个等长的块 (Block) ,使用确定的算法和对称密钥对每组分别加密或解密.分 ...

  4. 加密基础知识二 非对称加密RSA算法和对称加密

    一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...

  5. 密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)

    文章目录 1. 分组密码(Twine) 1.1 加解密方式 1.1.1 加密 1.1.2 密钥生成算法 1.1.3 解密 1.1.4 全部代码 1.2. 分组密码的模式 1.2.1 ECB模式 1.2 ...

  6. 转盘抽奖php,使用PHP实现转盘抽奖算法案例解析

    这次给大家带来使用PHP实现转盘抽奖算法案例解析,使用PHP实现转盘抽奖算法的注意事项有哪些,下面就是实战案例,一起来看一下. 流程: 1.拼装奖项数组 2.计算概率 3.返回中奖情况 代码如下: 中 ...

  7. adaboost算法java_Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  8. 机器学习算法实现解析:libFM之libFM的训练过程之SGD的方法

    本节主要介绍的是libFM源码分析的第五部分之一--libFM的训练过程之SGD的方法. 5.1.基于梯度的模型训练方法 在libFM中,提供了两大类的模型训练方法,一类是基于梯度的训练方法,另一类是 ...

  9. md5不是对称密码算法_密码学中的消息摘要算法5(MD5)

    md5不是对称密码算法 In cryptography, MD5 (Message-Digest algorithm 5) is a mainly used cryptographic hash fu ...

最新文章

  1. SQLSERVER model数据库
  2. Android下载图片路径问题
  3. dxf转nc代码软件_FastCAM激光版套料软件
  4. Feign深入学习(一)
  5. java spliterator,Java 8 之Stream Spliterator
  6. Python进程池使用
  7. 老去的80后忆当年-致80后的朋友们
  8. 创业失败反思:吾亦有大错,错在哪里?
  9. python cnn模型_字符级CNN分类模型的实现
  10. 怎么解决Xshell4终端中文乱码问题
  11. Linux centos 7安装
  12. 查询一个表中的两个字段值相同的数据
  13. linux制作 引导盘,制作Linux引导盘的四种方法
  14. 小米手机扩容教程_小米手机加运存和扩容(成功的DIY,过程已更新完)|创意DIY...
  15. ServiceNow 系统上线准备
  16. 分摊的意思_十年分摊是什么意思
  17. python vimdiff_Vimdiff---VIM的比较和合并工具
  18. IBM服务器代理商创业之路①
  19. 用proteus来玩二极管或门电路
  20. EditText的属性说明

热门文章

  1. 前端书签归纳(持续更新)
  2. 2018年十大云宕机事故盘点:主流无一幸免!
  3. 6. Oracle闪回特性
  4. PHP ob_start() 函数介绍
  5. Tomcat内存溢出解决方案
  6. bitnami-redmineserver迁移
  7. 业务直通式管理,你真的了解吗?
  8. O(n^2) 级别的排序算法
  9. 精读《React PowerPlug 源码》
  10. 使用Windows上SourceInsight工具建立分析Linux下uboot源代码project