“不要把鸡蛋放在同一个篮子里”,这是研究者们提出密钥共享策略的初衷。它借助于一种多方协作的策略来预防秘密数据丢失,同时又不向任何单一方泄漏秘密信息。
  在此,提出设计一种安全的数据散布方案:首先,借助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 s 分割成nn个部分,每个部分可以看做是一个子密钥,由一个参与者持有,使得:
  (1)由 k k个或者多余kk个参与者所持有的部分信息可重构 s s;
(2)少于kk个参与者所持有的部分信息无法重构 s s。
这即是大家所熟知的秘密分割门限方案,其中的kk是该方案的门限值。
  我们可以在有限域 GF(q) GF(q)上构造一个 (n,k) (n,k)的Shamir方案,其中 q q是大素数且q≥n+1q \geq n+1。我们可以在集合 GF(q)∖0 GF(q)\backslash{0}上随机选择一个秘密 s s ,以及 k−1 k-1 个系数 a0,a1,a2,...,ak−1 a_0,a_1,a_2,...,a_{k-1} ,此时我们可以得到一个多项式 f(x)=a0 f(x)=a_0 + a1x a_1x + … +a k−1 _{k-1} xk−1 x^{k-1} 。进而 n n份子密钥可以通过计算f(i),(i=1,2,...,n)f(i), (i=1,2,...,n) 得到,子密钥 f(i) f(i) 被分配给参与者 Pi P_i。 那么当有 k k 个参与者想要得到秘密s(s=f(0))s(s=f(0)) 时,可以通过Lagrange插值公式得到:
       s=(−1)k−1∑kj=1f(xj)∏kl=1,l≠j(x−xl)(xj−xl)mod(q) s=(-1)^{k-1}{\sum_{j=1}^k} f(x_j)\prod_{l=1,l\neq j}^k\frac{(x-x_l)}{(x_j-x_l)} mod(q)  
  如果有 k−1 k-1 参与者想获得秘密 s s ,他们可以构造出有k−1k-1 个方程构成的线性方程组,其中有 k k个未知量。对GF(q)GF(q) 中的任一值,可设 f(0)=s0 f(0)=s_0 ,这样可得第 k k 个方程,并由Lagrange插值公式得出f(x)f(x) 。因此对每一 s0∈GF(q) s_0 \in GF(q) 都有一个唯一的多项式满足所有的方程,所以已知 k−1 k-1 个子密钥得不到关于秘密 s s 的任何信息。
对于一个秘密共享方案,当任何一份子密钥都不泄露关于秘密的任何信息(或者子密钥具有随机性),k−1k-1 子密钥依然不能够泄露秘密的任何信息时,被认为是完善的,或者称为是理论上安全的(information theoretic security)。与Shamir同时期提出的Blakley秘密共享方案就是在这个点上没有完全满足,而被认为具有“缺陷”。

1.2 纠删码(以Reed-Solomon为例)

纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。

  当数据通过纠删码进行编码后,分散存储在不同位置,能够保证在某些存储介质出现故障时,依然能够将原始信息恢复;这样,我们可以认为经过编码后的数据具有容错能力。Reed-Solomon(简称RS)是一种比较常见的纠删码,由于编码后的结果码字中包含有原始码字的信息,我们称这种编码是系统码;反之,当结果码字中不包含原始码字的信息的编码方案,我们称为非系统编码(信息理论知识)。
  RS算法是以范德蒙德(Vandermonde)矩阵为基础的,计算编码块;以高斯消元法,恢复损坏的数据块。为了方便计算机处理,运算在伽罗华域(Galios Field) GF(2w) GF(2^w) 的基础上进行。设数据块数为 m m,系统的容错能力为kk,那么我们可以构造一个 (m+k)∗m (m+k)*m 的编码矩阵 A A (矩阵的前mm行是单位阵,后 k k行是范德蒙德矩阵)数据块可以整体看作一个mm维的列向量 D D,编码之后的所有数据就是一个nn维的列向量 E E:

A∗D=E

A*D=E
  当获取数据时,有容错上限 k k个数据块损坏,我们可以得到mm块数据构成一个 m m维的列向量FF,此时我们只需要将矩阵 A A中对应的未获取到数据的行删除,得到矩阵BB,然后求出矩阵B的逆矩阵 B−1 B^{-1},然后就可以通过 F∗B−1 F*B^{-1} 即可得到原始数据 D D:

D=F∗B−1

D=F*B^{-1}
  

