目录
2.2.1 并置
2.2.2 半字节(Nibble) 4
2.2.3 向量置换(Permutation of Vectors)
3.3 CBC 模式分析 6
3.3.1 CBC 模式的设计背景 6
3.3.2 CBC 模式的来历 6
3.3.3 CBC 模式的迭代构成 6
3.3.4 CBC 模式的安全性讨论 7
4.1 uBlock 算法的总体框架
4.1.1 uBlock 加密算法 7
4.1.2 uBlock 解密算法 9
4.1.3 uBlock 密钥扩展算法 10
4.2 uBlock 算法的数据结构 11
4.2.1 S 盒 (Substitution boxes)
4.2.2 向量置换 (Vector Permutations)
5. uBlock 的算法实现
5.1 基础代码设计 12
5.2 评估正确性 16
5.3 评估吞吐量和速度 17
6 以 uBlock 的 ECB 和 CBC 模式加密朱鹮.bmp 文件
6.1 BMP 文件格式解析 18
6.2 BMP 文件加密技巧 18
6.3 ECE 和 CBC 模式加解密结果 19
6.3.1 ECB 模式进行加解密 19
6.3.2 CBC 模式进行加解密 19
6.3.3 ECB 和 CBC 模式的分析和对比 20
# Code
# uBlock_bmp (加密代码)——CBC 加密.cpp
1 |
|
# uBlock_bmp (加密代码)——ECB 加密 .cpp
1 |
|
# uBlock_bmp (加密代码)——ECB 加密.cpp
1 |
|
# uBlock_Windows_128_128 _测试时间.cpp
1 |
|
# 关于 uBlock 加密算法的调研分析
目录
2.2.1 并置
2.2.2 半字节(Nibble) 4
2.2.3 向量置换(Permutation of Vectors)
3.3 CBC 模式分析 6
3.3.1 CBC 模式的设计背景 6
3.3.2 CBC 模式的来历 6
3.3.3 CBC 模式的迭代构成 6
3.3.4 CBC 模式的安全性讨论 7
4.1 uBlock 算法的总体框架
4.1.1 uBlock 加密算法 7
4.1.2 uBlock 解密算法 9
4.1.3 uBlock 密钥扩展算法 10
4.2 uBlock 算法的数据结构 11
4.2.1 S 盒 (Substitution boxes)
4.2.2 向量置换 (Vector Permutations)
5. uBlock 的算法实现
5.1 基础代码设计 12
5.2 评估正确性 16
5.3 评估吞吐量和速度 17
6 以 uBlock 的 ECB 和 CBC 模式加密朱鹮.bmp 文件
6.1 BMP 文件格式解析 18
6.2 BMP 文件加密技巧 18
6.3 ECE 和 CBC 模式加解密结果 19
6.3.1 ECB 模式进行加解密 19
6.3.2 CBC 模式进行加解密 19
6.3.3 ECB 和 CBC 模式的分析和对比 20
# 关于 uBlock 加密算法的调研分析
**** 摘要:**** 本文深入研究了 uBlock 和 ECB 两种分组密码算法,介绍了这两种算法的起源、设计原理、实现方法以及应用场景。通过对 uBlock 算法的详细剖析,解释了其设计的技术标准、密钥扩展机制以及加解密流程。此外,还探讨了 ECB 模式的设计背景与安全性讨论,指出了其在特定应用中的局限性。文章还包括了使用 C++ 实现的算法编程实例,验证了算法的正确性,并通过加密图像文件的实验,评估了两种算法在不同工作模式下的性能和安全性。通过实际应用案例,本文展示了分组密码在信息安全领域的重要性和实用价值。
**** 关键词:**** 分组密码,uBlock,ECB 模式,密钥扩展,算法安全性,图像加密
# 1 引言
随着信息技术的迅速发展,数据安全和隐私保护成为了网络空间安全的重要组成部分。分组密码作为保护电子数据的基本手段,承担着加密重要信息、防止数据泄露的关键角色。本文选择了两种具有代表性的分组密码算法:uBlock 和 ECB 模式,对它们的设计理念、实现过程以及安全性能进行了全面的分析和评估。
uBlock 算法源于全国密码算法设计竞赛,它使用复杂的密钥扩展和多轮加密机制来提高安全性。这种算法设计考虑到了抵抗差分攻击和线性攻击的需求,适合于需要高安全标准的应用场景。而 ECB 模式,作为一种基础的加密模式,因其实现的简单性,在某些低安全需求的场合中仍被广泛使用,尽管它在处理大量具有重复模式的数据时存在安全隐患。
在此基础上,本文还实现了这两种算法的编程模拟,并通过加密和解密图像文件的方法,直观地展示了它们在实际应用中的效果和性能,旨在为读者提供对分组密码在现实世界中应用的深入理解。通过对比分析和实验验证,本文不仅增强了对这两种算法性能和安全性的认识,也为未来选择和设计更加安全高效的加密方案提供了宝贵的经验和见解。
2. 符号
2.1 uBlock 所用符号
表 1 uBlock 符号表
X | n 比特明文 |
---|---|
Y | n 比特密文 |
K | k 比特密钥 |
PK****i | n 比特轮密钥 |
PLn,PRn,PL****-1****,PRn-1 |  |
s | 4 比特 S 盒 |
Sn,Sn-1 |  |
S****k |  |
PK****1 | 16 个半字节的向量置换 |
PK2,PK****3 | 32 个半字节的向量置换 |
⊕ | 模 2 加运算 |
<<<b | 循环左移 b 比特 |
<<<b 32 | 分款 32 比特循环左移 b 比特 |
|| | 表示比特串的连接 |
# 2.2 uBlock 术语解释
# 2.2.1 并置
在密码学和算法设计中,"并置"(Concatenation)通常指的是将多个数据元素或操作按顺序排列在一起,形成一个连续的整体。在 uBlock 算法的上下文中,这个术语特别指向几个方面:
S 盒并置:在 uBlock 算法中,一个 S 盒操作通常处理 4 比特的输入,输出也是 4 比特。当我们谈到 "S 盒并置" 时,这意味着将多个 S 盒操作排列在一起,以并行处理更多的数据位。
例如,如果有一个 128 比特的数据块,而每个 S 盒处理 4 比特,那么需要 32 个这样的 S 盒并置在一起,以便同时处理所有 128 比特。这 32 个 S 盒可以是相同的(即使用相同的替换规则),或者各不相同,具体取决于算法设计。
数据并置:数据并置是指将多个较小的数据块(如多个 4 比特的输出)结合成一个较大的数据块。在 uBlock 中,经过 S 盒处理的数据通常需要进行进一步的变换,如置换或与轮密钥进行 XOR 操作,这时候并置的数据可以直接用于这些操作。
2.2.2 半字节(Nibble)
半字节通常指的是 4 比特的数据块。在一个字节(通常为 8 比特)中包含两个半字节。在许多加密算法中,尤其是在对数据执行 S 盒变换时,常常以半字节为单位来处理数据。使用半字节是因为它允许在较小的数据单位上进行高效的非线性变换,这在很多加密标准(如 AES 的前身 DES)中是一种常见的做法。
# 2.2.3 向量置换(Permutation of Vectors)
向量置换涉及对一个数据向量(可以理解为一系列数据元素的数组)进行重新排序或置换。在密码学中,这种操作用于打乱数据元素的顺序,增加密码算法的扩散性质。扩散是指输入的一个小变化(比如改变一个比特)会影响输出中多个或大部分比特的属性,从而提高了算法的安全性。
向量置换的具体实例包括 PL 和 PR 操作:这些是特定的置换操作,它们以某种特定的顺序重新排列输入向量的元素。这些置换规则通常事先定义好,并用于算法的各个阶段来增加复杂性和安全性。
# 2.2.4 轮密钥(Round Key)
在循环结构的密码算法中(如 AES 或 uBlock),轮密钥是密钥扩展过程生成的一系列密钥,每一轮加密使用一种不同的轮密钥。使用不同的轮密钥是为了防止某些攻击技术,比如差分攻击和线性攻击,它们可能在多轮中利用相同密钥的重复使用来推导出密钥信息。
# 3.uBlock 分组密码及两种工作模式的来历
# 3.1 uBlock 算法来历
中国全国密码算法设计竞赛是一个旨在推动密码学领域技术进步的活动。为贯彻落实习近平网络强国战略思想和党的十九大精神,繁荣我国密码理论和应用研究,推动密码算法设计和实现技术进步,促进密码人才成长,学会决定举办全国密码算法设计竞赛。在 2019 年 10 月 25 日,中国密码学会发出了全国密码算法设计竞赛通知。在这个竞赛中,密码学家们提交自己设计的密码算法,经过评审和测试,优秀的算法将进入下一轮评选。
该分组密码算法的设计和提交必须符合一系列详尽的技术标准,以确保算法的安全性、高效性及实用性。首先,算法需提供完整的描述,包括所有必要的数学公式、图表和参数,并附上充分的测试实例来验证算法的正确性。设计原理部分应详细阐述算法的构思、主要策略及关键设计决策。安全性分析要详细评估算法对抗各种已知攻击的能力,包括理论上的安全证明及特殊密钥条件的分析。性能分析需考虑算法在不同的软硬件环境下的运行效率和资源消耗。此外,还必须清楚地声明算法的优点和可能的不足,包括创新性和在各种平台上的表现。算法还需要提供标准的 ANSI C 编程接口,确保其实现的标准化和可移植性。最后,参赛者必须提交一套完整的材料,包括算法描述、代码实现、支持文档及原创性声明,所有提交材料需用中文撰写,以满足比赛的形式规范。这些严格的要求确保了提交的分组密码算法既安全可靠,又具备实际应用的可行性和效率。
而 uBlock 分组密码算法是本次密码算法设计竞赛的获奖作品,由来自中国科学院软件研究所的吴文玲、张 蕾、郑雅菲、李灵琛共同设计而来。
# 3.2 ECB 分组密码模式来历
ECB(电子密码本模式,Electronic Codebook Mode)是一种基础的加密算法模式,其设计背景和迭代过程可以追溯到早期的计算机安全需求。
# 3.2.1 ECB 的设计背景
在早期计算机网络和系统中,数据安全开始受到关注,特别是在商业和政府通信中。随着信息技术的发展,保护数据免受未经授权的访问变得尤为重要。在此背景下,ECB 模式作为一种基本的加密模式应运而生,其主要目的是提供一种简单直接的方法来加密固定大小的数据块。
# 3.2.2 ECB 的来历
ECB 模式的核心概念非常简单:将明文分割成多个等长的块,每个块独立加密。这种模式的一个关键特点是它不涉及复杂的初始化向量(IV)或状态维护,这使得实现起来相对简单直接。ECB 模式可以使用任何固定长度的块密码来加密数据,如 DES(数据加密标准)或后来的 AES(高级加密标准)。
# 3.2.3 ECB 的迭代过程
ECB 模式的设计没有经历复杂的迭代过程,因为它本质上是最简单的块密码加密模式。然而,随着对加密技术的理解加深,安全社区逐渐认识到 ECB 模式在安全性方面的局限性,尤其是其在处理大量数据时容易泄露模式信息的问题。因此,出现了更为复杂的加密模式,如 CBC(密码块链接模式)、CFB(密码反馈模式)和 OFB(输出反馈模式),这些模式通过引入 IV 和更复杂的运算过程来增强安全性,从而克服了 ECB 的一些安全缺陷。
# 3.2.4 ECB 的安全性讨论
尽管 ECB 因其实现简单而在某些应用中仍然被使用,但它通常不推荐用于需要高安全性的场景。因为 ECB 模式对于相同的明文块总是生成相同的密文块,这使得它对于某些类型的数据(尤其是那些包含重复模式的数据)来说,可能会暴露出明显的模式,从而容易被攻击者利用。
3.3 CBC 模式分析
CBC(Cipher Block Chaining)模式是一种广泛使用的块加密操作模式,它通过链式反馈机制增加了加密过程的复杂性和安全性。以下是 CBC 模式的详细介绍,包括设计背景、来历、迭代过程和安全性讨论。
# 3.3.1 CBC 模式的设计背景
CBC 模式在 1970 年代被 IBM 开发,目的是为了克服电子密码本(ECB)模式的一些显著安全缺陷。在 ECB 模式中,相同的明文块加密后会产生相同的密文块,这使得模式信息可能被泄露。这种特性特别不适用于加密大量数据或具有重复数据块的文件。因此,需要一种更安全的模式来提供更好的数据保密性,尤其是在数据块之间存在高度关联时。
# 3.3.2 CBC 模式的来历
CBC 模式的设计利用了前一个块的密文来影响当前块的加密过程。这种设计首次在 IBM 的 Lucifer 加密算法中被提出并应用,后来这一概念被采纳并广泛应用于多种加密标准中,包括现代加密算法如 AES 和 DES。
# 3.3.3 CBC 模式的迭代构成
CBC 模式的加密过程包括以下几个步骤:
初始化向量(IV):加密的第一个数据块需要一个初始化向量,这个向量通常是随机生成的,与明文一起发送,但不需要保密。
链式反馈:每个明文块在加密之前,首先与前一个密文块进行 XOR 运算。对于第一个明文块,它与 IV 进行 XOR。
块加密:XOR 运算后的结果使用加密算法和密钥进行加密。
生成密文块:加密的输出形成当前的密文块,然后这个密文块被用于下一个块的加密过程。
解密过程则是加密过程的逆操作:
块解密:使用相同的密钥对密文块进行解密。
XOR 运算:将解密后的输出与前一个密文块进行 XOR 运算,以恢复原始明文。对于第一个块,使用 IV 进行 XOR 运算。
恢复明文块:输出最终的明文块。
# 3.3.4 CBC 模式的安全性讨论
CBC 模式提供了比 ECB 更高的安全性,主要是因为它通过引入链式依赖机制抵消了明文中的模式。即便明文块完全相同,由于每个块与前一个块的密文相关联,因此相同的明文块不会生成相同的密文块。这种属性使得 CBC 模式对于模式分析和重放攻击具有很强的抵抗力。
然而,CBC 模式并非完美无缺。例如,它容易受到填充攻击(如 Padding Oracle 攻击),因为加密过程依赖于块的完整性和正确的填充。此外,CBC 模式不提供身份验证,所以它可能受到篡改攻击,除非与消息认证码(MAC)或其他认证机制一起使用。
总的来说,CBC 模式是一个在多个领域得到广泛应用的块加密模式,它提供了比 ECB 模式更高的安全保障,但需要正确实施和可能的安全增强来保护数据安全。
# 4. uBlock 加密算法的总体框架与数据结构
# 4.1 uBlock 算法的总体框架
uBlock 一共包含 3 个版本,分组长度为 128 或 256 比特,密钥长度为 128 或者 256 比特,记为 uBlock-128/128 (明密文块 / 密钥)、uBlock-128/256、uBlock-256/256。三者的加解密基本一致,区别在于三个版本的迭代轮数 r 分别为 16,24,24。并且在轮密钥生成的时候,所用的向量置换分别为 16 字节的 PK****1、32 字节的 PK****2、32 字节的 PK****3。
4.1.1 uBlock 加密算法
下图是 uBlock 的加密伪代码与流程图示:

