CBC及CTR加解密过程

Exp3 Theory: AES的两种工作模式(CBC & CTR)

💡 参考实验:实验二 对称加密
参考博客:
AES加密的工作模式ECB、CBC、CFB、OFB及案例_aes ofb_带问号的小朋友的博客-CSDN博客
实验三 编程实现CBC和CTR模式下的AES Python实现_python aes ctr_chuxuezheerer的博客-CSDN博客
实验三 CBC 和 CTR 模式下的 AES - PeteLau - 博客园
PKCS7/PKCS5填充算法:
PKCS7 / PKCS5 填充算法

实验目的及要求

目的:理解 AES 算法的不同工作模式。

要求:实现两个基于 AES 的加密/解密系统,一个在 CBC 模式下使用 AES,另一个在 CTR 模式下使用 AES。 在这两种情况下,16 字节的初始向量 IV 都是随机选择的,并已放在密文中。对于CBC 加密,请使用课程中讨论的 PKCS5 填充方案。

以下提供了解密过程正确性的测试用例。测试用例包含了 AES 密钥和一个密文(两者都是十六进制编码的),需要恢复出明文并在实验报告中展示结果。

• Case 1:
CBC key: 140b41b22a29beb4061bda66b6747e14
CBC Ciphertext 1:
4ca00ff4c898d61e1edbf1800618Afb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81
• Case 2:
CBC key: 140b41b22a29beb4061bda66b6747e14
CBC Ciphertext 2:
5b68629feb8606f9a6667670b75b38a5b4832d0f26e1ab7da33249de7d4afc48e713ac646ace36e872ad5fb8a512428a6e21364b0c374df45503473c5242a253
• Case 3:
CTR key: 36f18357be4dbd77f050515c73fcf9f2
CTR Ciphertext 1:
69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc388d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329
• Case 4:
CTR key: 36f18357be4dbd77f050515c73fcf9f2
CTR Ciphertext 2:
770b80259ec33beb2561358a9f2dc617e46218c0a53cbeca695ae45faa8952aa0e311bde9d4e01726d3184c34451

对于 AES 的实现,允许使用现有的加密库,例如 PyCrypto (Python)、Crypto++ (C++) 或任何其他库。可以使用内置的 AES 函数,需要自己实现 CBC 和 CTR 模式作为学习体验。

实验原理

(1)CBC(Cipher Block Chaining)模式/密文分组连接模式

加密过程:
在这里插入图片描述

(1)对最后一块明文使用PKCS5填充方案进行填充。

💡 PKSC7:使用需填充长度的数值 paddingSize所表示的ASCIIpaddingChar = chr(paddingSize)对数据进行冗余填充。比如 AES-128的数据块长度是 16bytes,使用PKCS7进行填充时,填充的长度范围是 1 ~ 16。注意,当待加密数据长度为 16的整数倍时,要填充 16 字节,因为 “PKCS7” 拆包时会按协议取最后一个字节所表征的数值长度作为数据填充长度。
PKCS5:作为pkcs7的子集算法,概念上没有什么区别,只是在blockSize上固定为 8 bytes,即数据始终会被切割成 8 个字节的数据块,然后计算需要填充的长度。即对于原数据长度为xbytes, 填充后的长度是 x + (8 - (x % 8))bytes, 填充的数据是 8 - (x % 8)。pkcs7的填充长度blockSize1~255bytes。

(2)随机选取初始向量IV。

(3)将明文分组和前一个密文分组进行异或操作(第一个明文分组和初始向量IV进行异或),然后进行加密。加密过程只能串行。

C 1 = E ( K , [ P 1 ⊕ I V ] ) C i = E ( K , [ P i ⊕ C i − 1 ] ) C_1=E(K,[P_1 \oplus IV]) \\ C_i=E(K,[P_i \oplus C_{i-1}]) C1=E(K,[P1IV])Ci=E(K,[PiCi1])

解密过程:
在这里插入图片描述

(1)根据密文前16个字节获取初始向量IV。

(2)去掉密文后面的填充部分。

(3)密文分组解密后和前一个密文分组异或即可得到该密文分组对应的明文分组。解密过程可以并行。

P 1 = D ( K , C 1 ) ⊕ I V P i = D ( K , C i ) ⊕ C i − 1 P_1=D(K,C_1)\oplus IV \\ P_i=D(K,C_i)\oplus C_{i-1} P1=D(K,C1)IVPi=D(K,Ci)Ci1

[ P 1 , P 2 , . . . , P n ] = [ D ( K , C 1 ) , D ( K , C 2 ) , . . . , D ( K , C n ) ] ⊕ [ I V , C 1 , . . . , C n ] [P_1,P_2,...,P_n]=[D(K,C_1),D(K,C_2),...,D(K,C_n)]\oplus [IV,C_1,...,C_n] [P1,P2,...,Pn]=[D(K,C1),D(K,C2),...,D(K,Cn)][IV,C1,...,Cn]

  • 代码实现基本思路:

    用Python的Cipher提供的AES构造一个密码算法,其中模式为ECB,它和CBC的加解密函数相同,不使用CBC可以不用传递IV,而是分步骤实现。用Crypto.Random中的get_random_bytes()函数构造指定大小的任意字节串初始化向量IV。将密钥和IV传入CBC算法对象中。

    • 加密过程:

      ①将明文字符串转换为字节字符串,使用PKCS5方法进行填充——填充字节长度和内容为分组大小-明文长度%分组大小。

      ②密文前16字节为IV。

      ③密文IV后的每个分组的内容为以当前分组明文异或前一组密文后作为CBC算法对象的encrypt()方法输入的结果。

    • 解密过程:

      ①将密文IV后的所有内容用CBC算法对象的decrypt()方法解密。

      ②明文为解密结果异或密文除最后一个分组外的结果。

      ③实际明文需要去除填充值:从第②步获取到的明文的最后一个字节内容读取填充内容和填充字节数,并且返回实际明文为截断等长内容后的值。

(2)CTR(CounTeR)模式/计数器模式

CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。自增的算子IV用密钥加密后再与明文进行异或得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密。其中加密过程可看作伪随机函数的结果,输入为密钥k和自增的IV。

加密过程:

在这里插入图片描述

(1)随机选取初始向量IV,每组IV依次递增。

(2)将密钥k和IV输入伪随机函数F中,求F(k,IV),然后和每个明文分组异或得到每组密文结果。

C i = P i ⊕ F ( k , I V + i ) C_i=P_i \oplus F(k,IV+i) Ci=PiF(k,IV+i)

解密过程:

在这里插入图片描述

(1)根据密文前16个字节获取初始向量IV。

(2)将密钥k和IV输入伪随机函数F中,求F(k,IV),然后和每个密文分组异或得到每组明文结果。

P i = C i ⊕ F ( k , I V + i ) P_i=C_i \oplus F(k,IV+i) Pi=CiF(k,IV+i)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值