本项目利用C++/Qt,根据S-AES算法编写和调试程序,提供GUI解密支持用户交互。输入可以是16bit的数据和16bit的密钥,输出是16bit的密文。加密算法使用4个不同的函数或变换:密钥加(Ax)、半字节代替(NS)、行移位(SR)和列混淆(MC),具体流程如下图。
项目代码结构按如下组织:
S-AES/
├── src/
│ ├── attack.cpp
│ ├── cbcmodel.cpp
│ └── mainwindow.cpp
├── include/
│ ├── attack.h
│ ├── cbcmodel.h
│ └── mainwindow.h
└── README.md
- 简单加密:使用S-AES算法对16位明文进行单块加密。
- 简单解密:使用相同的S-AES算法对加密后的密文进行解密,验证正确性。
- 明文输入框:输入16位二进制形式的明文。
- 密钥输入框:输入16位二进制密钥。
- 密文显示框:显示加密后的密文。
- 加密按钮:触发加密操作。
- 解密按钮:执行解密操作。
- 解密后的明文显示框:显示解密后的明文。
- 算法一致性测试:确保不同组编写的S-AES算法实现可以互操作。
- 跨组加解密:测试A组加密的密文能否被B组正确解密,反之亦然。
- 明文输入框:输入16位二进制形式的明文。
- 密钥输入框:输入16位二进制密钥。
- 密文显示框:显示加密后的密文。
- 加密按钮:触发加密操作。
- 解密按钮:执行解密操作。
- 解密后的明文显示框:显示解密后的明文。
两组用户(A组和B组)各自输入相同的明文和密钥,系统会:
- 各自对输入的明文进行S-AES加密。
- 显示各自加密后的密文。
-
与其他组进行交叉测试,以证明满足算法标准,选择密文为0110111101101011,密钥为1010011100111011,得到密文结果0000011100111000,两组同学编写的程序对明文P进行加密得到相同的密文C。
-
其他组:
- 本组:
- ASCII编码支持:加密算法的数据输入可以是ASCII编码字符串(分组为2 Bytes),对应地输出也可以是ACII字符串。
- 用户友好性:解决明文和密文适应实际应用中的格式问题。
- 明文输入框:输入ASCII编码的明文。
- 密钥输入框:输入16位二进制密钥。
- 密文显示框:显示加密后的密文。
- 加密按钮:触发加密操作。
- 解密按钮:执行解密操作。
- 解密后的明文显示框:显示解密后的明文。
用户输入ASCII编码的明文和密钥后,系统会:
- 将输入的ASCII编码明文转换为二进制形式。
- 使用S-AES算法逐块加密明文。
- 显示加密后的密文(可能是乱码)。
-
中间相遇攻击:利用已知的明文和密文对,尝试破解双重加密密钥。
- 输入明文和对应的密文对,以及使用的加密算法(如双重加密的 S-AES),并设置所需的密钥组合(如𝐾1K1和𝐾2K2的长度)。
- 系统将尝试使用中间相遇攻击方法推测密钥,通过两个加密阶段的结果匹配来找到可能的密钥组合。
本关展示如何使用基于 S-AES 算法的 密码分组链接 (CBC) 模式对较长的明文消息进行加密与解密,并探索密文篡改对解密结果的影响。程序随机生成一个 16 位的二进制初始向量 (IV),在 CBC 模式下将超过 16 位的密文进行分组加密,同时演示如何在解密时正确处理密文篡改。
- CBC 模式加密:基于 S-AES 算法,分块加密长明文,适应超出单块的明文输入。
- 初始向量 (IV) 生成:随机生成 16 位二进制的 IV 并显示,确保加解密双方共享。
- 篡改密文实验:用户可以模拟篡改密文分组,观察篡改前后解密结果的不同,分析 CBC 模式的错误传播特性。
- 明文输入框:用户输入二进制形式的明文,适应超过 16 位的长输入。
- 密钥输入框:输入 16 位的二进制密钥。
- IV 显示框:随机生成 16 位的 IV,便于加解密双方共享。
- 密文显示框:显示加密后的分组密文。
- 加密按钮:触发 CBC 加密流程。
- 解密按钮:执行 CBC 解密流程。
- 篡改密文按钮:模拟密文篡改,测试解密结果的差异。
- 解密后的明文显示框:显示解密后的原始明文或篡改后的结果。
用户输入明文、密钥后,系统会:
- 随机生成并显示 16 位 IV。
- 按 CBC 模式逐块加密明文,将加密结果作为密文显示。
在解密页面中,用户可以输入密文、密钥和 IV。
- 系统按 CBC 模式逐块解密密文。
- 显示还原的明文结果。
用户可以通过点击按钮篡改密文分组,并查看解密后的变化。
- 正常解密:使用正确的密钥和 IV,可以恢复出原始明文。
- 篡改后的解密:修改密文后,解密结果产生明显错误,体现 CBC 模式的错误传播特性。