AES加密解密算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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},