引言
可搜索加密执行密文检索,允许用户节省解密查询的计算量,主要分为 SSE 对称可搜索加密和 ASE 非对称可搜索加密。可搜索加密的流程:数据所有者加密数据发送给服务器->数据使用者用密钥给搜索关键词生成陷门发送给服务器->服务器根据密文索引搜索陷门并将符合查询条件的密文发给数据使用者->数据使用者拿到密文并解密使用。
加密数据并生成索引
加密算法依赖于字段类型和自选计算模式,如果不需要进行密文计算,采用 SM4 加密,如果需要密文计算,采用同态加密,String 类型使用 BFV 算法,Date 类型单独做了一种加密,数值类型使用 CKKS 算法,其他类型仍然使用 SM4 加密。
生成全等查询索引,算法细节略:
/**
* iv random 产生的指定长度的 byte[]
* key 根据数据加密密钥、数据唯一id、列名推演的子密钥
* message 包含加密参数和待加密数据
*/
public byte[] generateIndex(byte[] iv, byte[] key, byte[] message) throws CryptoException {
// 检查参数合法性
// h(m)\cdot K1
// h(m) K1 \cdot G
// ignore 04
// 𝐻(_𝐾_2_,𝐼𝑉)
// 𝐻(𝐻(𝑔^(ℎ_𝑚)⋅_𝐾_1__前半部分,_𝐾_3__,𝐻(_𝐾_2_,𝐼𝑉))
// two part xor
}
生成模糊查询索引,算法细节略:
public byte[] generateOneCellLikeSearchIndex(byte[] tableName, byte[] columnName, byte[] key, byte[] iv, List<byte[]> cellWords) throws
CryptoWithErrCodeException {
// 检查参数合法性
// 推出cell的密钥
// 分情况讨论:字符串长度小于/大于等于 numSearchIndexNum
// 并行生成 Bloom 可能位置
// 插入bloom:先构建一个不包含重复成员的set,然后构建 pos
}
搜索关键词生成陷门
全等查询:
public boolean equals(String ciphertext, Object plainData) throws Exception {
// 检查参数合法性
// 拼 request 调用服务器生成 bloom index
}
模糊查询生成陷门方法同生成索引方法。
根据密文索引搜索陷门
全等查询:
public boolean isMatch(byte[] trapdoor, byte[] iv, byte[] index) throws CryptoException {
// 检查参数合法性
// 数据准备
// 计算 _𝑔_ℎ_𝑚_⋅_𝐾_1__前半部分⊕索引前半部分=𝐻(_𝐾_2_,𝐼𝑉)
// 推演索引,xor 运算,equal 判断
}
模糊查询是对 bloom.contains 的判断。
总结
综上,使用 SSE 算法作为理论基础的全等/模糊密文查询方法,能够通过对索引的查询,避免解密数据带来的计算开销,保护数据隐私安全。