图 1(左)uBlock 的加密伪代码
图 2(右)uBlock 加密轮变换流程图
其中,我们可以由图示描述该加密算法即先把 n 比特明文 X 拆分成两个 n/2 比特的 X0 和 X1。根据明文 - 比特的关系选择合适的 r,并且在 0~r-1 范围内做 r 次加密其中每次加密:
\1. 先将 n 比特轮密钥 RKi 拆分成两个并置的密钥 RK0i 和 RK1i
\2. 调用一个 n/8 个 S 盒的并置 Sn。首先将 X0 异或 RK0i 后在 Sn 里查表得到新的 X0,然后将 X1 异或 RK1i 后在 Sn 里查表得到新的 X1
\3. X0 和 X1 异或后得到新的 X1。
\4. 将 32 位分块 X1 循环左移 4 比特后与 X0 异或得到新的 X0
\5. 将 32 位分块 X0 循环左移 8 比特后与 X1 异或得到新的 X1
\6. 将 32 位分块 X1 循环左移 8 比特后与 X0 异或得到新的 X0
\7. 将 32 位分块 X0 循环左移 20 比特后与 X1 异或得到新的 X1
\8. 将最终得到的 X0 和 X1 异或得到 X0
\9. 将 X0 在 n/16 向量置换 PLn (X0) 中进行置换
\10. 将 X1 在 n/16 向量置换 PRn (X1) 中进行置换
最终的密文 Y 即为第 r 轮密钥 RKr 与最终得到的 X0 和 X1 的并置进行异或。
表 2 S 盒

