AES - Rijndael 算法(一)
1997年1月,美国标准技术协会NIST开始遴选数据加密标准(Data Encryption Standard,简称DES)替代者的工作,称为高级加密标准[1’2](Advanced Eneryption Stand-ard,简称AES)。同年9月便发布了征集算法的正式公告,用,而且要求AES能在全世界范围内免费得。次年6月提交的21个算法中,有15个满足所有的必备条件并被接纳为AEs的候选算法。经过二轮筛选后,1999年8月公布了五个人围的候选算法:IBM公司提供的 MARS算法、RSA开发的RC6算法、剑桥大学和加利弗尼亚圣地亚哥大学等共同提出的Serpent算法以及因特网安全公司、加利弗尼亚伯克利大学、普林斯顿大学等共同开发的Twofish算法和比利时的两位密码学家设计的Rijndael算法。经过第三轮筛选,Rijndael算法因在安全性、实现代价、实现特性等方面都超过其它算法而得胜。
一:Rijndael算法介绍
AES具有128比特的分组长度,三种可选密钥长度:128比特、192比特和256比特。AES是一个迭代型密码, 轮数Nr依赖于密钥长度,当密钥为128比特时,Nr=10; 当密钥为192比特时,Nr=12;当密钥为256比特时,Nr=14。AES的算法描述如下:
(1)给定一个明文z,将State初始化为x,并进行AddRound—Key操作,将Roundkey与State异或。
(2)对前Nr一1轮中的每一轮,用S盒对进行一次代换操作,称为SubBytes;对State做一置换ShiftRows;再对State做一次操作MixColumns;然后进行AddRoundKey操作。
(3)依次进行SubBytes、ShiftRows和AddRoundKey操作。
(4)将State定义为密文y。
二:Rijndael算法分析
理解AES算法的各种操作是理解AES算法的关键。在AES算法中依次用了AddRoundKey操作、SubBytes操作、ShiftRows操作、MixColumns操作,我们将对这些操作一一进行介绍。
1.AddRoundKey操作
***********************************************************
/* Round key addition function */
void KeyAdd(u8 state[4][4], u8 roundKeys[11][4][4], int round)
{
int i, j;
for (i=0; i<4; i++)
for (j=0; j<4; j++)
state[i][j] ^= roundKeys[round][i][j];
return;
}
************************************************************
2.SubBytes操作
***********************************************************
/* Byte substitution transformation */
int ByteSub(u8 state[4][4])
{
int i, j;
for (i=0; i<4; i++)
for (j=0; j<4; j++)
state[i][j] = S[state[i][j]];
return 0;
}
***********************************************************
3.ShiftRows操作
***********************************************************
/* Row shift transformation */
void ShiftRow(u8 state[4][4])
{
u8 temp;
/* left rotate row 1 by 1 */
temp = state[1][0];
state[1][0] = state[1][1];
state[1][1] = state[1][2];
state[1][2] = state[1][3];
state[1][3] = temp;
/* left rotate row 2 by 2 */
temp = state[2][0];
state[2][0] = state[2][2];
state[2][2] = temp;
temp = state[2][1];
state[2][1] = state[2][3];
state[2][3] = temp;
/* left rotate row 3 by 3 */
temp = state[3][0];
state[3][0] = state[3][3];
state[3][3] = state[3][2];
state[3][2] = state[3][1];
state[3][1] = temp;
return;
}
***********************************************************
4.MixColumns操作
***********************************************************
/* MixColumn transformation*/
void MixColumn(u8 state[4][4])
{
u8 temp, tmp, tmp0;
int i;
/* do one column at a time */
for (i=0; i<4;i++)
{
temp = state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i];
tmp0 = state[0][i];
/* Xtime array does multiply by x in GF2^8 */
tmp = Xtime[state[0][i] ^ state[1][i]];
state[0][i] ^= temp ^ tmp;
tmp = Xtime[state[1][i] ^ state[2][i]];
state[1][i] ^= temp ^ tmp;
tmp = Xtime[state[2][i] ^ state[3][i]];
state[2][i] ^= temp ^ tmp;
tmp = Xtime[state[3][i] ^ tmp0];
state[3][i] ^= temp ^ tmp;
}
return;
}
***********************************************************
参考文档:
3GPP TS 35.206
AES - Rijndael 算法(一)的更多相关文章
- AES - Rijndael 算法(二)
三:Rijndael算法实现(C++版本) /*-------------------- Rijndael round subkeys ---------------------*/u8 roundK ...
- AES - Rijndael 算法(三)
四.Rijndael算法实现,java版本 public class Rijndael_Algorithms { private byte[] key; /**------------------ ...
- AES密码算法详解(转自https://www.cnblogs.com/luop/p/4334160.html)
0 AES简介 我们知道数据加密标准(Data Encryption Standard: DES)的密钥长度是56比特,因此算法的理论安全强度是256.但二十世纪中后期正是计算机飞速发展的阶段,元器件 ...
- java中的AES 256算法遇到 Illegal key size or default parameters错的解决办法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 密码算法详解——AES
0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...
- 【复习】密码算法——AES
0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...
- Delphi与JAVA互加解密AES算法
搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util; import java.io.UnsupportedEncodingException; imp ...
- 密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)
目录 一.数据加密标准 - Data Encryption Standard(DES) 二.高级加密标准 - Advanced Encryption Standard(AES) 三.消息摘要算法第五版 ...
- DES,AeS加解密,MD5,SHA加密
1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...
随机推荐
- POJ 1228 Grandpa's Estate(凸包)
Grandpa's Estate Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11289 Accepted: 3117 ...
- Day9 - Python 多线程、进程
Python之路,Day9, 进程.线程.协程篇 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线 ...
- 转载:C#中事件的由来
原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 我们继续思考转 ...
- java编程思想-泛型思维导图
- Java枚举类型理解
Enum格式理解 Enum的格式可以看做跟class关键字一样 class的定义格式如下: public class abc{ } enum的定义格式如下: Public enum abc { } 引 ...
- (转)dedecms网页模板编写
网页模板就是templets中的htm文件,所以编写模板就是要编写html.这篇文章不是关于标签的具体使用,而是对网页模板的一些理解.包括基本的标签语法,封面模板,列表模板和文档模板的关系. 一 关于 ...
- adb shell - device not found
如果是真机,则连接usb即可(我的是真机).
- Swift - 02 - 常量和变量
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- angularJS学习手册(1)
欢迎来到augularJS的学习 一.什么是angularJS? angular的英文意思是角,为什么要叫angular我也不知道. AngularJS是一个MV*(Model-View-Whatev ...
- 我的github代码添加
1.创建一个新的repository: echo "# backupVim" >> README.md git init git add README.md git c ...