本方案基于Wang的论文实现,在部署实践中,将方案内容分为4个实体,其中包括两个服务实体dataServer、keyServer以及两个客户端实体dataClient、queryClient。方案中dataClient利用同态加密的方法将获取到的位置数据加密外包给dataServer,通过dataServer和keyServer的协作运算实现密文下的queryClient安全查询。
- 建议使用Intellij配置运行,项目使用Maven管理
- jdk版本17
- 依赖库
Jackson,导入依赖后再运行 - 本方案部署的接口测试依据交付件中北邮给出的前端示例进行
- 实体运行顺序
dataServer: 对应论文S1keyServer: 对应论文S2dataClient: 对应论文DataOwnerqueryClient: 对应论文Query User
- 实体对应端口号,运行前请确认端口号未被占用
dataServer:16789keyServer:26789dataClient:36789queryClient:46789
- 按顺序运行上述实体后,默认执行的操作如下(其它操作需要手动发送Get请求执行)
dataClient初始化四叉树参数和默认构造的位置数据点dataClient将加密四叉树构建参数发送给dataServer,dataServer构建密文四叉树
- 接下来手动执行一些请求完成方案流程及接口测试,接口测试已经由Postman导出,自行导入并依序进行测试,注意在未理解方案流程和接口含义的情况下务必按照给出的顺序调用接口,以免请求结果无意义或出现请求错误
- Postman文件已在交付件中给出,请自行导入后,按下方顺序测试并运行接口(速览地址:LocationSearch)
- dataClient
- 获取四叉树高度:
/get/treeHeight - 获取位置点数据:
/get/LocationNum - 获取明文位置信息列表:
/get/plaintextPointInfo - 获取密文位置信息列表:
/get/ciphertextPointInfo - 发送位置数据(发送至dataServer,插入数据后方可查询):
/get/sendData
- 获取四叉树高度:
- dataServer
- 获取接收到的密文位置数据列表:
/locationData - 获取协作交互信息:
/get/log
- 获取接收到的密文位置数据列表:
- queryClient
- 获取多边形边数:
/get/queryEdgeNum - 发送查询请求:
/get/sendQuery - 获取有无筛选配置项:
/get/queryFilter - 获取查询时间:
/get/queryTime - 获取查询结果:
/get/queryResult
- 获取多边形边数:
- keyServer
- 获取协作交互信息:
/get/log - 获取加扰后的解密查询结果(此接口北邮前端样例并未使用,仅在此提供接口,是否使用自便):
/get/resultAddRnd
- 获取协作交互信息:
- 所有POST接口都由服务自行请求,因此无需管理测试
- 所有GET接口都不携带参数
- 纯数字
响应样例:
8
- 纯数字
响应样例:
21
- 列表返回
响应样例:
[{"id":"0","x1":"4307646","y1":"4347144","x1_":"-4307646","y1_":"-4347144"},{"id":"1","x1":"4296508","y1":"4378469","x1_":"-4296508","y1_":"-4378469"},{"id":"2","x1":"4253315","y1":"4330260","x1_":"-4253315","y1_":"-4330260"},{"id":"18","x1":"4266150","y1":"4354976","x1_":"-4266150","y1_":"-4354976"},{"id":"19","x1":"4247136","y1":"4388590","x1_":"-4247136","y1_":"-4388590"},{"id":"999999999","x1":"4255500","y1":"4325500","x1_":"-4255500","y1_":"-4325500"}]- 密文列表信息由于数据量过大因此不做展示,但是其返回数据结构和明文位置信息列表保持一致,仅仅是加密后在数值上变为了超大的整数字符串,列表返回
响应示例:
# ...仅表示省略,并不代表真实返回值
[{"id":"...","x1":"...","y1":"...","x1_":"...","y1_":"..."}
...
{{"id":"...","x1":"...","y1":"...","x1_":"...","y1_":"..."}}]
响应示例:
# 此响应结果内容并无任何用处,只要请求成果即可
{
"status": "success",
"message": "Data successfully sent and processed."
}- 密文列表信息由于数据量过大因此不做展示,但是其返回数据结构和
dataClient获取密文信息接口保持一致,仅仅是加密后在数值上变为了超大的整数字符串,列表返回
响应示例:
# ...仅表示省略,并不代表真实返回值
[{"id":"...","x1":"...","y1":"...","x1_":"...","y1_":"..."}
...
{{"id":"...","x1":"...","y1":"...","x1_":"...","y1_":"..."}}]
- 所有
dataServer中的日志都会被保存为一个字符串列表返回,键值为"allLog"
响应示例:
{"allLog":["接收SHE算法参数:","k0: 1024, k1: 40, k2: 450, k3: 80","p: 17678, q: 55038, l: 25074, N: 97299","E0_1: 61972, E0_2: 16663","SHE同态加密算法参数初始化完成","接收四叉树参数","num: 128","sx1: 74499..., sy1: 44346..., -sx1: 65676..., -sy1: 49623..., -sx2: 43655..., -sy2: 74500..., MINSIZE: 89758...","四叉树参数初始化完成","要插入的位置点信息","index: [0, 3, 2, 2, 1, 2, 3]","id: 89566..., x1: 97057..., y1: 41984..., -x1: 57447..., -y1: 75037...","位置点插入成功","要插入的位置点信息","index: [0, 0, 0, 0, 1, 3, 2]","id: 96935..., x1: 79604..., y1: 97169..., -x1: 37632..., -y1: 69391...","位置点插入成功","要插入的位置点信息","index: [2, 2, 1, 2, 3, 0, 0]","id: 40165..., x1: 43540..., y1: 87396..., -x1: 11401..., -y1: 68263...","位置点插入成功","接收到密文位置信息请求","成功返回密文位置信息","接收到日志请求"]}- 所有
keyServer中的日志都会被保存为一个字符串列表返回,键值为"allLog"
响应示例:
{"allLog":["接收待进行乘法协作计算的参数","完成乘法协作","密文(34416... ,12262...) ===> 明文(949445798)","接收待进行乘法协作计算的参数","完成乘法协作","密文(48026... ,12317...) ===> 明文(416227270)","完成比较协作","接收待进行比较协作计算的参数","密文(19654...) ===> 明文(286250554)","完成比较协作","接收待解密的参数","完成解密","接收到获取加扰查询结果请求","成功返回加扰查询结果","接收到日志请求","成功返回日志","接收到获取加扰查询结果请求","成功返回加扰查询结果","接收到日志请求","成功返回日志","接收到获取加扰查询结果请求","成功返回加扰查询结果","接收到日志请求"]}- 作为列表返回,键值为"resultAddRnd"
响应示例:
{"resultAddRnd":[{"id":"1000000151","x1":"4256191","y1":"4325975","x1_":"-4255260","y1_":"-4324572"}]}- 纯数值
响应示例:
6
响应示例:
{
"status": "success",
"message": "Data successfully sent and processed."
}- 布尔值的字符串形式或者空字符串
响应示例:
"true"
""
- 时间结果字符串或者空字符串
响应示例:
"2113.0 ms"
""
- 结果列表
响应示例:
[{"id":"999999999","x1":"4255500","y1":"4325500","x1_":"-4255500","y1_":"-4325500"}]