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解密
即可。