数据匿名化基于密码技术
确定性加密
确定性加密方案对应的是概率性加密方案
确定性加密方案:
加密方案是确定的,每一个明文对应一个密文。如RSA加密。
概率性加密方案:
每次加密时首先选择一个随机数,再生成密文。因此同一个明文加密后的结果不一样。如ElGamal加密。
DES,RAS这些都是确定性加密,这里选取RSA作为例子:
RSA
密钥选取:
加解密:
加密用公钥对明文进行加密,得到密文
解密用私钥对密文进行解密,得到明文
注:本文暂时不做算法的安全性证明
保序加密
保序加密(Order-Preserving Encryption,OPE)是一种加密方式,它可以将明文转换为密文,同时保持明文的大小关系不变。也就是说,如果明文 m1<m2,那么密文 c1<c2。
这种加密方式在某些场景下非常有用,比如需要对数据库中的数据进行排序和搜索,但是又需要保护数据的隐私。
常见的保序加密有两种:
- 基于可逆加密算法的保序加密(如AES、DES等),它们使用的是块加密算法,在加密之后会得到固定长度的密文。
- 基于非可逆加密算法的保序加密(如SHA-1、SHA-2等),它们使用的是哈希算法,加密之后得到的密文长度是固定的,但是由于哈希算法是不可逆的,所以无法还原出原始明文。
这里以HASH算法作为举例子:
sha-1:
SHA1算法是Hash算法的一种。
SHA1算法的最大输入长度小于2^64比特的消息,输入消息(明文)以512比特的分组为单位处理,输出160比特的消息摘要(密文)
因此sha-1的运算其实可以分为两个部分,第一个部分就是补位,第二个部分就是对每一个512bit的处理,每一个512bit分组的处理其实也比较类似。
第一个 512 比特的运算会使用到一个给定的初始链接变量。然后在经过一个 80 轮的运算之后,它会得到一个 160 比特的字符串,而这个 160 比特的字符串它会参与下一个 512 比特的运算,使其得到一个新的160比特的字符串。那以此类推,直至最后一个 512 比特,他的快运算得到一个 160 比特的字符串。也就是说我们的哈希运算结果。
首先看补位,需要让消息的长度是 512 的整数倍,补位的过程是必须进行,也就是说即使你已经满足 512 比特的整数倍了,也需要进行补位操作。
接下来我们就是要将这 80 份的明文分组都参与到一个 80 轮的运算中。sha-1它是有四轮运算,每一轮包括 20 个步骤,最后产生一个 160 位的摘要,这 160 位的摘要存放在 5 个 32 位的链接变量中,分别标记成a、b、c、d、 e 这 5 个,那这五个链接变量它的一个初始值用 16 进制表示。
这个是一个初始值,分别给abcde
然后我们进行80轮运算
我们这 80 轮的结果出来是得到了一个最终的一个ABCDE。
最后一步就是将这个最终的a、b、c、d、 e 分别和我们最初的那五个初始缓存缓冲区的链接变量相加。
这五个变量,那 H 0 到 H4 它就是第一个 512 比特运算出来的结果。
然后注意这些加法都是取模加,模数是2^32
保留格式加密
保留格式加密(Format Preserving Encryption,FPE)是一种可以保证密文与明文具有相同格式与长度的加密方式。FPE常应用于数据去标志化或者脱敏,能保持明文和密文的格式相同,如英文加密后仍为英文,数字加密后仍为数字
FPE的一种常见算法是FF1,它基于Feistel网络和AES加密,通过多轮迭代实现对任意长度的数据的加密和解密
FPE特征
数据不能被扩充。如当加密N为数字时,必须输出另外一个N位数字;
数据类型不能被改变。如一段只包含数据的内容加密后也只能是数据;
数据必须能被确定加密。如对数据库中作为索引值字段的数据加密,加密后保留其所在列索引值的特性。
对于短明文数据,安全性不会降低。
加密过程可逆,加密后的数据可以通过密钥解密还原原始数据。
FF1算法
FF1算法是一种基于分组密码的加密算法,使用Feistel结构和轮函数的设计。
FF1算法的输入包括明文、加密密钥和扩展密钥。其中明文是需要加密的数据,加密密钥是用于加密和解密的密钥,而扩展密钥是用于生成轮密钥的密钥。
FF1算法的加密过程包括以下几个步骤:
- ****分割明文:****将明文按照指定的格式进行分割,得到多个分组。
- ****初始化:****根据加密密钥和扩展密钥生成轮密钥,设置加密次数和轮数。
- ****轮函数:****使用轮密钥对每个分组进行加密操作。
- ****轮迭代:****根据加密次数和轮数,重复进行轮函数操作。
- ****合并分组:****将加密后的分组按照指定的格式进行合并,得到密文。
FF1算法的解密过程与加密过程类似,只是在轮函数中使用解密轮密钥对密文进行解密操作,最后将解密后的分组按照指定的格式进行合并,得到明文。
Feistel网络可以通过定义分组大小、密钥长度、轮次数、子密钥生成、轮函数等来构造一个分组密码,其主要流程如下图所示
其加密算法逻辑如下:
令F为轮函数;令K1,K2,……,Kn 分别为第1,2,……,n 轮的子密钥。那么Feistel加密过程如下:
(1)将明文信息均分为两块:(L0,R0);
(2)在每一轮中,进行如下运算(i为当前轮数):
Li+1= Ri;
Ri+1= Li ⊕ F(Ri,Ki)。(其中⊕为异或操作)
所得的结果即为:(Ri+1,Li+1)。
其解密算法逻辑如下:
对于密文(Rn+1,Ln+1),我们将i由n 向0 进行,即i=n,n-1,……,0。然后对密文进行加密的逆向操作,如下:
(1)Ri = Li+1;
(2)Li = Ri+1⊕ F(Li+1,Ki)。(其中⊕为异或操作)
所得结果为(L0,R0),即原来的明文信息。
同态加密
概述:
A way to delegate processing of your data, without giving away access to it.
这就是同态加密
这里面的对应关系是:
- 盒子:加密算法
- 盒子上的锁:用户密钥
- 将金块放在盒子里面并且用锁锁上:将数据用同态加密方案进行加密
- 加工:应用同态特性,在无法取得数据的条件下直接对加密结果进行处理
- 开锁:对结果进行解密,直接得到处理后的结果
基于格,支持乘法同态1次以上的就是全同态了。
半同态:
PaILLIer加密:
第一种:
lcm表示最小公倍数
第二种:
密钥生成:
加密:
解密:
全同态:
BFV
这里BFV的同态是针对多项式的,而不是针对数值的
也就是说它的明文空间是一个多项式
但这样的多样式可能对我们的这个数值分析应用来说是没法直接用的
一个从原始的数值数据到这个多项式的编码方法,把BFV 这种算法用于科学计算。一种常用的方法是叫做packing,或者叫 SIMD 编码。 single instruction multiple data,