目录
1.AES加解密
高级加密标准(AES,Advanced Encryption Standard)是一种对称加密算法,广泛应用于数据保护、加密通信和信息安全领域。它使用相同的密钥进行加密和解密,提供高度的安全性和性能。以下是AES加解密的基本原理和相关公式:
1. 原理
AES是基于代换-置换网络(Substitution-Permutation Network,SPN)结构的分组加密算法。它将输入数据块分成固定大小(128位)的数据块,然后通过多轮的代换和置换操作,最终产生加密后的输出数据块。
2. 密钥扩展
AES使用不同的密钥长度(128、192、256位),并将密钥扩展为一系列轮密钥。密钥扩展算法生成每轮所需的轮密钥,这些轮密钥用于代换和置换操作。
3. 代换步骤(SubBytes)
在代换步骤中,字节通过一个固定的代换盒(S盒)进行替换。S盒是一个预先计算好的字节代换表,将输入字节映射为输出字节,增加了加密的混淆性。
4. 行位移步骤(ShiftRows)
在行位移步骤中,每一行的字节在状态矩阵中进行循环左移。这样做有助于扩大局部变化,增加算法的扩散性。
5. 列混淆步骤(MixColumns)
在列混淆步骤中,状态矩阵的每一列通过矩阵乘法和模多项式运算进行混淆。这个步骤增加了字节之间的复杂性,增强了加密的随机性。
6. 轮密钥加步骤(AddRoundKey)
在每一轮中,轮密钥与状态矩阵进行逐位异或操作,将轮密钥的比特与数据块的比特相结合。
7. 加密过程
加密过程涉及多轮的代换、置换和轮密钥加操作。具体步骤如下:
轮密钥加:初始状态矩阵与第一轮轮密钥异或。
多轮代换和置换:重复执行SubBytes、ShiftRows、MixColumns和AddRoundKey步骤。
最后一轮:没有MixColumns步骤,只有SubBytes、ShiftRows和AddRoundKey步骤。
8. 解密过程
解密过程与加密过程类似,但是操作顺序相反,即先进行AddRoundKey,然后逆向执行ShiftRows、SubBytes和AddRoundKey步骤。最后一轮的MixColumns操作也被省略。
2.DES加解密
数据加密标准(DES,Data Encryption Standard)是一种对称加密算法,用于保护数据的机密性。虽然由于其较短的密钥长度而在安全性上受到挑战,但它仍具有历史意义。下面是DES加解密的基本原理和相关公式:
1. 原理
DES使用一种称为分组密码的方法,将输入数据分为64位的数据块,并通过一系列的代换、置换和轮函数来进行加密和解密。DES采用了Feistel网络结构,通过重复执行16轮的迭代过程来实现数据的加密和解密。
2. 密钥扩展
DES使用56位的密钥,但实际上只有48位被用于加密的轮函数。在加密过程开始之前,密钥需要经过一系列的置换和压缩算法来生成轮密钥。
3. 初始置换(IP)和逆初始置换(IP-1)
在每轮加密和解密之前,输入数据和输出数据都会经过一个初始置换(IP)和逆初始置换(IP-1)。初始置换和逆初始置换操作分别改变输入和输出数据块的顺序和位分布。
4. 轮函数
DES中的核心操作是轮函数,它将半个数据块与轮密钥进行异或操作,然后通过代换和置换操作来混淆数据。这个轮函数将数据的一半与48位轮密钥进行异或,然后通过S盒代换和P盒置换操作来映射到输出。
5. S盒代换
DES中使用8个S盒(Substitution Box),每个S盒将6位输入映射为4位输出。S盒代换增加了加密的混淆性,增强了安全性。
6. P盒置换
在S盒代换之后,轮函数通过P盒置换进一步混淆数据的位分布。P盒操作重排了32位的数据块。
7. 轮密钥
每轮加密和解密使用不同的48位轮密钥,这些轮密钥由主密钥生成。生成过程包括密钥压缩和置换操作。
8. 加密过程
加密过程是迭代的,重复执行16轮的轮函数操作,最后将左右两部分数据块进行互换,然后进行逆初始置换。
9. 解密过程
解密过程与加密过程类似,但是轮密钥的使用顺序与加密过程相反,即从最后一轮开始。
3.部分源码
% 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