2. 安全合理的数据散布方案

   拉丁方自合痕的密钥共享策略是新近的研究成果(2015年),我们利用拉丁方自合痕设计一种方案实现数据的安全散布,同时又尽可能的减少数据冗余。Shamir秘密共享策略虽然非常完善,并且具有理论安全性,但它更加适用在密钥的共享,对于大规模数据的信息共享,由于数据冗余过多而不适用;仅仅依赖纠删码的数据散布策略,显然不符合对数据安全性的要求(有明文信息存储),即便对于非系统码没有将明文信息存储,但与加密相比,其隐私性依然比较薄弱。
   我们提出一种方案,用Legendre序列对文件进行加密,用拉丁方自合痕共享文件的加密密钥,通过纠删码的编码策略实现数据的完美散布,既满足数据的安全性需求,又尽可能的减少了数据的冗余。

2.1 拉丁方密钥共享方案

  一个 n n 阶拉丁方L=(li,j)L=(l_{i,j}) 是一个 n∗n n*n 的方阵,且在该方阵中恰有 n n 中不同的元素,且每种元素在一行和一列中恰好出现一次。它可以用一个三元组的集合描述为:(i,j,li,j)(i,j,l_{i,j}),其中 i i 表示行号,jj 表示列号, li,j l_{i,j} 在 (i,j) (i,j) 处的元素,且他们都是在 Zn \mathbb{Z}_n 元素。有关学术研究已经证明,当其阶数 n n 增大时,拉丁方的数目和其对称拉丁方的数目快递增长,这也是破解基于拉丁方的密钥共享策略的主要难题。

2.1.1 有关拉丁方的数学基础  

  为了便于后面的说明,我们首先要了解一下有关对称群(Zn\mathbb{Z}_n 上的运算)的数学知识。通过一个合痕 θ=(α,β,γ)∈Sn×Sn×Sn \theta=(\alpha,\beta,\gamma)\in S_n \times S_n \times S_n,我们对任何一个三元组进行转换,也就是说 i,j,li,j i,j,l_{i,j} 可以依据 α,β,γ \alpha,\beta,\gamma 分别进排列转换:
         

θ((i,j,li,j))=(α(i),β(j),γ(li,j)),   (i,j∈Zn)

\theta \big( (i,j,l_{i,j})\big)=\big(\alpha(i),\beta(j),\gamma(l_{i,j})\big),~~~(i,j \in \mathbb{Z}_n)
  我们认为拉丁方 L L 和 θ(L)\theta(L) 是 合痕的,所有与 L L 合痕的拉丁方构成一个合痕类,当θ(L)=L\theta(L)=L时,我们称 θ \theta 是 L L的一个自合痕。若LL 存在自合痕 (α,β,γ) (\alpha,\beta,\gamma), 那么 L L 中的任一实体元素的轨道构成一个集合:

{(αk(i),βk(j),γk(li,j)):k⩾0}

