写在前面
上篇中,主要对TEE、SGX威胁模型和Waksman网络的背景进行了简单介绍。
这篇继续,先看 Shuffling (洗牌 or 打乱次序)算法。
先贴一下论文,方便大家学习:
https://cypherpunks.ca/~iang/pubs/wakson-ccs23.pdfhttps://cypherpunks.ca/~iang/pubs/wakson-ccs23.pdf
二、Shuffling 算法
2.1 算法的背景
首先明确一个概念:
一般的洗牌是针对程序的数据进行的,而不是对程序的指令进行的。具体来说,这里的洗牌指的是对程序运行时处理的数据进行重新排列,目的是在运行时预防侧信道攻击。
侧信道攻击通常利用程序在运行时的一些非预期泄露信息,比如内存访问模式、执行时间等,来获取关键信息。打乱后可以使得攻击者难以通过观察程序的运行行为来推断出敏感信息,从而增强程序的安全性。
当时看到这里,产生了些问题,搞清楚后也写下来供大家参考:
1. 既然是数据输入后,才打乱的顺序,为什么会影响内存的访问情况?
在实际运行中,特别是处理大规模数据时,程序通常会分批次或逐个访问数据,而不是一次性将所有数据导入内存。
如果不对数据进行洗牌,在程序处理数据时,可能会根据数据的原始顺序或者某种特定的顺序来访问数据。这种顺序可能会暴露原始输入数据的特征,使得攻击者可以通过观察程序对数据的处理方式来推断出敏感信息。
而当对数据进行洗牌后,访问顺序被打乱了,这样即使攻击者观察程序对数据的处理方式,也很难从中推断出原始输入数据的特征。
2. 那打乱了顺序,程序中原先针对位置的操作怎么办?比如调换数组首位元素?
如果程序需要进行一些特定的操作,就需要考虑如何逆向操作来实现这样的操作。
一种常见的方法是利用洗牌算法的逆操作。在实际洗牌算法的设计中,通常会考虑到如何进行逆操作,以便在需要时能够恢复到原始数据的状态。这种逆操作通常与洗牌算法的具体实现方式相关,可能需要记录一些额外的信息或者利用算法的特性来实现。这种设计通常需要考虑到数据操作的复杂性和对程序性能的影响。
3. 这样逆操作会产生额外的时间成本,那洗牌这种算法的设计,应该更倾向于无位置信息的操作,比如求均值求方差这种?
洗牌算法的设计通常是为了面向那些对数据位置不敏感或者对数据顺序不关心的程序,这类程序主要关注的是数据的内容和统计特性。
对于那些对数据位置信息敏感的程序,比如需要频繁地进行数据位置操作或者需要维护特定的数据顺序的程序,洗牌算法可能并不是最优的选择。因为在这种情况下,需要额外的逆操作来恢复数据的原始状态,这会增加程序的复杂性和运行时的开销。
4. 论文中有提到“我们算法不需要任何“私有”内存,其中的访问对手无法看到”,意味着waksman网络的控制位信息不用加密存储?可能会有安全隐患。
思考:如果这种洗牌需要可逆,那控制位信息是需要存储的。不过针对不同的输入量n,网络结构是不同的,所需要的控制位数量也是在变的。所以不加处理的存储,虽然攻击者分析的难度大,但是应该还是有隐患的。等论文看完,再具体看看这里是怎么解决这个隐患的,这儿先挖个坑。
先看看一般可采取的策略:
-
加密控制信息:一种常见的方法是对控制信息进行加密处理,使得攻击者无法直接获取到原始的控制信息内容。只有在需要使用时才进行解密,以降低泄露风险。
-
随机化控制信息:另一种方法是在每次执行洗牌算法时都生成随机的控制信息,这样即使攻击者获取了一次的控制信息,也无法推断出其他执行过程的控制信息,增加了攻击的难度。
-
实现安全性检查:在设计洗牌算法时,需要进行安全性检查,确保控制信息的使用方式不会泄露过多关于原始数据的信息,同时尽量减少侧信道攻击的可能性。
2.2 算法要求
符号定义:
表示在
上执行A,包含了执行指令的顺序和每一步的内存内容。A被假定可以访问一系列均匀随机字节,因此E是一个随机函数。
:表示其输出;
:表示其指令追踪,其中包含了指向A中执行指令顺序的索引序列(一些指令可能改变执行流程,使其非顺序化,比如:条件分支、循环等)
:表示内存追踪,包含了每个执行指令的一对
,b代表读或写,
表示内存位置。
高效的算法定义:
以概率多项式时间运行。
两个随机变量是不可区分的:
没有高效算法可以以非可忽略的概率区分它们。
定义中,不要求隐藏任何输入的大小n。
完全不经意性要求:
在执行洗牌算法时,不仅要保证输出结果是不可区分的(即攻击者无法从输出结果中推断出任何关于秘密输入的信息),同时还要保证追踪的信息也是不可区分的。
追踪指的是在执行洗牌算法过程中记录的信息,比如内存访问的记录、指令执行的顺序等。完全不经意性要求在保证秘密输入是安全的同时,还要保证攻击者无法通过观察洗牌算法的执行过程来推断出任何关于秘密输入或输出的信息。
要求在洗牌算法的执行过程中,除了非秘密输入所暗示的信息外,不会泄露任何关于秘密输入或输出的信息,即使攻击者无法直接获得输出结果。
2.3 假设与前提
完全不经意的原语(功能):
-
:完全不经意的选择函数,根据b选择x或y;
:完全不经意的交换函数,根据b选择是否交换数组A的 i 和 j 位置;
这些原语可以使用布尔运算或条件指令(比如:CMOVZ)高效而不经意地实现。
假设:
- 假设可以完全不经意地生成随机比特。
- 假设算术和位运算对其输入是不可区分的,即:在某个上下文中,算术运算(如加法、减法等)和位运算(如与、或、异或等)对于它们的输入是不可区分的,即它们在处理输入数据时不会区分输入的数据类型或格式。
额外功能:
:选择
之间均匀随机的整数,假设对输入时完全不经意的;
:伪随机置换函数,使用密钥k对x应用PRP。安全实现的PRP(例如AES)必须具有恒定时间的实现,从而提供所需的不经意性。
- 具有O(1)时间复杂度的插入和查找的哈希映射数据结构。
- 给定哈希映射
,
来插入键 k 的值为v,
返回键k插入的值。对于任何插入和查找的序列,要求结果的内存和指令追踪可以在不知道v值的情况下模拟(但知道键k)
所依赖的现有算法(进行了一些效率改进):
:假设对数组A进行就地非降序排序,并将B按照与A相同的最终顺序排列(例如,可以用于使用A中键对B中的数据项进行排序)。
:假设将数组A中的项目按照均匀随机顺序排列。
2.4 修改Waksman结构
文章中对Waksman的拓扑结构进行了一点优化,如下:
基本情况不变,也是递归进行构造。当n = 2时,网络是一个单独的开关;当n = 1时,没有开关。
不同的是:输入开关接收以⌈n/2⌉为间隔的输入,而不是1;输出开关产生以⌈n/2⌉为间隔的输出,而不是1。
这种拓扑结构的优势在于,在应用输入开关之后,每个子网络的输入在内存中是连续的,而不是碎片化的,而在标准拓扑结构中,每个子网络都会增加碎片化。这种设计改善了内存局部性,从而提高了控制位的设置和应用到数据数组中的性能。
并且,这种拓扑结构使用与标准拓扑结构相同数量的开关。
未完待续......
因为学术研究的严谨性,很多设置很细节。初涉该领域,学起来会挺吃力的。写出来也很多,下篇继续吧......