1.aes加密算法C代码
2.密码学基础:AES加密算法
3.JavaScript学习 -- AES加密算法
4.c++实现AES加密解密算法
5.Python代码实现AES加密算法
6.AES加密算法原理及其实现(小学生不一定也能看懂版)
aes加密算法C代码
完整的算算法!
#include "stdio.h"
#include "memory.h"
#include "time.h"
#include "stdlib.h"
#define PLAIN_FILE_OPEN_ERROR -1
#define KEY_FILE_OPEN_ERROR -2
#define CIPHER_FILE_OPEN_ERROR -3
#define OK 1
typedef char ElemType;
/*初始置换表IP*/
int IP_Table[] = { ,法源,,,,,9,1,
,,,,,,,3,
,,,,,,,5,
,,,,,,,7,
,,,,,,8,0,
,,,,,,,2,
,,,,,,,4,
,,,,,,,6};
/*逆初始置换表IP^-1*/
int IP_1_Table[] = { ,7,,,,,,,
,6,,,,,,,
,5,,,,,,,
,4,,,,,,,
,3,,,,,,,
,2,,,,,,,
,1,,9,,,,,
,0,,8,,,,};
/*扩充置换表E*/
int E_Table[] = { , 0, 1, 2, 3, 4,
3, 4, 5, 6, 7, 8,
7, 8,9,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,, 0};
/*置换函数P*/
int P_Table[] = { ,6,,,,,,,
0,,,,4,,,9,
1,7,,,,,2,8,
,,,5,,,3,};
/*S盒*/
int S[8][4][] =
/*S1*/
{ { { ,4,,1,2,,,8,3,,6,,5,9,0,7},
{ 0,,7,4,,2,,1,,6,,,9,5,3,8},
{ 4,1,,8,,6,2,,,,9,7,3,,5,0},
{ ,,8,2,4,9,1,7,5,,3,,,0,6,}},
/*S2*/
{ { ,1,8,,6,,3,4,9,7,2,,,0,5,},
{ 3,,4,7,,2,8,,,0,1,,6,9,,5},
{ 0,,7,,,4,,1,5,8,,6,9,3,2,},
{ ,8,,1,3,,4,2,,6,7,,0,5,,9}},
/*S3*/
{ { ,0,9,,6,3,,5,1,,,7,,4,2,8},
{ ,7,0,9,3,4,6,,2,8,5,,,,,1},
{ ,6,4,9,8,,3,0,,1,2,,5,,,7},
{ 1,,,0,6,9,8,7,4,,,3,,5,2,}},
/*S4*/
{ { 7,,,3,0,6,9,,1,2,8,5,,,4,},
{ ,8,,5,6,,0,3,4,7,2,,1,,,9},
{ ,6,9,0,,,7,,,1,3,,5,2,8,4},
{ 3,,0,6,,1,,8,9,4,5,,,7,2,}},
/*S5*/
{ { 2,,4,1,7,,,6,8,5,3,,,0,,9},
{ ,,2,,4,7,,1,5,0,,,3,9,8,6},
{ 4,2,1,,,,7,8,,9,,5,6,3,0,},
{ ,8,,7,1,,2,,6,,0,9,,4,5,3}},
/*S6*/
{ { ,1,,,9,2,6,8,0,,3,4,,7,5,},
{ ,,4,2,7,,9,5,6,1,,,0,,3,8},
{ 9,,,5,2,8,,3,7,0,4,,1,,,6},
{ 4,3,2,,9,5,,,,,1,7,6,0,8,}},
/*S7*/
{ { 4,,2,,,0,8,,3,,9,7,5,,6,1},
{ ,0,,7,4,9,1,,,3,5,,2,,8,6},
{ 1,4,,,,3,7,,,,6,8,0,5,9,2},
{ 6,,,8,1,4,,7,9,5,0,,,2,3,}},
/*S8*/
{ { ,2,8,4,6,,,1,,9,3,,5,0,,7},
{ 1,,,8,,3,7,4,,5,6,,0,,9,2},
{ 7,,4,1,9,,,2,0,6,,,,3,5,8},
{ 2,1,,7,4,,8,,,,9,0,3,5,6,}}};
/*置换选择1*/
int PC_1[] = { ,,,,,,8,
0,,,,,,,
9,1,,,,,,
,,2,,,,,
,,,,,,,
6,,,,,,,
,5,,,,,,
,,4,,,,3};
/*置换选择2*/
int PC_2[] = { ,,,,0,4,2,,
,5,,9,,,,3,
,7,,6,,,,1,
,,,,,,,,
,,,,,,,,
,,,,,,,};
/*对左移次数的规定*/
int MOVE_TIMES[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
int ByteToBit(ElemType ch,ElemType bit[8]);
int BitToByte(ElemType bit[8],ElemType *ch);
int Char8ToBit(ElemType ch[8],ElemType bit[]);
int BitToChar8(ElemType bit[],ElemType ch[8]);
int DES_MakeSubKeys(ElemType key[],ElemType subKeys[][]);
int DES_PC1_Transform(ElemType key[], ElemType tempbts[]);
int DES_PC2_Transform(ElemType key[], ElemType tempbts[]);
int DES_ROL(ElemType data[], int time);
int DES_IP_Transform(ElemType data[]);
int DES_IP_1_Transform(ElemType data[]);
int DES_E_Transform(ElemType data[]);
int DES_P_Transform(ElemType data[]);
int DES_SBOX(ElemType data[]);
int DES_XOR(ElemType R[], ElemType L[],int count);
int DES_Swap(ElemType left[],ElemType right[]);
int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[][], ElemType cipherBlock[8]);
int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[][], ElemType plainBlock[8]);
int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);
int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile);
/*字节转换成二进制*/
int ByteToBit(ElemType ch, ElemType bit[8]){
int cnt;
for(cnt = 0;cnt < 8; cnt++){
*(bit+cnt) = (ch>>cnt)&1;
}
return 0;
}
/*二进制转换成字节*/
int BitToByte(ElemType bit[8],ElemType *ch){
int cnt;
for(cnt = 0;cnt < 8; cnt++){
*ch |= *(bit + cnt)<<cnt;
}
return 0;
}
/*将长度为8的字符串转为二进制位串*/
int Char8ToBit(ElemType ch[8],ElemType bit[]){
int cnt;
for(cnt = 0; cnt < 8; cnt++){
ByteToBit(*(ch+cnt),bit+(cnt<<3));
}
return 0;
}
/*将二进制位串转为长度为8的字符串*/
int BitToChar8(ElemType bit[],ElemType ch[8]){
int cnt;
memset(ch,0,8);
for(cnt = 0; cnt < 8; cnt++){
BitToByte(bit+(cnt<<3),ch+cnt);
}
return 0;
}
/*生成子密钥*/
int DES_MakeSubKeys(ElemType key[],ElemType subKeys[][]){
ElemType temp[];
int cnt;
DES_PC1_Transform(key,temp);/*PC1置换*/
for(cnt = 0; cnt < ; cnt++){ /*轮跌代,产生个子密钥*/
DES_ROL(temp,代码MOVE_TIMES[cnt]);/*循环左移*/
DES_PC2_Transform(temp,subKeys[cnt]);/*PC2置换,产生子密钥*/
}
return 0;
}
/*密钥置换1*/
int DES_PC1_Transform(ElemType key[],算算法 ElemType tempbts[]){
int cnt;
for(cnt = 0; cnt < ; cnt++){
tempbts[cnt] = key[PC_1[cnt]];
}
return 0;
}
/*密钥置换2*/
int DES_PC2_Transform(ElemType key[], ElemType tempbts[]){
int cnt;
for(cnt = 0; cnt < ; cnt++){
tempbts[cnt] = key[PC_2[cnt]];
}
return 0;
}
/*循环左移*/
int DES_ROL(ElemType data[], int time){
ElemType temp[];
/*保存将要循环移动到右边的位*/
memcpy(temp,data,time);
memcpy(temp+time,data+,time);
/*前位移动*/
memcpy(data,data+time,-time);
memcpy(data+-time,temp,time);
/*后位移动*/
memcpy(data+,data++time,-time);
memcpy(data+-time,temp+time,time);
return 0;
}
/*IP置换*/
int DES_IP_Transform(ElemType data[]){
int cnt;
ElemType temp[];
for(cnt = 0; cnt < ; cnt++){
temp[cnt] = data[IP_Table[cnt]];
}
memcpy(data,temp,);
return 0;
}
/*IP逆置换*/
int DES_IP_1_Transform(ElemType data[]){
int cnt;
ElemType temp[];
for(cnt = 0; cnt < ; cnt++){
temp[cnt] = data[IP_1_Table[cnt]];
}
memcpy(data,temp,);
return 0;
}
/*扩展置换*/
int DES_E_Transform(ElemType data[]){
int cnt;
ElemType temp[];
for(cnt = 0; cnt < ; cnt++){
temp[cnt] = data[E_Table[cnt]];
}
memcpy(data,temp,);
return 0;
}
/*P置换*/
int DES_P_Transform(ElemType data[]){
int cnt;
ElemType temp[];
for(cnt = 0; cnt < ; cnt++){
temp[cnt] = data[P_Table[cnt]];
}
memcpy(data,temp,);
return 0;
}
/*异或*/
int DES_XOR(ElemType R[], ElemType L[] ,int count){
int cnt;
for(cnt = 0; cnt < count; cnt++){
R[cnt] ^= L[cnt];
}
return 0;
}
/*S盒置换*/
int DES_SBOX(ElemType data[]){
int cnt;
int line,row,output;
int cur1,cur2;
for(cnt = 0; cnt < 8; cnt++){
cur1 = cnt*6;
cur2 = cnt<<2;
/*计算在S盒中的行与列*/
line = (data[cur1]<<1) + data[cur1+5];
row = (data[cur1+1]<<3) + (data[cur1+2]<<2)
+ (data[cur1+3]<<1) + data[cur1+4];
output = S[cnt][line][row];
/*化为2进制*/
data[cur2] = (output&0X)>>3;
data[cur2+1] = (output&0X)>>2;
data[cur2+2] = (output&0X)>>1;
data[cur2+3] = output&0x;
}
return 0;
}
/*交换*/
int DES_Swap(ElemType left[], ElemType right[]){
ElemType temp[];
memcpy(temp,left,);
memcpy(left,right,);
memcpy(right,temp,);
return 0;
}
/*加密单个分组*/
int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[][], ElemType cipherBlock[8]){
ElemType plainBits[];
ElemType copyRight[];
int cnt;
Char8ToBit(plainBlock,plainBits);
/*初始置换(IP置换)*/
DES_IP_Transform(plainBits);
/*轮迭代*/
for(cnt = 0; cnt < ; cnt++){
memcpy(copyRight,plainBits+,);
/*将右半部分进行扩展置换,从位扩展到位*/
DES_E_Transform(copyRight);
/*将右半部分与子密钥进行异或操作*/
DES_XOR(copyRight,法源subKeys[cnt],);
/*异或结果进入S盒,输出位结果*/
DES_SBOX(copyRight);
/*P置换*/
DES_P_Transform(copyRight);
/*将明文左半部分与右半部分进行异或*/
DES_XOR(plainBits,代码kafkalistener源码分析copyRight,);
if(cnt != ){
/*最终完成左右部的交换*/
DES_Swap(plainBits,plainBits+);
}
}
/*逆初始置换(IP^1置换)*/
DES_IP_1_Transform(plainBits);
BitToChar8(plainBits,cipherBlock);
return 0;
}
/*解密单个分组*/
int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[][],ElemType plainBlock[8]){
ElemType cipherBits[];
ElemType copyRight[];
int cnt;
Char8ToBit(cipherBlock,cipherBits);
/*初始置换(IP置换)*/
DES_IP_Transform(cipherBits);
/*轮迭代*/
for(cnt = ; cnt >= 0; cnt--){
memcpy(copyRight,cipherBits+,);
/*将右半部分进行扩展置换,从位扩展到位*/
DES_E_Transform(copyRight);
/*将右半部分与子密钥进行异或操作*/
DES_XOR(copyRight,算算法subKeys[cnt],);
/*异或结果进入S盒,输出位结果*/
DES_SBOX(copyRight);
/*P置换*/
DES_P_Transform(copyRight);
/*将明文左半部分与右半部分进行异或*/
DES_XOR(cipherBits,法源copyRight,);
if(cnt != 0){
/*最终完成左右部的交换*/
DES_Swap(cipherBits,cipherBits+);
}
}
/*逆初始置换(IP^1置换)*/
DES_IP_1_Transform(cipherBits);
BitToChar8(cipherBits,plainBlock);
return 0;
}
/*加密文件*/
int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){
FILE *plain,*cipher;
int count;
ElemType plainBlock[8],cipherBlock[8],keyBlock[8];
ElemType bKey[];
ElemType subKeys[][];
if((plain = fopen(plainFile,"rb")) == NULL){
return PLAIN_FILE_OPEN_ERROR;
}
if((cipher = fopen(cipherFile,"wb")) == NULL){
return CIPHER_FILE_OPEN_ERROR;
}
/*设置密钥*/
memcpy(keyBlock,keyStr,8);
/*将密钥转换为二进制流*/
Char8ToBit(keyBlock,bKey);
/*生成子密钥*/
DES_MakeSubKeys(bKey,subKeys);
while(!feof(plain)){
/*每次读8个字节,并返回成功读取的代码字节数*/
if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){
DES_EncryptBlock(plainBlock,subKeys,cipherBlock);
fwrite(cipherBlock,sizeof(char),8,cipher);
}
}
if(count){
/*填充*/
memset(plainBlock + count,'\0',7 - count);
/*最后一个字符保存包括最后一个字符在内的所填充的字符数量*/
plainBlock[7] = 8 - count;
DES_EncryptBlock(plainBlock,subKeys,cipherBlock);
fwrite(cipherBlock,sizeof(char),8,cipher);
}
fclose(plain);
fclose(cipher);
return OK;
}
/*解密文件*/
int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){
FILE *plain, *cipher;
int count,times = 0;
long fileLen;
ElemType plainBlock[8],cipherBlock[8],keyBlock[8];
ElemType bKey[];
ElemType subKeys[][];
if((cipher = fopen(cipherFile,"rb")) == NULL){
return CIPHER_FILE_OPEN_ERROR;
}
if((plain = fopen(plainFile,"wb")) == NULL){
return PLAIN_FILE_OPEN_ERROR;
}
/*设置密钥*/
memcpy(keyBlock,keyStr,8);
/*将密钥转换为二进制流*/
Char8ToBit(keyBlock,bKey);
/*生成子密钥*/
DES_MakeSubKeys(bKey,subKeys);
/*取文件长度 */
fseek(cipher,0,SEEK_END);/*将文件指针置尾*/
fileLen = ftell(cipher); /*取文件指针当前位置*/
rewind(cipher); /*将文件指针重指向文件头*/
while(1){
/*密文的字节数一定是8的整数倍*/
fread(cipherBlock,sizeof(char),8,cipher);
DES_DecryptBlock(cipherBlock,subKeys,plainBlock);
times += 8;
if(times < fileLen){
fwrite(plainBlock,sizeof(char),8,plain);
}
else{
break;
}
}
/*判断末尾是否被填充*/
if(plainBlock[7] < 8){
for(count = 8 - plainBlock[7]; count < 7; count++){
if(plainBlock[count] != '\0'){
break;
}
}
}
if(count == 7){ /*有填充*/
fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);
}
else{ /*无填充*/
fwrite(plainBlock,sizeof(char),8,plain);
}
fclose(plain);
fclose(cipher);
return OK;
}
int main()
{
clock_t a,b;
a = clock();
DES_Encrypt("1.txt","key.txt","2.txt");
b = clock();
printf("加密消耗%d毫秒\n",b-a);
system("pause");
a = clock();
DES_Decrypt("2.txt","key.txt","3.txt");
b = clock();
printf("解密消耗%d毫秒\n",b-a);
getchar();
return 0;
}
密码学基础:AES加密算法
深入探索:AES加密算法的数学奥秘与核心操作 AES,全称Advanced Encryption Standard,算算法作为当代最强大的法源加密算法之一,它的代码出现是为了解决DES时代的安全需求。Rijndael算法凭借其位分组和//位密钥的算算法灵活性,成功胜出,法源尤其在MixColumn层,代码其巧妙运用了伽罗瓦域的数学特性。 伽罗瓦域的数学基础 素域,如GF(p),是有限域的特例,元素个数为素数幂,如GF(5)中的2,其加法逆元为3,乘法逆元同样为3。而扩展域,开源杀毒源码阶非素数,其运算规则更为复杂,需要特殊符号和规则来定义。 AES中的数学应用 AES算法的元素用GF(2^m)的多项式表示,GF(2^8)尤其重要,它用个8位元素构建了加密的舞台。加密过程中的加减法,实际上等价于异或运算,这是基于GF(2)的基础。而关键的Mix Column层,其乘法运算在多项式简化后通过取余操作得以实现。 加密细节揭秘 轮密钥加、SubByte(字节代换)、Shift Rows和Mix Column这些步骤,构成了AES的加密核心。最后一轮略有不同,字节异或用于密钥加法,S_box表则负责字节代换。深入研究时,你会看到这些操作背后的数学逻辑和代码实现。 加密步骤精炼 Cipher_S_Substitution函数巧妙地运用了逆S_box,处理字节的数据。ShiftRows的view 源码详解加密与解密操作,通过字节位移操作,形成加密过程中的扩散和雪崩效应。至于具体步骤,虽然未详述,但关键在于理解其方向性变换和混淆效应。 在AES加密中,二维数组通过ShiftRows进行一维行位移,而MixColumn则利用GF(2^8)的矩阵乘法,异或与特殊乘法相结合。加密过程中的矩阵操作,如矩阵左乘,展示了数学在密码学中的精密运用。 密钥管理与扩展 AES的密钥生成从Bit出发,遵循特定的G函数处理规则。扩展密钥的生成涉及到W数组和G()函数的翻转、S盒代换以及Rcon异或,这些操作在生成密钥代码中体现得淋漓尽致。 学习AES不仅需要扎实的数学基础,如欧几里得算法和扩展欧几里得算法,它们在密钥扩展和线性组合系数计算中发挥着关键作用。例如,通过欧几里得算法计算最大公约数,扩展欧几里得算法则用于求逆元,苹果集合源码尤其是在伽罗瓦域内。 加密实践与S盒生成 S盒是AES算法的基石,仿射映射通过矩阵乘法和EEA_V2来实现。逆S盒的生成则需要逆仿射映射,这个过程与S盒生成类似,但矩阵值和异或数有所不同。代码中,如ByteImage函数,展示了如何将输入映射到S盒的输出。 数学的精妙融合在AES加密的每一个环节,深入理解这些数学原理,将助你更深入地探索这一加密技术的奥秘。继续你的密码学旅程,不断学习,你会发现数学在保障信息安全中的无尽魅力。JavaScript学习 -- AES加密算法
在数字化时代,前端数据加密是关键,尤其是使用AES(Advanced Encryption Standard)对称加密算法。AES因其高强度和广泛应用,成为保护敏感数据传输和存储免受攻击的基石。本文将详细介绍如何在JavaScript中使用AES,包括选择填充模式、利用CryptoJS库、基金源码资本生成和保存密钥,以及解密过程。
AES算法基于相同的密钥进行加密和解密,密钥长度有位、位或位,密钥越长,破解难度越大。JavaScript中的CryptoJS库简化了AES操作,首先需引入库。生成AES密钥时,务必妥善处理,可通过随机生成或服务器获取。
为了保证加密数据的长度,明文需要进行填充,如PKCS#7填充模式。以下代码展示了加密过程,包括填充数据、加密和转换为字符串:
<pre>const dataToEncrypt = "Sensitive information";
const paddedData = CryptoJS.pad.Pkcs7.pad(CryptoJS.enc.Utf8.parse(dataToEncrypt));
const encryptedData = CryptoJS.AES.encrypt(paddedData, aesKey, { mode: CryptoJS.mode.ECB });
const encryptedString = encryptedData.toString();</pre>
同样,解密时需要相同的密钥和填充模式。解密示例代码如下:
<pre>const encryptedData = "encrypted data here";
const decryptedData = CryptoJS.AES.decrypt(encryptedData, aesKey, { mode: CryptoJS.mode.ECB });
const unpaddedData = CryptoJS.pad.Pkcs7.unpad(decryptedData);
const decryptedString = unpaddedData.toString(CryptoJS.enc.Utf8);</pre>
然而,密钥的安全是至关重要的。通常,将密钥存储在服务器或使用安全存储技术,如Web Storage或HttpOnly Cookie。务必注意,定期更新密钥并遵循最佳安全实践以确保最高级保护。
总的来说,通过AES加密和合理的填充策略,前端开发者能够有效增强应用程序的安全性。让我们共同努力,创建更安全的前端应用环境!</p>
c++实现AES加密解密算法
本文旨在讲解如何在C++中实现AES加密与解密功能,内容分为两大部分:
首先,创建了一个外部调用类CAes,用于实现AES加密解密静态库的封装。
在进行开发时,本代码是在Windows 系统环境下使用Visual Studio 进行调试。
第二部分,提供了测试代码示例,用于验证静态库的正确性。
下面是测试代码的具体实现:
在执行后,得到了相应的运行结果。
需要注意的是,CAes类中的所有函数均为静态函数,无需定义对象即可直接调用,通过CAes::前缀访问。
在初始化时,可以通过CAes::initAes设置密钥,若未设置,则系统将使用默认密钥。
默认密钥通过数组UINT8 gAesKey[]进行定义。
加密与解密操作,如encryptData和decryptData,可以实现与其它编程语言(例如Java)间的加密与解密互操作。
对于带有数据长度信息的加密操作,encryptDataWithHead与decryptDataWithHead函数在加密时,会将源数据长度转换为8位长度的进制字符串,并将其作为数据头添加在源数据前;而在解密过程中,需先去除数据头再进行解密处理。
Python代码实现AES加密算法
Python通过cryptography和pycryptodome库为AES加密算法提供了便利的实现途径。本文将逐步介绍如何在Python环境中运用这些库进行AES加密操作,包括密钥生成、加密和解密的过程,以及如何处理加密数据,以确保数据的安全性和保密性。首先,了解密钥扩展是关键,它涉及原始密钥的扩展生成多对子密钥,这些子密钥在每轮加密中起到作用。初始常量的选择虽然公开,但不会影响密码的安全性。
在密钥扩展过程中,将位密钥分为两部分,通过左循环移位、S盒置换和轮常数异或等步骤生成新的密钥。具体实现时,我们对状态矩阵与密钥进行逐位异或操作,然后进行半字节替代,确保置换盒的正逆匹配。接着是行移位和列混淆,这都是通过代码直接执行的简单操作。
AES加密的核心功能包括ASCII码扩展,即对字符进行ASCII码转二进制加密,代码实现后可通过测试验证其正确性。在安全性方面,本文还涉及暴力破解的场景,即通过明文密文对尝试所有可能的密钥。同时,多重加密,即使用多个密钥对同一明文进行加密,也是我们讨论的内容。
通过上述步骤,Python的AES加密变得直观易懂,无论是在实际项目中还是理论学习上,都提供了有效的工具和理解方式。
AES加密算法原理及其实现(小学生不一定也能看懂版)
本文旨在以通俗易懂的方式解析AES加密算法,适合小学生理解。AES是一种使用单一密钥进行加密和解密的对称加密技术,与非对称加密(如SM2和RSA)不同。
理解AES的关键在于其分轮加密过程。每一轮加密都类似,只是每次使用不同的子密钥。例如,假设分三轮,原始密钥会通过某种方法变换为三个子密钥:原始密钥->密钥A->密钥B->密钥C。核心加密步骤是通过四个阶段进行:字节替换、行移位、列混淆以及加轮密钥。
在AES中,所有的计算都基于矩阵,原始数据和密钥都转化为x或更大尺寸的矩阵。以位AES为例,将个字符的原文和字符的密钥转换成这样的矩阵,进行运算。加密中的一轮包括四个抽象但关键的步骤:字节替代(用预定义的S_box映射)、行移位(数据行位移)、列混淆(利用线性代数的矩阵运算)和加轮密钥(用密钥进行异或操作)。
解密则是通过逆向操作,即使用相应的逆矩阵和字节替换的逆映射进行。有限域的概念在此起到关键作用,确保了运算不会导致数据溢出。
最后,每一轮加密的总结是:SubBytes->ShiftRows->MixColumns->AddRoundKey,解密则是这四步的逆序。理解了这些,你已经掌握了AES的基本原理,可以尝试应用到自己的创新项目中,但请记住,理解加密是为了保护信息安全,而不是破解。