表 3 PLn 和 PRn

# 4.1.2 uBlock 解密算法
下图为 uBlock 的解密过程,即加密函数的逆变换,其中的 Sn-1、PLn-1、PRn-1 分别是 Sn、PLn 和 PRn 的逆,具体见表 3 和表 4.

图 3 uBlock 解密算法伪代码
表 4 s-1 盒

表 5 PLn-1 和 PRn-1

# 4.1.3 uBlock 密钥扩展算法
将 k 比特密钥 K 放置在 k 比特寄存器,取寄存器的左 n 比特作为轮密钥 RK0 ,然后,对 1, 2,..., i r = ,更新寄存器,并取寄存器的左 n 比特作为轮密钥 RKi。具体更新方式如下:

图 4(左) 密钥扩展算法伪代码
图 5(右) 密钥拓展算法流程图
其中 Sk 是 k/16 个 4 比特 s 盒的并置,Tk 是对 K1 的每半字节⊗2,有限域 GF (24) 的不可约多项式 m (x)= x4+ x + 1:RCi 为 32 比特常数,作用在 K0 的左 32 比特。PKt 有三种情况,t =1, 2,3,PK1、PK2 和 PK3 分别用于 uBlock-128/128、uBlock-128/256 和 uBlock-256/256 的密钥扩展算法。PK1 是 16 个半字节的向量置换,PK2 和 PK3 都是 32 个半字节的向量置换,具体见下表。
表 6 PKi 表

