“不要把鸡蛋放在同一个篮子里”,这是研究者们提出密钥共享策略的初衷。它借助于一种多方协作的策略来预防秘密数据丢失,同时又不向任何单一方泄漏秘密信息。
在此,提出设计一种安全的数据散布方案:首先,借助GPU的高并发性,显著提升Legendre序列的生成速度,用其实现对数据的加密,保证数据的安全性;其次,结合拉丁方自合痕的密钥共享策略,设计了一种无需密钥管理的安全的数据散布方案;最后,利用纠删码技术,保证该方案具有一定的容错能力。
1. 信息散布策略介绍
近年来,分布式存储系统如雨后春笋般兴起,一个很重要的原因是“单点故障”给很多企业带来很大损失,其中包括亚马逊S3,Google Docs等;而信息散布是解决单点故障的一种有效策略。当前在学术界,比较流行的几种散布策略有:1979年的Shamir门限方案;1985年的RSSS;1989年Rabin提出的IDA(Information Dispersal Algorithm的简称);1994的SMSS;2011年的AONT-RS等。它们大多以Shamir秘密共享方案和纠删码为基础,从不同的角度解决当时存在的学术难题。
1.1 Shamir秘密共享
最早出现的密钥共享方案是Shamir门限方案,它是基于多项式的Lagrange插值公式的,它将秘密 s 分割成 n 个部分,每个部分可以看做是一个子密钥,由一个参与者持有,使得:
(1)由 k 个或者多余 k 个参与者所持有的部分信息可重构 s ;
(2)少于 k 个参与者所持有的部分信息无法重构 s 。
这即是大家所熟知的秘密分割门限方案,其中的 k 是该方案的门限值。
我们可以在有限域 GF(q) 上构造一个 (n,k) 的Shamir方案,其中 q 是大素数且 q≥n+1 。我们可以在集合 GF(q)∖0 上随机选择一个秘密 s ,以及 k−1 个系数 a0,a1,a2,...,ak−1 ,此时我们可以得到一个多项式 f(x)=a0 + a1x + … +a k−1 xk−1 。进而 n 份子密钥可以通过计算 f(i),(i=1,2,...,n) 得到,子密钥 f(i) 被分配给参与者 Pi 。 那么当有 k 个参与者想要得到秘密 s(s=f(0)) 时,可以通过Lagrange插值公式得到:
s=(−1)k−1∑kj=1f(xj)∏kl=1,l≠j(x−xl)(xj−xl)mod(q)
如果有 k−1 参与者想获得秘密 s ,他们可以构造出有 k−1 个方程构成的线性方程组,其中有 k 个未知量。对 GF(q) 中的任一值,可设 f(0)=s0 ,这样可得第 k 个方程,并由Lagrange插值公式得出 f(x) 。因此对每一 s0∈GF(q) 都有一个唯一的多项式满足所有的方程,所以已知 k−1 个子密钥得不到关于秘密 s 的任何信息。
对于一个秘密共享方案,当任何一份子密钥都不泄露关于秘密的任何信息(或者子密钥具有随机性), k−1 子密钥依然不能够泄露秘密的任何信息时,被认为是完善的,或者称为是理论上安全的(information theoretic security)。与Shamir同时期提出的Blakley秘密共享方案就是在这个点上没有完全满足,而被认为具有“缺陷”。
1.2 纠删码(以Reed-Solomon为例)
纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。
当数据通过纠删码进行编码后,分散存储在不同位置,能够保证在某些存储介质出现故障时,依然能够将原始信息恢复;这样,我们可以认为经过编码后的数据具有容错能力。Reed-Solomon(简称RS)是一种比较常见的纠删码,由于编码后的结果码字中包含有原始码字的信息,我们称这种编码是系统码;反之,当结果码字中不包含原始码字的信息的编码方案,我们称为非系统编码(信息理论知识)。
RS算法是以范德蒙德(Vandermonde)矩阵为基础的,计算编码块;以高斯消元法,恢复损坏的数据块。为了方便计算机处理,运算在伽罗华域(Galios Field) GF(2w) 的基础上进行。设数据块数为 m ,系统的容错能力为 k ,那么我们可以构造一个 (m+k)∗m 的编码矩阵 A (矩阵的前 m 行是单位阵,后 k 行是范德蒙德矩阵)数据块可以整体看作一个 m 维的列向量 D ,编码之后的所有数据就是一个 n 维的列向量 E :
A∗D=E
当获取数据时,有容错上限
k 个数据块损坏,我们可以得到
m 块数据构成一个
m 维的列向量
F ,此时我们只需要将矩阵
A 中对应的未获取到数据的行删除,得到矩阵
B ,然后求出矩阵B的逆矩阵
B−1 ,然后就可以通过
F∗B−1 即可得到原始数据
D :
D=F∗B−1
2. 安全合理的数据散布方案
拉丁方自合痕的密钥共享策略是新近的研究成果(2015年),我们利用拉丁方自合痕设计一种方案实现数据的安全散布,同时又尽可能的减少数据冗余。Shamir秘密共享策略虽然非常完善,并且具有理论安全性,但它更加适用在密钥的共享,对于大规模数据的信息共享,由于数据冗余过多而不适用;仅仅依赖纠删码的数据散布策略,显然不符合对数据安全性的要求(有明文信息存储),即便对于非系统码没有将明文信息存储,但与加密相比,其隐私性依然比较薄弱。
我们提出一种方案,用Legendre序列对文件进行加密,用拉丁方自合痕共享文件的加密密钥,通过纠删码的编码策略实现数据的完美散布,既满足数据的安全性需求,又尽可能的减少了数据的冗余。
2.1 拉丁方密钥共享方案
一个 n 阶拉丁方 L=(li,j) 是一个 n∗n 的方阵,且在该方阵中恰有 n 中不同的元素,且每种元素在一行和一列中恰好出现一次。它可以用一个三元组的集合描述为: (i,j,li,j) ,其中 i 表示行号, j 表示列号, li,j 在 (i,j) 处的元素,且他们都是在 Zn 元素。有关学术研究已经证明,当其阶数 n 增大时,拉丁方的数目和其对称拉丁方的数目快递增长,这也是破解基于拉丁方的密钥共享策略的主要难题。
2.1.1 有关拉丁方的数学基础
为了便于后面的说明,我们首先要了解一下有关对称群( Zn 上的运算)的数学知识。通过一个合痕 θ=(α,β,γ)∈Sn×Sn×Sn ,我们对任何一个三元组进行转换,也就是说 i,j,li,j 可以依据 α,β,γ 分别进排列转换:
θ((i,j,li,j))=(α(i),β(j),γ(li,j)), (i,j∈Zn)
我们认为拉丁方
L 和
θ(L) 是
合痕的,所有与
L 合痕的拉丁方构成一个
合痕类,当
θ(L)=L 时,我们称
θ 是
L 的一个
自合痕。若
L 存在自合痕
(α,β,γ) , 那么
L 中的任一实体元素的
轨道构成一个集合:
{(αk(i),βk(j),γk(li,j)):k⩾0}
该轨道中的任一元素都是
L 的实体。当合痕是一个两不相交
(n/2) 的环,我们称它为
suitable。
一个
部分拉丁方
P=(pi,j ) 是一个
n 阶方阵,每个
Zn 中的元素在方阵的一行和一列中至多出现一次,即在
P 中存在空元素。当有拉丁方
L=(li,j) 满足:
pi,j=li,j 或者
pi,j 为空元素时,我们称
L 是
P 的一个
completion。
当一个部分拉丁方由一个拉丁方中的元素集合的子集
A 组成,且该部分拉丁方有且仅有一个
completion时,我们称集合
A 是严肃集合,当该严肃集合的基数最小时,我们称它为最小严肃集。
2.1.2 基于拉丁方自合痕的秘密共享方案
在拉丁方的秘密共享的传统方案设计中,秘密信息是一个 n 阶拉丁方,其散布策略包括三个步骤:(1)选择一个 n 阶拉丁方 L ,其中 n 是公开的信息, L 是私密信息;(2)定义一个集合 S ,其元素是 L 的严肃集合;(3) S 中的每个元素可以被看作为共享信息,并被其他参与者分别拥有。
2015年,Rebecca等人提出了一种基于拉丁方自合痕的秘密共享方案,其中的秘密信息是自合痕,而对应的拉丁方是为了验证秘密的正确性。该自合痕是环结构,而部分拉丁方中的元素是拉丁方 L 在自合痕 θ 下的所有轨道的集合,此种部分拉丁方我们称之为contours。当已知contour和它对应的自合痕 θ 时,我们就能恢复 L 。
在秘密散布的过程中,主要包括四步:(1)初始化一个contour Cprior 和其对应的自合痕 ζ ;(2)通过随机生成一个合痕 φ ,可以得到一个contour C=φ(Cprior) ,以及与之对应的自合痕 θ=φζφ−1 ;(3)自合痕散布:我们可以随机生成 l−1 个合痕 σ1,σ2,...,σl−1 ,然后通过计算得到 σl=σ−1l−1...σ−11θ ;(4)我们可以将 ξ=σlσl−1...σ1 和 Cpublic=ξ(C) 作为公开信息。
2.2 无需秘钥管理的数据安全散布策略
该方案主要包括两部分:为了保护数据的安全性,用Legendre序列对其进行加密;用拉丁方自合痕秘密共享策略实现对密钥的散步。这种方案在保护数据的安全性的同时并未给数据的持有者带来额外的代价。
该方案共分为三个阶段:生成密钥;加密数据;散布数据。
2.2.1 生成密钥
初始化阶段: (1) 生成一个 n∗n contour D=(di,j) ,其对应的自合痕是 ζ=(τ,τ,τ) ,其中 τ=(0,1,...,n/2−1)(0,1,...,n/2−1) ,那么 (D,ζ) 可以生成一个拉丁方 Lprior 。然后通过 ζt(τ,τ,τ) ( t 是从 Zn 从选择的随机数)将D中的每个实体转换从而能得到一个随机的contour Cprior ; (2) 随机生成一个合痕 φ 。让 L=φ(Lprior) ,那么 L 对应的自合痕是 θ=φζφ−1 ,并且有 contour C=φ(Cprior) ; (3) 随机生成 l−1 个合痕 σ1,σ2,...,σl−1 ,然后计算得到 σl=σ−1l−1...σ−11θ ; (4) 令 ξ=σlσl−1...σ1 , Cpublic=ξ(C),ξ,Cpublic 是可以公开的信息。
转换阶段:
【方法1】只是为了描述将自合痕转换为密钥的思想, 我们以两不相交的 (n/2) 环结构自合痕 θ=(α,β,γ) 为例,其中 n=6 , α=β=γ=(012)(345) 。我们可以简单的将这些排列组合,从而生成密钥 K=“012,356∗012,356∗012,356“ 。如果 θ 中的每个元素都是char型数据,我们就可以得到一个184-bit的密钥。
【方法2】简单的哈希函数,如果我们期望得到的密钥长度是 len ,而由方法1得到的密钥长度为 len(K)<len ,那么我需要在 K 后补 len−len(K) 个0;如果我们的密钥长度 len(K)>len ,我们可以将 K 分割成密钥块,每个块的长度为 len ,最后一个块的长度为 len(K)%len)−bit ,然后将最后一部分的长度补足为 len ;进而,我们初始化一个哈希值0长度为 len−bit ;然后处理每个密钥块,将当前的哈希值左移1位,将它与下一个密钥块进行XOR运算,最终我们将得到一个长度为 len 的密钥;
【方法3】 利用现有的成熟的哈希算法生成指定长度的密钥,目前存在的哈希算法有:MD2, MD4,MD5, SHA-1, SHA-224,SHA-256,SHA-384,SHA-512,RIPEMD-128,RIPEMD-160,RIPEMD-256,RIPEMD-320,WHIRLPOOL,tiger128-3,tiger160-3,tiger192-3,tiger128-4,tiger160-4,tiger192-4等。
2.2.2 加密文件
我们使用Legendre序列对文件进行加密,由于Legendre符号计算较为复杂,为了加速Legendre序列的生成,我们使用了两个技巧:降低计算复杂性和适用GPU做并行加速。
降低计算复杂性:
Legendre序列是通过Legendre符号定义的,序列中的元素间是相互独立的,元素为0或1取决于当前位置以及大素数 p 。对于一个奇素数 p ,如果 gcd(i,p)=1 ,我们可以定义Legendre符号如下:
(ip)={ 1,−1,i是mod p的二次剩余i 不是mod p的二次剩余
相应的,Legendre 序列 {
ai } 可以定义如下:
ai={1,0,如果(ip)=1 且gcd(i,p)=1其他
根据Legendre符号和Jacobi符号的相关性质,我们可以将计算过程不断转化从而得到如下公式,以降低Legendre符号的计算复杂性:
(ip)=[(−1)p2−18]n×(−1)p−12×b−12×(p mod bb).
更进一步的,(
p mod bb ) 可以按照该公式继续优化。
并行加速:
由于Legendre序列的元素间是相互独立的,是0还是1完全取决于位置
i 和素数
p 。正因为此,我们可以将Legendre序列的生成用CUDA平台进行加速。我们可以根据需要的序列长度和GPU技术,创建合适数目的线程,每个线程负责合适位的运算。比如:我们需要1M-bit长的序列,我们可以创建512*2048个线程,这样我们生成1M-bit长的序列的时间开销和生成1bit的时间开销相同。
我们可以根据数据的大小,生成相应长度的Legendre序列,从而对文件进行流式加密。密钥
K 即是序列的起始点,当选取的大素数足够大时,该加密算法的安全完全取决于密钥长度。
2.2.3 散布数据
通过上面的过程,我们已经对数据完成了加密。我们希望数据散布后具有容错能力,所以需要用到纠删码对数据进行编码。
假设我们选取容错能力为1的RS编码,我们需要将数据散布在六个不同的存储介质上,我们需要将密文和 Cpublic 均分为5份, 分别为 cipherTexti , (Cpublic)i ,其中 (i=1,2,3,4,5) 。通过拉丁方自合痕的秘密共享策略,我们可以得到5个随机的子密钥 σi,(i=1,2,3,4,5) ,然后我们可以将 cipherTexti , σi and (Cpublic)i 打包为一个数据块 blocki ,然后我们就可以通过一个 (6∗5) 的RS编码矩阵,将5块数据编码为6块数据,分别存储在不同的存储介质上。
当需要恢复原始数据时,我们可以首先从存储介质上获取原始数据块,如果得到的是前5块数据块,我们就可以得到每个数据块的 cipherTexti , σi , (Cpublic)i ,进一步可以得到 cipherText , (Cpublic) , θ=σ1σ2...σ5 , ξ=σlσl−1...σ1 ;可以通过 θ,Cpublic,ξ 验证是否得到正确的密钥 K ;如果得到正确密钥,即可对 cipherText 解密,从而得到原始信息。如果前5块数据中有一块丢失,就需要利用RS解码算法,得到 cipherText ,然后再进行上述过程。
2.2.4 简单分析
数据在不同的存储介质上都是以密文方式存储,虽然每个存储介质上都有密钥的子密钥信息,但由于每个子密钥都是随机生成的,从而并未泄露私密密钥的任何信息;所以即便某个存储介质不被信任,原始数据的安全仍然能够得到保障。初次之外,采用纠删码对数据进行编码,虽然带来了极少量的冗余,但是该种散布策略具有容错能力,更加保证了数据的可用性。
3. 总结
本方案提出了对Legendre序列生成的并行优化,并将其计算过程进行简化,从而加速了序列的生成速度;其次,利用拉丁方自合痕的密钥共享策略,对密钥进行安全散布,保证了数据的安全性;最后,纠删码技术保证了方案的容错能力,提高了数据的可用性。