\Big\{\big(\alpha^k(i),\beta^k(j),\gamma^k(l_{i,j})\big):k \geqslant 0\Big\}
该轨道中的任一元素都是 L L 的实体。当合痕是一个两不相交(n/2)(n/2)的环,我们称它为 suitable
  一个 部分拉丁方 P=(pi,j P = (p_{i,j}) 是一个 n n 阶方阵,每个Zn\mathbb{Z}_n 中的元素在方阵的一行和一列中至多出现一次,即在 P P中存在空元素。当有拉丁方L=(li,j)L=(l_{i,j}) 满足: pi,j=li,j p_{i,j}=l_{i,j}或者 pi,j p_{i,j}为空元素时,我们称 L L是PP的一个 completion
  当一个部分拉丁方由一个拉丁方中的元素集合的子集 A A组成,且该部分拉丁方有且仅有一个completion时,我们称集合AA是严肃集合,当该严肃集合的基数最小时,我们称它为最小严肃集。

2.1.2 基于拉丁方自合痕的秘密共享方案

  在拉丁方的秘密共享的传统方案设计中,秘密信息是一个 n n阶拉丁方,其散布策略包括三个步骤:(1)选择一个nn阶拉丁方 L L,其中nn是公开的信息, L L是私密信息;(2)定义一个集合SS,其元素是 L L的严肃集合;(3)SS中的每个元素可以被看作为共享信息,并被其他参与者分别拥有。
  2015年,Rebecca等人提出了一种基于拉丁方自合痕的秘密共享方案,其中的秘密信息是自合痕,而对应的拉丁方是为了验证秘密的正确性。该自合痕是环结构,而部分拉丁方中的元素是拉丁方 L L在自合痕θ\theta下的所有轨道的集合,此种部分拉丁方我们称之为contours。当已知contour和它对应的自合痕 θ \theta时,我们就能恢复 L L。
在秘密散布的过程中,主要包括四步:(1)初始化一个contourCpriorC_{prior}和其对应的自合痕 ζ \zeta;(2)通过随机生成一个合痕 φ \varphi,可以得到一个contour C=φ(Cprior) C=\varphi(C_{prior}),以及与之对应的自合痕 θ=φζφ−1 \theta=\varphi \zeta \varphi^{-1};(3)自合痕散布:我们可以随机生成 l−1 l-1个合痕 σ1,σ2,...,σl−1 \sigma_1,\sigma_2,...,\sigma_{l-1},然后通过计算得到 σl=σ−1l−1...σ−11θ \sigma_l=\sigma^{-1}_{l-1}... \sigma^{-1}_1\theta;(4)我们可以将 ξ=σlσl−1...σ1 \xi=\sigma_l\sigma_{l-1}... \sigma_1 和 Cpublic=ξ(C) C_{public}=\xi(C)作为公开信息。

2.2 无需秘钥管理的数据安全散布策略

  该方案主要包括两部分:为了保护数据的安全性,用Legendre序列对其进行加密;用拉丁方自合痕秘密共享策略实现对密钥的散步。这种方案在保护数据的安全性的同时并未给数据的持有者带来额外的代价。
  该方案共分为三个阶段:生成密钥;加密数据;散布数据。

2.2.1 生成密钥

  初始化阶段: (1) (1)生成一个 n∗n n*n contour D=(di,j) D=(d_{i,j}),其对应的自合痕是 ζ=(τ,τ,τ) \zeta=(\tau,\tau,\tau) ,其中 τ=(0,1,...,n/2−1)(0,1,...,n/2−1) \tau=(0,1,...,n/2-1)(0,1,...,n/2-1) ,那么 (D,ζ) (D,\zeta) 可以生成一个拉丁方 Lprior L_{prior}。然后通过 ζt(τ,τ,τ) \zeta^t(\tau,\tau,\tau) ( t t是从Zn\mathbb{Z}_n从选择的随机数)将D中的每个实体转换从而能得到一个随机的contour Cprior C_{prior} ; (2) (2)随机生成一个合痕 φ \varphi。让 L=φ(Lprior) L = \varphi(L_{prior}) ,那么 L L对应的自合痕是θ=φζφ−1\theta =\varphi \zeta \varphi^{-1},并且有 contour C=φ(Cprior) C = \varphi(C_{prior}); (3) (3)随机生成 l−1 l-1个合痕 σ1,σ2,...,σl−1 \sigma_1,\sigma_2,...,\sigma_{l-1} ,然后计算得到 σl=σ−1l−1...σ−11θ \sigma_l=\sigma^{-1}_{l-1}... \sigma^{-1}_1\theta; (4) (4)令 ξ=σlσl−1...σ1 \xi =\sigma_l\sigma_{l-1}... \sigma_1, Cpublic=ξ(C),ξ,Cpublic C_{public} =\xi(C),\xi,C_{public}是可以公开的信息。
  转换阶段
  【方法1】只是为了描述将自合痕转换为密钥的思想, 我们以两不相交的 (n/2) (n/2)环结构自合痕 θ=(α,β,γ) \theta=(\alpha,\beta,\gamma)为例,其中 n=6 n=6, α=β=γ=(012)(345) \alpha=\beta=\gamma=(012)(345)。我们可以简单的将这些排列组合,从而生成密钥 K="012,356∗012,356∗012,356" K="012,356*012,356*012,356"。如果 θ \theta中的每个元素都是char型数据,我们就可以得到一个184-bit的密钥。
  【方法2】简单的哈希函数,如果我们期望得到的密钥长度是 len len,而由方法1得到的密钥长度为 len(K)<len len(K),那么我需要在 K K后补len−len(K)len-len(K)个0;如果我们的密钥长度 len(K)>len len(K)>len,我们可以将 K K分割成密钥块,每个块的长度为lenlen,最后一个块的长度为 len(K)%len)−bit len(K)\%len)-bit,然后将最后一部分的长度补足为 len len;进而,我们初始化一个哈希值0长度为 len−bit len-bit;然后处理每个密钥块,将当前的哈希值左移1位,将它与下一个密钥块进行XOR运算,最终我们将得到一个长度为 len 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。对于一个奇素数 pp,如果 gcd(i,p)=1 gcd(i,p)=1,我们可以定义Legendre符号如下:

