信息安全4——AES加密算法

①算法简介

AES(Advanced Encryption Standard)算法即高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。在微信小程序的数据传输过程中用到的加密算法。AES算法是用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。根据密钥长度的不同,可以将AES分为AES128,AES192,AES256三种。这里我们主要对AES128进行具体讲解

②状态矩阵

在AES算法中,以字节为处理单位,128长度的分组可以分为16个字节(每个字节8位),将这16个字节从左到右从上到下依次排列构成一个4*4的矩阵,这个矩阵称为状态矩阵,如图2.1(a)是以明文abcdefghijklmnop为例构成的一个明文矩阵,(b)是与之对应的用十六进制数表示的状态矩阵。输入的明文分组可以构成一个明文初始状态矩阵。同样的密钥也构成一个状态矩阵,并通过密钥扩展函数将其扩展为44个字节组成的序列由W0-W44表示,其中W0-W3是初始密钥,后面的40个字节分为10组分别用于轮函数中的轮密钥加。

(a) 

 (b)

图 2.1

③算法流程

AES算法原理流程图如图3.1所示,明文首先和原始密钥进行依次异或运算,然后经过轮函数加密之后形成密文,其中前九次的轮函数所做的操作都是一样的(字节代换、行移位、列混合、轮密钥加),而第十次的轮函数和前九次不同(字节代换、行移位、轮密钥加)

图 3.1

③ 流程详解

(1)字节代换

简单的来说就是一个查表的过程,在加密时将状态矩阵中的一个输出字节的高四位作为行号,低四位作为列号,用S盒中对应行列位置的元素进行替换,如图3.2所示是一个S盒,图3.3所示是对上文中明文的状态矩阵进行字节代换之后得到的结果

 图 3.2

 图 3.3

(2)行移位

行移位就是将状态矩阵的第i行循环左移i位,如图3.4所示就是将经字节替换后的状态矩阵进行行移位之后的结果,第0行左移0位,第一行左移1位,第二行左移2位,第三行左移3位

 图 3.4

(3)列混合

将状态矩阵进行左乘一个给定矩阵的操作,如图3.5所示,是将行移位之后的矩阵进行列混合运算之后的结果,在列混合中的乘法和普通的乘法不相同,其规则如图3.6所示

 图 3.5

 图 3.6

(4)轮密钥加

轮密钥加是将状态矩阵中的数据以列为单位与每一轮的密钥进行异或运算,例如在第一轮中的轮密钥加密钥为W4,W5,W6,W7,明文的状态矩阵的第一列与W4进行异或运算,如图3.7所示是以上文中的明文进行轮密钥加后的结果

 

 图 3.7

④密钥扩展函数

假设在算法开始时给定的密钥为abcdefghijklmnop,对其进行扩展就是进行如图4.1所示的步骤,最终会形成10组子密钥

图 4.1

轮常量表如图4.2所示 

 图 4.2

以上就是AES算法的加密过程

参考资料:

B站上AES算法的一个比较详细的讲解视频,大家可以参考

相关文章链接

  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AES(Advanced Encryption Standard)是一种对称加密算法,它的密钥长度可以为 128、192 或 256 位,是目前应用最广泛的加密算法之一。AES算法的加密和解密过程都是通过将明文和密钥进行一系列的替代、置换、混淆等操作来完成的。下面简单介绍一下AES算法的加密和解密过程。 加密过程: 1. 密钥扩展:根据密钥长度进行密钥扩展,得到一组轮密钥。 2. 初始轮:将明文与第 0 轮轮密钥进行异或运算。 3. 多轮加密:AES算法中有 10 轮加密(128位密钥)、12 轮加密(192位密钥)或 14 轮加密(256位密钥),每轮都包括字节替代、行移位、列混淆和轮密钥加四个操作。其中字节替代、行移位和列混淆是线性操作,轮密钥加是非线性操作。 4. 最终轮:在最后一轮加密中,省略列混淆操作。 5. 输出密文:得到加密后的密文。 解密过程: 1. 密钥扩展:根据密钥长度进行密钥扩展,得到一组轮密钥。 2. 初始轮:将密文与第 0 轮轮密钥进行异或运算。 3. 多轮解密:与加密过程相反,AES算法中有 10 轮解密(128位密钥)、12 轮解密(192位密钥)或 14 轮解密(256位密钥),每轮都包括列混淆的逆操作、行移位的逆操作、字节替代的逆操作和轮密钥加四个操作。 4. 最终轮:在最后一轮解密中,省略列混淆的逆操作。 5. 输出明文:得到解密后的明文。 Java代码实现: ``` import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class AES { public static void main(String[] args) throws Exception { String plaintext = "Hello, world!"; // 明文 String key = "1234567812345678"; // 密钥(长度必须为 16、24 或 32 个字符) byte[] data = plaintext.getBytes("UTF-8"); byte[] keyData = key.getBytes("UTF-8"); SecretKeySpec keySpec = new SecretKeySpec(keyData, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedData = cipher.doFinal(data); System.out.println("密文:" + new String(encryptedData, "UTF-8")); cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decryptedData = cipher.doFinal(encryptedData); System.out.println("明文:" + new String(decryptedData, "UTF-8")); } } ``` 输出结果为: ``` 密文:���2*�a�빥�/�,� 明文:Hello, world! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值