AES加密解密算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

集美大学计算机工程学院实验报告

课程名称:班级:实验成绩:

指导教师:姓名:

实验项目名称:AES加密解密算法学号:上机实践日期:

实验项目编号:组号:上机实践时间:2学时

一、实验目的

学习AES加密的方法。

二、实验内容与设计思想

编写AES加密解密算法,并测试。

三、实验使用环境

操作系统:Microsoft Windows 7

编程环境:Visual C++ 6.0

四、实验步骤和调试过程

// AES.h

#ifndef AES_H_

#define AES_H_

#include

#include

using namespace std;

class AES

{

public:

typedef unsigned char byte;

static const int KEY_SIZE = 16; // 密钥长度为位

static const int N_ROUND = 11;

byte plainText[16]; // 明文

byte state[16]; // 当前分组。

byte cipherKey[16]; // 密钥

byte roundKey[N_ROUND][16]; //轮密钥

byte cipherText[16]; //密文

byte SBox[16][16]; // S盒

byte InvSBox[16][16]; // 逆S盒

void EncryptionProcess();

void DecryptionProcess();

void Round(const int& round);

void InvRound(const int& round);

void FinalRound();

void InvFinalRound();

void KeyExpansion();

void AddRoundKey(const int& round);

void SubBytes();

void InvSubBytes();

void ShiftRows();

void InvShiftRows();

void MixColumns();

void InvMixColumns();

void BuildSBox();

void BuildInvSBox();

void InitialState(const byte* text);

void InitialCipherText();

void InitialplainText();

byte GFMultplyByte(const byte& left, const byte& right);

const byte* GFMultplyBytesMatrix(const byte* left, const byte* right);

public:

AES();

const byte* Cipher(const byte* text, const byte* key, const int& keySize); const byte* InvCipher(const byte* text, const byte* key, const int& keySize); };

void AES::EncryptionProcess()

{ // 加密过程

InitialState(plainText);

KeyExpansion(); // 密钥扩展

AddRoundKey(0); // 轮密钥加

for(int i = 1; i < N_ROUND-1; ++i)

{

Round(i);

}

FinalRound();

InitialCipherText();

}

void AES::DecryptionProcess()

{ // 解密过程

InitialState(cipherText);

KeyExpansion();

InvFinalRound();

for(int i = N_ROUND-2; i > 0 ; --i)

{

InvRound(i);

}

AddRoundKey(0);

InitialplainText();

}

void AES::Round(const int& round) { // 正常轮

SubBytes();

ShiftRows();

MixColumns();

AddRoundKey(round);

}

void AES::InvRound(const int& round) { // 正常轮的逆

AddRoundKey(round);

InvMixColumns();

InvShiftRows();

InvSubBytes();

}

void AES::FinalRound()

{ // 最后轮

SubBytes();

ShiftRows();

AddRoundKey(N_ROUND - 1);

}

void AES::InvFinalRound()

{ // 最后轮的逆

AddRoundKey(N_ROUND - 1); InvShiftRows();

InvSubBytes();

}

void AES::KeyExpansion()

{ // 密钥扩展

const byte rcon[N_ROUND][4] = { {0x00, 0x00, 0x00, 0x00}, {0x01, 0x00, 0x00, 0x00},

{0x02, 0x00, 0x00, 0x00},

{0x04, 0x00, 0x00, 0x00},

{0x08, 0x00, 0x00, 0x00},

{0x10, 0x00, 0x00, 0x00},

{0x20, 0x00, 0x00, 0x00},

相关文档
最新文档