(ip)={   1,−1,i是mod p的二次剩余i 不是mod p的二次剩余

(\frac{i}{p})= \begin{cases} ~~~1,&\text{$i$是mod $p$}的二次剩余\\ -1,&\text{$i$ 不是mod $p$的二次剩余} \end{cases}
相应的,Legendre 序列 { ai a_i} 可以定义如下:

ai={1,0,如果(ip)=1 且gcd(i,p)=1其他

a_i= \begin{cases} 1,&\text{如果$(\frac{i}{p})=1$ 且gcd(i,p)=1} \\ 0,&\text{其他} \end{cases}
根据Legendre符号和Jacobi符号的相关性质,我们可以将计算过程不断转化从而得到如下公式,以降低Legendre符号的计算复杂性:

(ip)=[(−1)p2−18]n×(−1)p−12×b−12×(p mod bb).

(\frac{i}{p})=[(-1)^{\frac{p^2-1}{8}}]^n\times(-1)^{\frac{p-1}{2}\times\frac{b-1}{2}}\times(\frac{p~mod~b}{b}).
更进一步的,( p mod bb \frac{p~mod~b}{b}) 可以按照该公式继续优化。
   并行加速:
  由于Legendre序列的元素间是相互独立的,是0还是1完全取决于位置 i i和素数pp。正因为此,我们可以将Legendre序列的生成用CUDA平台进行加速。我们可以根据需要的序列长度和GPU技术,创建合适数目的线程,每个线程负责合适位的运算。比如:我们需要1M-bit长的序列,我们可以创建512*2048个线程,这样我们生成1M-bit长的序列的时间开销和生成1bit的时间开销相同。
  我们可以根据数据的大小,生成相应长度的Legendre序列,从而对文件进行流式加密。密钥 K K即是序列的起始点,当选取的大素数足够大时,该加密算法的安全完全取决于密钥长度。

2.2.3 散布数据  

  通过上面的过程,我们已经对数据完成了加密。我们希望数据散布后具有容错能力,所以需要用到纠删码对数据进行编码。
假设我们选取容错能力为1的RS编码,我们需要将数据散布在六个不同的存储介质上,我们需要将密文和CpublicC_{public}均分为5份, 分别为 cipherTexti cipherText_i, (Cpublic)i (C_{public})_i,其中 (i=1,2,3,4,5) (i=1,2,3,4,5) 。通过拉丁方自合痕的秘密共享策略,我们可以得到5个随机的子密钥 σi,(i=1,2,3,4,5) \sigma_i,(i=1,2,3,4,5),然后我们可以将 cipherTexti cipherText_i, σi \sigma_i and (Cpublic)i (C_{public})_i打包为一个数据块 blocki block_i,然后我们就可以通过一个 (6∗5) (6*5)的RS编码矩阵,将5块数据编码为6块数据,分别存储在不同的存储介质上。
  当需要恢复原始数据时,我们可以首先从存储介质上获取原始数据块,如果得到的是前5块数据块,我们就可以得到每个数据块的 cipherTexti cipherText_i, σi \sigma_i , (Cpublic)i (C_{public})_i,进一步可以得到 cipherText cipherText, (Cpublic) (C_{public}), θ=σ1σ2...σ5 \theta=\sigma_1\sigma_2... \sigma_5, ξ=σlσl−1...σ1 \xi =\sigma_l\sigma_{l-1}... \sigma_1;可以通过 θ,Cpublic,ξ \theta,C_{public},\xi 验证是否得到正确的密钥 K K;如果得到正确密钥,即可对cipherTextcipherText解密,从而得到原始信息。如果前5块数据中有一块丢失,就需要利用RS解码算法,得到 cipherText cipherText,然后再进行上述过程。

2.2.4 简单分析 

   数据在不同的存储介质上都是以密文方式存储,虽然每个存储介质上都有密钥的子密钥信息,但由于每个子密钥都是随机生成的,从而并未泄露私密密钥的任何信息;所以即便某个存储介质不被信任,原始数据的安全仍然能够得到保障。初次之外,采用纠删码对数据进行编码,虽然带来了极少量的冗余,但是该种散布策略具有容错能力,更加保证了数据的可用性。  

3. 总结

  本方案提出了对Legendre序列生成的并行优化,并将其计算过程进行简化,从而加速了序列的生成速度;其次,利用拉丁方自合痕的密钥共享策略,对密钥进行安全散布,保证了数据的安全性;最后,纠删码技术保证了方案的容错能力,提高了数据的可用性。
 

基于Legendre序列和拉丁方的数据安全散布相关推荐

  1. 基于 Sobol 序列和纵横交叉策略的麻雀搜索算法-附代码

    基于 Sobol 序列和纵横交叉策略的麻雀搜索算法 文章目录 基于 Sobol 序列和纵横交叉策略的麻雀搜索算法 1.麻雀优化算法 2. 改进麻雀算法 2.1 基于 Sobol 序列初始化种群位置 2 ...

  2. 基于区块链的链上数据安全共享体系研究

    点击上方蓝字关注我们 基于分层注意力网络的方面情感分析 刘彦松1, 夏琦1, 李柱1, 夏虎1, 张小松1, 高建彬2 1 电子科技大学计算机科学与工程学院,四川 成都 611731 2 电子科技大学 ...

  3. 小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计

    小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计 目标:学会使用线性序列机的思想设计常见的有串行执行特征的时序逻辑 实验现象:在QuartusⅡ软件中,使用ISSP工具,输入希望输出的电 ...

  4. Nat. Methods | scBasset:基于DNA序列的单细胞ATAC-seq卷积神经网络建模

    本文介绍由美国生物科技公司Calico Life Sciences的Han Yuan 和 David R. Kelley共同通讯发表在 Nature methods 的研究成果:单细胞ATAC-seq ...

  5. matlab序列谱分析,基于MATLAB序列谱分析及FFT实现快速卷积.pdf

    数字信号处理大作业 基于MATLAB 的序列谱分析与FFT 实现快速卷积 学 院(系): 软件学院 专 业: 网络工程 学 生 姓 名: 学 号: 班 级: 完 成 日 期: 大连理工大学 Dalia ...

  6. 论文浅尝 | 基于深度序列模型的知识图谱补全

    本文转载自公众号:DI数据智能. Learning to Complete Knowledge Graphs with Deep Sequential Models 作者:郭凌冰.张清恒.胡伟.孙泽群 ...

  7. 中文分句java_基于CRF序列标注的中文依存句法分析器的Java实现

    这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...

  8. 基于线性序列机的SPI协议读写winbond公司flash芯片25Q16

    基于小梅哥所提的线性序列机思想设计读写该芯片的SPI协议,线性序列机简单来说就是用一个计数器对时钟计数,对于每一个计数值,按照时序要求对信号做出相应操作.简单写了一下 Read Manufacture ...

  9. 基于命令序列的异常行为分析 业界研究现状分析

    基于用户命令行为的内部威胁检测实验 from:http://www.freebuf.com/articles/database/93108.html 0×00 前言 之前在FreeBuf上看到过针对机 ...

最新文章

  1. Activiti 开始流程时存储发起人员USERID
  2. [置顶] 深入浅出Javascript(三)创建自定义对象以及属性、方法
  3. YII2 - Yii 2 控制器不能包含大写字母的Bug
  4. MySQL之mysql客户端工作的批处理一些使用手法
  5. SVN四部曲之SVN简单使用教程入门
  6. 图解Java中的18 把锁!
  7. linux模拟发包工具,linux发包软件-线不是一个压力测试工具的linux以上收缩服务器可...
  8. Hbase 命令及配置文件
  9. 《辛雷学习方法》读书笔记——前言
  10. MES系统和RRP之间需要交换哪些数据?
  11. JAVA JDK8的介绍下载和安装(附网盘地址)
  12. python 拆分excel工作表_Python合并拆分excel
  13. 模拟喷泉码(入门二):Seamless Rate Adaptation for Wireless Networking
  14. SQLserver的安装,sa账户的登陆,数据库的建立、表的建立及增删改
  15. java 判断String是不是Long类型
  16. 全球与中国货船维修保养市场深度研究分析报告
  17. 部署SpringBoot+SpringCloud+Vue项目——半途而废版
  18. 3D游戏从入门到精通-31 32 33
  19. spring initializr搜不到Aspects
  20. 电子邮件安全对企业的重要性

热门文章

  1. 如何创建和发布.asmx Web Service
  2. AI大数据可视化EasyCVR视频融合平台的部署操作流程详解
  3. Excel模糊匹配相同内容的数据求和,使用SUMIF函数
  4. 用SonarQube审查本地代码
  5. gg修改器修改内购_时空猎人各种修改
  6. [转]PHP中页面跳转
  7. 如何将两个屏幕设置成分屏或者复制屏幕?
  8. iOS 指纹解锁 验证TouchID
  9. 5G车联网技术对自动驾驶的赋能
  10. 微信小程序授权 获取用户信息