【密码学】C语言实现AES核心步骤

Python010

【密码学】C语言实现AES核心步骤,第1张

按照AES算法,完成AES算法S盒、行移位、列混合、轮密钥加操作

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

AES采用对称分组密码体制,密钥的长度最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。

AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:字节替代(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)、轮密钥加(AddRoundKey),4、最终轮(Final Round),最终轮没有MixColumns。

AES算法的加密整体结构

字节替代(SubBytes):使用一个S盒进行非线性置换,S盒是一个16×16的矩阵,如表4-9所示。字节替代将输入的状态矩阵的每一个字节通过一个简单查表操作,映射为另外一个字节。

输入字节的前4bits指定S盒的行值,后4bits指定S盒的列值,行和列所确定S盒位置的元素作为输出,例如输入字节“03”,行值为0,列值为3,根据表4-9可知第0行第3列对应的值为 “7B”,因此输出字节为“7B”。

举例

在上面的示例中,第1个基本元素为”F5”,它将被S盒行为第”F行”、列为第”5”列的元素“E6“代替,其余的输出也用相同的方法确定。

状态阵列的4个行循环以字节为基本单位进行左移,而每行循环做移的偏移量是由明文分组的大小和所在行数共同确定,即列数Nb和行号确定。

举例

举例

轮密钥加操作是将密钥与明文按比特异或,轮密钥通过密钥扩展得到

和fips-192(AES)的标准一样

使用对称加密算法AES

加密通常有对称加密(DES、AES)、非对称加密(RSA)、单向加密(MD5不可复原),非对称算法很安全但是速度慢一般用于传输对称加密的秘钥,本文主要介绍C#如何使用基于AES标准的Rijndael算法对数据包进行加密传输。

RijndaelManaged类为Rijndael算法管理类。这里有几个主要参数,单位都是bit:BlockSize、FeedbackSize、KeySize、Mode、Padding。这些参数可以影响私钥和IV长度,以及数据加密方式等。

ICryptoTransform为数据转换接口,有TransformBlock和TransformFinalBlock两个方法,这两个方法基本一样,主要是TransformBlock要求被处理数组需为InputBlockSize的整数倍,因为需要使用缓存减少GC这里在外部实现TransformFinalBlock中做的处理。

下方方法都是参照RijndaelManagedTransform.cs的 源码 实现的,对一个字节数组加密前需要先调用CheckBlock,返回值为存储加密后的数组大小。

加密与解密操作

网络数据传输