AES/DES加解密的matlab源码

目录

1.AES加解密

1. 原理

2. 密钥扩展

3. 代换步骤(SubBytes)

4. 行位移步骤(ShiftRows)

5. 列混淆步骤(MixColumns)

6. 轮密钥加步骤(AddRoundKey)

7. 加密过程

8. 解密过程

2.DES加解密

1. 原理

2. 密钥扩展

3. 初始置换(IP)和逆初始置换(IP-1)

4. 轮函数

5. S盒代换

6. P盒置换

7. 轮密钥

8. 加密过程

9. 解密过程

3.部分源码


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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用Hutool实现AESDES加密解密非常简单,只需要引入Hutool库,然后调用它提供的API即可。 以下是使用Hutool实现AES加密解密的示例代码: ```java import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; public class AesUtil { private static final byte[] AES_KEY = "1234567890123456".getBytes(); public static String encrypt(String content) { AES aes = SecureUtil.aes(AES_KEY); byte[] encrypt = aes.encrypt(content); return Base64.encode(encrypt); } public static String decrypt(String content) { AES aes = SecureUtil.aes(AES_KEY); byte[] decrypt = aes.decrypt(Base64.decode(content)); return new String(decrypt); } } ``` 在上面的代码中,我们首先定义了一个AES_KEY作为AES加密密钥,然后通过SecureUtil.aes(AES_KEY)创建了一个AES对象。接着,我们分别定义了encrypt和decrypt方法,分别用于加密和解密。 在加密方法中,我们首先调用aes.encrypt(content)对内容进行加密,然后使用Base64进行编码,最终返回加密后的字符串。 在解密方法中,我们首先调用Base64.decode(content)将加密后的字符串进行解码,然后调用aes.decrypt对解码后的内容进行解密,最终返回解密后的字符串。 以下是使用Hutool实现DES加密解密的示例代码: ```java import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.DES; public class DesUtil { private static final byte[] DES_KEY = "12345678".getBytes(); public static String encrypt(String content) { DES des = SecureUtil.des(DES_KEY); byte[] encrypt = des.encrypt(content); return Base64.encode(encrypt); } public static String decrypt(String content) { DES des = SecureUtil.des(DES_KEY); byte[] decrypt = des.decrypt(Base64.decode(content)); return new String(decrypt); } } ``` 在上面的代码中,我们同样定义了一个DES_KEY作为DES加密密钥,然后通过SecureUtil.des(DES_KEY)创建了一个DES对象。接着,我们分别定义了encrypt和decrypt方法,分别用于加密和解密。 在加密方法中,我们首先调用des.encrypt(content)对内容进行加密,然后使用Base64进行编码,最终返回加密后的字符串。 在解密方法中,我们首先调用Base64.decode(content)将加密后的字符串进行解码,然后调用des.decrypt对解码后的内容进行解密,最终返回解密后的字符串。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值