目录
一、理论基础
AES算法是一种对称加密算法,被广泛应用于数据加密和保护领域中。将介绍如何使用AES算法对英文文字进行加解密。
一、AES算法概述
AES算法是一种分组密码算法,可以对128位数据块进行加密和解密。它使用一个密钥来加密数据,密钥长度可以是128位、192位或256位。AES算法使用四个基本操作:SubBytes、ShiftRows、MixColumns和AddRoundKey,这些操作可以应用多次来增强加密的安全性。
SubBytes操作
SubBytes操作是AES算法中的一个基本操作,它用一个固定的S盒将输入的字节替换为另一个字节。S盒是一个16行16列的表格,其中每个元素都是一个8位二进制数。SubBytes操作通过查找输入字节在S盒中对应的元素,将输入字节替换为S盒中对应的元素。
ShiftRows操作
ShiftRows操作是AES算法中的另一个基本操作,它将输入数据的每一行向左移动若干个字节。第一行不移动,第二行向左移动一个字节,第三行向左移动两个字节,第四行向左移动三个字节。ShiftRows操作可以使输入数据的局部结构更加分散,增强加密的安全性。
MixColumns操作
MixColumns操作是AES算法中的第三个基本操作,它将输入数据的每一列进行线性变换。MixColumns操作使用一个4x4的矩阵来进行变换,矩阵中的每个元素都是一个8位二进制数。MixColumns操作可以使输入数据的局部结构更加复杂,增强加密的安全性。
AddRoundKey操作
AddRoundKey操作是AES算法中的最后一个基本操作,它将输入数据与一个密钥进行异或运算。密钥是一个与输入数据长度相同的字节序列,用于加密和解密数据。AddRoundKey操作可以增强加密的安全性,使得输入数据与密钥之间的关系更加复杂。
二、AES算法流程
AES算法的加密和解密过程是相似的,主要包括以下步骤:
密钥扩展
在AES算法中,密钥需要进行扩展,以便在加密和解密过程中使用。密钥扩展使用一个密钥调度算法,将输入的密钥扩展为多个轮密钥。轮密钥是一个与输入数据长度相同的字节序列,用于加密和解密数据。
初始轮
初始轮是AES算法中的第一轮,它将输入数据与第一个轮密钥进行异或运算。
主轮
主轮是AES算法中的主要部分,它包括多轮SubBytes、ShiftRows、MixColumns和AddRoundKey操作。在每一轮中,输入数据都会经过SubBytes、ShiftRows和MixColumns操作,然后再与当前轮密钥进行AddRoundKey操作。主轮的轮数取决于密钥长度,通常为10轮、12轮或14轮。
最终轮
最终轮与初始轮类似,它将输入数据与最后一个轮密钥进行异或运算,得到加密数据或解密数据。
三、英文文字加解密实现
在实现英文文字加解密时,我们需要将字符串转换为字节数组,然后按照AES算法的流程进行加密或解密操作。加密和解密的过程类似,只是在最终轮中使用的轮密钥不同。
在加密函数中,我们首先将字符串转换为字节数组,并使用PKCS7填充方式对字节数组进行填充,以使其长度为AES.block_size的倍数。然后使用AES算法进行加密,并将加密后的字节数组进行Base64编码,得到加密后的字符串。
在解密函数中,我们首先将Base64编码的字符串转换为字节数组,并使用AES算法进行解密。然后去除填充部分,得到原始字节数组,并将其转换为字符串。
二、核心程序
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')
% Set 1 data
a{1,1} = 'Alice';
a{1,2} = 'alice123';
a{2,1} = 'Bob';
a{2,2} = 'Bob123';
a{1,3} = [1 1 0 0];
a{2,3} = [1 1 0 0 1 0];
a
%Convert to uint8 format and encrypt
[row col] = size(a);
for i=1:row
for j=1:col
if ~ischar(a{i,j})|~isa(a{i,j},'uint8')
uint8_a = uint8(a{i,j});
encry_op{i,j} = aescrypt(uint8_a,'test1234');
else
encry_op{i,j} = aescrypt(a{i,j},'test1234');
end
end
end
encry_op
% uint8_reshape_a = uint8(reshape_a)
%Decryption
[row col] = size(encry_op);
for i=1:row
for j=1:col
decry_op{i,j} = aesdecrypt(encry_op{i,j},'test1234');
end
end
decry_op
%Reconstruct
reconstruct_op = decry_op;
for i=1:row
for j=1:2
reconstruct_op{i,j}=char(decry_op{i,j});
end
end
reconstruct_op
up2111
三、仿真结论
a =
2×3 cell 数组
{'Alice'} {'alice123'} {[ 1 1 0 0]}
{'Bob' } {'Bob123' } {[1 1 0 0 1 0]}
encry_op =
2×3 cell 数组
{[56 242 193 232 3 101 156 121 193 239 107 75 … ]} {[ 201 85 47 55 184 255 40 26 162 29 186 97 … ]} {[250 204 162 203 207 59 255 172 172 141 199 … ]}
{[ 54 252 60 128 130 84 72 91 190 106 162 43 … ]} {[222 74 163 91 95 39 66 38 225 165 97 212 60 … ]} {[ 55 62 72 68 90 192 113 253 57 219 74 207 … ]}
decry_op =
2×3 cell 数组
{[65 108 105 99 101]} {[97 108 105 99 101 49 50 51]} {[ 1 1 0 0]}
{[ 66 111 98]} {[ 66 111 98 49 50 51]} {[1 1 0 0 1 0]}
reconstruct_op =
2×3 cell 数组
{'Alice'} {'alice123'} {[ 1 1 0 0]}
{'Bob' } {'Bob123' } {[1 1 0 0 1 0]}