32 比特常数 RCi 生成具体是由 8 级 LFSR,初始条件为 c0=c3=c6=c7=0,c1=c2=c4=c5=1; 对于 i≥8,ci=ci-2⊕ci-3⊕ci-7⊕ci-8。令
   
则 RCi=
常数 RCi(i=1,2.......24)的 16 进制如下表:
表 7 RCi 表

# 4.2 uBlock 算法的数据结构
# 4.2.1 S 盒 (Substitution boxes)
S 盒用于执行非线性变换,是密码算法中用于提高安全性的重要组件。它通过将输入的固定大小比特块映射到输出的操作来抵抗线性和差分密码分析。
在 uBlock 中,S 盒是 4 比特的,即每个 S 盒将 4 比特的输入映射到 4 比特的输出。由于 uBlock 处理 128 比特或 256 比特的数据块,因此需要多个这样的 S 盒并置使用,以覆盖整个数据块。
# 4.2.2 向量置换 (Vector Permutations)
向量置换用于重新排列加密数据的比特,增强密码的扩散性。这种扩散确保了输入的微小变化可以影响到输出的多个比特,从而增加破解难度。
uBlock 算法使用两种主要的向量置换,分别称为 PL 和 PR。这些置换是预定义的,并根据不同的加密需求(如 128 比特或 256 比特)进行调整。
# 4.2.3 轮密钥 (Round Keys)
轮密钥用于各加密轮中与数据进行 XOR 运算,是提供加密强度的关键。不同的轮使用不同的轮密钥,以防止重复使用相同密钥带来的安全风险。
轮密钥通过密钥扩展算法从主密钥生成。在 uBlock 中,密钥扩展包括使用 S 盒、固定的置换模式(PK1, PK2, PK3)和轮常数,为每一轮生成唯一的轮密钥。
# 4.2.4 密钥扩展算法 (Key Schedule)
密钥扩展算法用于生成足够数量的轮密钥,支持加密过程中每一轮的需要。
这一算法涉及到对原始密钥的多次变换,包括应用 S 盒、向量置换和与轮常数的 XOR 运算。这些操作增加了密钥的不可预测性和算法的整体安全性。
# 4.2.5 数据块的处理
在 uBlock 算法中,明文数据块根据算法版本(128 比特或 256 比特)被处理。每次加密操作对数据块进行分割、替换、置换和合并。
数据在加密过程中经历多个阶段的处理,包括并置、分割和轮内操作,这些操作通过特定的加密逻辑紧密结合。
这些组件共同构成了 uBlock 算法的核心,通过精心设计的数据处理步骤和算法结构,uBlock 能够有效地在保护信息安全的同时,维持处理效率。这种设计不仅使其在理论上安全,而且在实际应用中也表现出高效的执行能力,适应于各种硬件和软件环境。
# 5. uBlock 的算法实现
# 5.1 基础代码设计
通过综合考虑通用性和常用性,我们在这主要介绍 uBlock128/128 版本的加密算法代码实现。首先我根据设计文档和已给代码来编写出 uBlock_Windows_128_128.cpp 文件,代码附于附件
主要函数包括:
(1)密钥调度(uBlock_128_KeySchedule 函数):此函数接收一个密钥并生成多个轮次密钥,存储在 Subkey 数组中。它利用了 SIMD 指令来并行处理多个操作,提高了密钥生成的效率。
(2)加密函数(uBlock_128_Encrypt):此函数实现了加密过程,使用预先生成的轮次密钥对输入的明文进行加密,产生密文。加密过程包括多个轮次,每个轮次都使用不同的密钥和数据转换,例如置换和替代。
(3)解密函数(uBlock_128_Decrypt):与加密函数类似,但按相反顺序应用轮次密钥和转换,以从密文恢复明文
(4)CBC 模式实现(Crypt_Enc_Block_CBC 和 Crypt_Dec_Block_CBC 函数):这些函数实现了密码块链接(CBC)模式的加密和解密。在 CBC 模式中,每个块的加密依赖于前一个块的加密输出,提高了加密过程的安全性。
(5)ECB 模式实现(Crypt_Enc_Block_ECB 和 Crypt_Dec_Block_ECB 函数):这些函数实现了密码块链接(ECB)模式的加密和解密。
首先我们给出在 vscode 上将 uBlock_Windows_128_128.cpp 编译成 exe 的代码为 “g++ "-msse4.1" -o main uBlock_Windows_128_128.cpp”。
接下来我仅附 ECB 和 CBC 加解密代码,其余代码请参考附件:
- int Crypt_Enc_Block_CBC(unsigned char *input, int in_len, unsigned char *output, int out_len, unsigned char key, int keylen)2.3. int g, j;4. unsigned char iv[16] = {0};5. uBlock_128_KeySchedule(key);6. for (g = 0; g < in_len / 16; g++)7. {8. for(j = 0; j < 16; j++)9. {10. iv[j] 12. uBlock_128_Encrypt(iv, output+g16, 16);13. memcpy(iv, output+g16, 16);14. }15. *out_len = in_len - in_len % 16;16. 17. return 0;18. }19. 20. int Crypt_Dec_Block_CBC(unsigned char *input,int in_len, unsigned char *output,int *out_len, unsigned char key, int keylen)21.22. int g, j;23. unsigned char iv[16] = {0};24. 25. uBlock_128_KeySchedule(key);26. 27. for (g = 0; g < in_len / 16; g++)28. {29. uBlock_128_Decrypt(input+g*16, output+g*16, 16);30. for(j = 0; j < 16; j++)31. {32. output[g * 16 + j] 34. memcpy(iv, input+g16, 16);35. }36. *out_len = in_len - in_len % 16;37. return 0;38. }39. int Crypt_Enc_Block_ECB(unsigned char *input, int in_len, unsigned char *output, int *out_len, unsigned char *key, int keylen)40. {41. int g;42. 43. uBlock_128_KeySchedule(key);44. 45. for (g = 0; g < in_len / 16; g++)46. {47. uBlock_128_Encrypt(input + g * 16, output + g * 16, 16); 48. }49. *out_len = in_len - in_len % 16;50. return 0;51. }52. int Crypt_Dec_Block_ECB(unsigned char *input, int in_len, unsigned char *output, int *out_len, unsigned char *key, int keylen)53. {54. int g; 55. uBlock_128_KeySchedule(key);56. for (g = 0; g < in_len / 16; g++)57. {58. uBlock_128_Decrypt(input + g * 16, output + g * 16, 16); 59. }60. *out_len = in_len - in_len % 16;61. return 0;62. }
我的算法流程图如下:

