SWP
方案来自于D.Song等人的Practical Techniques for Searches on Encrypted Data,为一种对称可搜索加密方案。
实现代码已经在Github上开源,能力有限,代码可能很丑。
-
总体思路
- 将数据划分成一个个的单词,对其进行对称加密并设置陷门后上传。查询时也会对关键词进行加密处理,防止关键词内容的泄露。整个实现过程由几个主要步骤组成(不分先后顺序):DES加密与解密,伪随机序列的生成,带密钥的Hash函数。
- DES加密解密:在openssl库函数的基础上实现。
- 伪随机序列:使用C++标准库中伪随机函数来近似生成。
- 带密钥的Hash函数:在openssl库函数的基础上实现。
- 将数据划分成一个个的单词,对其进行对称加密并设置陷门后上传。查询时也会对关键词进行加密处理,防止关键词内容的泄露。整个实现过程由几个主要步骤组成(不分先后顺序):DES加密与解密,伪随机序列的生成,带密钥的Hash函数。
-
加密过程
将数据划分为一个个的单词,记为(默认长度不超过20个字符,长度不足则零填充补齐)。
使用ECB模式的
DES加密
对其进行加密处理得到(长度为24个字符,由openssl库函数实现),其密钥表示为(长度为24个字符,保密)。
将划分为左右两部分——(长度为8个字符)和(长度为16个字符)。
使用
带密钥的hash函数H1
对进行加密,以为固定密钥(长度为24个字符,保密),得到新的密钥(长度为16个字符)。
使用
伪随机函数Random
,输入随机种子,来得到伪随机序列(长度为8个字符,本实现中随机种子为<key-value>键值对的键值,该伪随机序列的生成过程保密)。
使用
带密钥的hash函数H2
对进行加密,以为密钥,得到(长度为16个字符,本实现中该步骤与前面的步骤使用了同一个hash函数,但密钥不同)。
将与拼接得到(正好是24个字符的长度)。
最终将与异或得到最后的密文,上传至不可信服务器。
-
检索过程
客户端需要把要查询关键词对应的和告知服务器来进行检索,生成方式与加密过程相同。
服务器得到和后,先计算和异或得到。
将划分为和。
使用
带密钥的hash函数H2
对进行加密,以为密钥,将结果与比较,相同则检索成功。
-
解密过程
先使用
伪随机函数Random
,输入随机种子,来得到伪随机序列。将划分为和,将划分为和。
和异或得到。
使用
带密钥的hash函数H1
对进行加密,以为密钥,得到新的密钥。使用
带密钥的hash函数H2
对进行加密,以为密钥,得到。将与异或得到。
拼接与得到,使用
DES解密
即可。