图 6 代码流程图(AI 识别代码生成)

图 7 uBlock 代码设计流程图
# 5.2 评估正确性
依据官方文档中的测试函数,以:
明文:01 23 45 67 89 ab cd effe dc ba 98 76 54 32 10
密钥:01 23 45 67 89 ab cd effe dc ba 98 76 54 32 10
加密 1 次时,输出的密文应该是 32 12 2b ed d0 23 c4 29 02 34 70 e1 15 8c 14 7d
加密 1000000 时,输出的密文应该是 9d 63 9e 31 06 2f fb 57 46 46 e4 28 f9 2e 08 d4
根据我们的代码生成结果,如下图(中间部分为其他测试结果):

图 8 uBlock 代码输出结果
如上图我们可以知道,代码的正确性良好。与官方文档符合。
根据后续输出,我们可以发现代码生成的轮密钥也与官方文档一致,代码可行度高。
# 5.3 评估吞吐量和速度
我的电脑使用的是 NVIDIA GeForce RTX 3070 Ti Laptop GPU、处理器 12th Gen Intel (R) Core (TM) i9-12900H,2500 Mhz,14 个内核,20 个逻辑处理器、BIOS 版本 / 日期 American Megatrends International, LLC. G533ZW.324, 2023/2/21。其中我的 Python 解释器是 Python3.11,编译器是 pycharm2023.7 专业版。而我的 cpp 运行软件为 vscode。
这里我以将信息反复加密 1000000 次的时间作为标准。以其运行的时间作为评价的指标。当我们明文和密文均为 01 23 45 67 89 ab cd effe dc ba 98 76 54 32 10 时,多次运算测试代码取平均值可以得到:
uBlock 128-128 的运算时间为 1.162s
uBlock 128-256 的运算时间为 1.381s
uBlock 256-256 的运算时间为 1.605s
而在 Python 上运行的传统 AES 代码的运行时间为 29.93s
其中不排除 C++ 运行效率比 Python 高效等因素。但是总体来说,uBlock 在无论是吞吐量还是运行速度方向都表现出较高的效率和运算速度。相比于传统 AES 加密算法显得更加高效的同时准确率也表现得很优异。
# 6 以 uBlock 的 ECB 和 CBC 模式加密朱鹮.bmp 文件
# 6.1 BMP 文件格式解析
BMP 文件格式,全称为 Bitmap Image File Format,是一种图像文件格式,广泛用于 Windows 操作系统中存储位图图像。这种格式简单、直观,支持多种色深,并可以无损地存储图像数据。BMP 文件主要由三部分组成:
*(1)** 文件头 *(Bitmap File Header):
包含文件类型、文件大小和数据偏移等信息。
bfType(2 字节):文件类型,必须是 'BM',用以标识文件为 BMP 格式。
bfSize(4 字节):整个文件的大小,包括文件头、信息头和位图数据。
bfReserved1 和 bfReserved2(各 2 字节):保留位,对齐用,通常为 0。
bfOffBits(4 字节):从文件开始到位图数据的偏移量。
*(2)** 信头 *(DIB Header,即 Device Independent Bitmap Header):BMP 文件的信息头有几种不同的版本,最常见的包括 BITMAPINFOHEADER 和 BITMAPV5HEADER 等。以 BITMAPINFOHEADER 为例,其结构如下:
提供图像宽度、高度、色深、压缩类型等详细信息。
biSize(4 字节):此结构体的大小。
biWidth(4 字节):图像的宽度(像素)。
biHeight(4 字节):图像的高度(像素)。如果为正,位图是倒向的;如果为负,位图是正向的。biPlanes(2 字节):目标设备的级别,必须为 1。
biBitCount(2 字节):每个像素所需的位数,常见的有 1、4、8、16、24 和 32。
biCompression(4 字节):位图的压缩类型。
biSizeImage(4 字节):位图数据的大小,即像素数据部分的大小。
biXPelsPerMeter, biYPelsPerMeter(各 4 字节):水平和垂直分辨率(每米像素数)。
biClrUsed(4 字节):位图实际使用的颜色表中的颜色索引数(0 表示使用所有的颜色)。
biClrImportant(4 字节):重要颜色数,0 表示所有颜色都是重要的。
*(3)** 位图数据 *(Bitmap Data):
实际的图像像素数据 —— 位图数据部分存储实际的图像像素值。这部分的存储格式依赖于 biBitCount 的值。数据可能需要根据行来进行填充,以确保每行的字节数是 4 的倍数(DWORD 对齐)。
# 6.2 bmp 文件加密技巧
当使用 uBlock 或任何其他块加密算法对 BMP 文件进行加密时,主要关注的是位图数据部分。文件头和信息头通常不进行加密,以便保持文件格式的完整性,使图像文件仍然能被图像查看器识别。以下是一些注意事项和技巧:
保持文件头和信息头不变:加密时应跳过这部分,直接从位图数据开始加密,这样不会破坏文件的结构 —— 在代码中体现为对 BMP 的前 54 个字节(文件头)不进行加密,以保证图片格式可以清晰显示
处理数据填充:由于加密算法通常要求数据块大小固定,而 BMP 行可能不会恰好符合这种分块,所以加密前需要对数据进行适当的填充
选择加密模式:使用 ECB 模式可能会导致图像中的模式被重复,使得加密不够安全。CBC 模式是一个更好的选择,因为它使用初始化向量(IV)来增加加密强度 —— 但是由于老师要求,这里使用 ECB 和 CBC 两种模式来进行加密。
# 6.3 ECB 和 CBC 模式加解密结果
# 6.3.1 ECB 模式进行加解密
在附件中通过 vscode 启动 uBlock_bmp (加密代码)——ECB 加密 .cpp 代码,该代码以 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}; 为密钥,循环读入朱鹮.bmp 进行加解密。加密朱鹮.bmp 产生朱鹮_ECB.bmp。读入朱鹮_ECB.bmp 解密后产生朱鹮_ECB_dec.bmp。具体的加密算法请见附件。加密结果如下图:

图 9(左)朱鹮_ECB.bmp
图 10(右)朱鹮_ECB_dec.bmp
# 6.3.2 CBC 模式进行加解密
在附件中通过 vscode 启动 uBlock_bmp (加密代码)——CBC 加密.cpp 代码,该代码以 {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}; 为密钥,循环读入朱鹮.bmp 进行加解密。加密朱鹮.bmp 产生朱鹮_CBC.bmp。读入朱鹮_CBC.bmp 解密后产生朱鹮_CBC_dec.bmp。具体的加密算法请见附件。加密结果如下图:

图 11(左)朱鹮_CBC.bmp
图 12(右)朱鹮_CBC_dec.bmp
# 6.3.3 ECB 和 CBC 模式的分析与对比
* 安全性:*
CBC 模式通常比 ECB 模式更安全,因为它避免了明文中的模式在密文中的重复 ——CBC 模式加密前,每个数据块都会与前一个密文块进行异或。第一块数据与一个初始向量(IV)进行异或。这种方法使得相同的明文块加密后的结果因其位置不同而不同,提高了安全性。同样的明文在不同的位置或在不同的文件中,即使使用相同的密钥,加密结果也会不同。
而 ECB 模式将数据分割成块,每块数据独立加密。缺点是同一块明文在同一密钥下总是被加密成同样的密文块。这意味着模式可能会暴露明文的模式,特别是当处理大量具有重复模式的数据时(例如图片或某些类型的文档)。在图像加密(如本次的 bmp)中尤其明显,因为图像中经常包含大片相同颜色的区域。
* 性能:*
ECB 模式可以并行处理,因为每个数据块独立加密,提高了加密过程的速度。而 CBC 模式不能并行处理,因为每个块的加密依赖于前一个块的密文。这可能会在处理大量数据时导致性能下降。解密可以并行化,因为解密过程中,每个块的解密只依赖于它前面的一个块的密文。
# 7 总结
在这篇论文中,我对 uBlock 和 ECB 两种加密算法进行了深入的研究与比较。通过细致的分析,我发现 uBlock 算法具有复杂的密钥扩展和多轮加密机制,这些设计显著增强了其加密强度和安全性,使其特别适用于对数据安全要求极高的场景。相比之下,ECB 模式因其简单的结构,在处理具有重复模式的大量数据时表现出安全性的不足,尤其在需要高安全性的应用中可能导致数据泄露风险。
我还特别关注了这两种算法在不同硬件和软件环境中的性能表现。研究结果显示,uBlock 在现代处理器上具有出色的运行效率和较低的资源消耗,这使得它非常适合在需要快速数据处理和高吞吐量的系统中使用。此外,我也评估了 ECB 模式的实现简便性,这一特点使其在某些不需要高安全性的内部或封闭系统中仍具有应用价值。
通过本研究,我进一步理解了在算法设计中安全性和效率的重要性以及如何在实际应用中做出适当的权衡。论文的这部分研究不仅增强了我对加密算法性能和安全性的认识,也为将来选择和设计加密方案提供了实用的指导。
最后,展望未来,我认为加密算法的发展需要持续关注安全性的提升和性能的优化。随着计算资源的发展和安全威胁的演变,持续更新和改进加密技术将是确保信息安全的关键。因此,我期待在未来的工作中,进一步探索和实验新的加密技术,以应对更为复杂和多变的安全环境。这篇论文为我在密码学领域的研究提供了坚实的基础,并激励我继续在这一领域深入探索与创新。