当前位置: 首页 > article >正文

基于Benes网络的SIMD同态密文任意重排

摘要

RLWE的密文使用了SIMD后极大的增加的同态加密的效率。同态加密通过加密一个向量,实现对明文的快速加法和乘法。然而,加密为一个密文的向量的内部元素之间,无法高效的操作。
如一个密文加密了 [ a , b , c ] [a,b,c] [a,b,c],想要计算 a + b a+b a+b并不是简单的。同态密文的重排指的是,在密文域将加密为同一个密文的向量进行置换重排。本文介绍Gentry等人在2012年提出的,基于Benes网络的明文重排方法。

同态加密的基本操作

基于RLWE的同态加密方案通常加密一整个向量,从而使得均摊的加密和运算时间大大降低,实现单指令多数据(SIMD)的加密。然而,加密一个向量使得向量内部元素的操作不灵活。于是,研究者们通过利用自同态和密文转化技术,提出了同态密文的旋转操作,增加了SIMD密文的灵活性。下面介绍基于RLWE的同态加密方案的基本运算。

SIMD向量加密

假设向量为 a = [ a 1 , a 2 , ⋯   , a n ] \mathbf{a}=[a_1,a_2,\cdots,a_n] a=[a1,a2,,an]表示 n n n维的向量, a i a_i ai表示其第 i i i个元素。

SIMD的密文,通常是将 a \mathbf{a} a作为一整个明文,加密为一个密文。我们使用 A \mathbf{A} A表示向量 a \mathbf{a} a的密文。同时,我们也说 A \mathbf{A} A有 n 个槽 (slot),第 i i i个槽中加密的数据为 a i a_i ai.

则同态加法得到的密文 A + B \mathbf{A}+\mathbf{B} A+B表示向量 [ a 1 + b 1 , a 2 + b 2 , ⋯   , a n + b n ] [a_1+b_1,a_2+b_2,\cdots,a_n+b_n] [a1+b1,a2+b2,,an+bn]的密文。

同态乘法得到的密文 A × B \mathbf{A}\times \mathbf{B} A×B则表示 [ a 1 × b 1 , a 2 × b 2 , ⋯   , a n × b n ] [a_1\times b_1,a_2\times b_2, \cdots, a_n \times b_n] [a1×b1,a2×b2,,an×bn]的密文。

旋转

SIMD的密文相对于其他的密文,多了一个旋转操作。通常说的旋转是指的向左循环旋转。比如密文 A \mathbf{A} A向左旋转 k k k 步,则结果为 [ a k + 1 , ⋯   , a n , a 1 , a 2 , ⋯   , a k ] [a_{k+1},\cdots,a_n,a_1,a_2,\cdots,a_k] [ak+1,,an,a1,a2,,ak].

向右旋转 k k k 步,也称为向左旋转 − k -k k 步。

提取

我们通过 0,1 掩膜向量和密文的乘积来提取出特定槽的密文。比如可以通过将 A \mathbf{A} A乘以 [ 0 , 0 , 1 , 0 , ⋯   , 0 , 1 ] [0,0,1,0,\cdots,0,1] [0,0,1,0,,0,1](即第3个和第 n n n个为1,其他全为0的明文向量),提取出 a 3 a_3 a3 a n a_n an的密文。

这里乘的密文向量,可以叫做选择向量。被选择的维度为1,其他维度为0的明文向量,可以根据需要提取出需要的密文。

基于Benes网络的SIMD密文重排

我在https://blog.csdn.net/watqw/article/details/142356306 中给出了如何利用Benes进行置换重排的方法。

构建一个Benes网络,根据需要重排的目标位置填充路由信息,然后使用同态加密的基本操作实现Benes交换网络。

每一层的交换,只需要常数次的旋转、提取和加法,就可以完成。

假设原来密文中的明文为 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] [1,2,3,4,5,6,7,8] [1,2,3,4,5,6,7,8],需要将其重排为向量 [ 2 , 6 , 5 , 8 , 4 , 7 , 1 , 3 ] [2,6,5,8,4,7,1,3] [2,6,5,8,4,7,1,3]的密文。

下图是一个已经填好路由信息的Benes网络。
路由信息
我们以第一次交换为例子,说明如何进行密文交换。

假设原始密文为 C 0 1 \mathbf{C_0^1} C01,其明文为 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] [1,2,3,4,5,6,7,8] [1,2,3,4,5,6,7,8].

C 0 1 \mathbf{C_0^1} C01向左旋转4步,得到 C 1 1 \mathbf{C_1^1} C11,其明文为 [ 4 , 5 , 6 , 7 , 8 , 1 , 2 , 3 , 4 ] [4,5,6,7,8,1,2,3,4] [4,5,6,7,8,1,2,3,4]

KaTeX parse error: Expected 'EOF', got '}' at position 14: \mathbf[C_0^1}̲向右旋转4步,得到 C 2 1 \mathbf{C_2^1} C21,其明文为 [ 4 , 5 , 6 , 7 , 8 , 1 , 2 , 3 , 4 ] [4,5,6,7,8,1,2,3,4] [4,5,6,7,8,1,2,3,4]。注意,这里由于周期是8,所以 C 1 1 \mathbf{C_1^1} C11 C 2 1 \mathbf{C_2^1} C21的明文是相等的。

然后,根据路由信息,构造选择向量

C 0 1 \mathbf{C_0^1} C01的选择向量为 a 0 1 = [ 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 ] \mathbf{a}^1_0=[0,1,0,0,0,1,0,0] a01=[0,1,0,0,0,1,0,0]. 位置没有变化的维度为1,其他维度为0.

C 1 1 \mathbf{C_1^1} C11的选择向量为 a 1 1 = [ 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 ] \mathbf{a}^1_1=[1,0,1,1,0,0,0,0] a11=[1,0,1,1,0,0,0,0]. 向上交换的维度为1,其他为0.

C 2 1 \mathbf{C_2^1} C21的选择向量为 a 2 1 = [ 0 , 0 , 0 , 0 , 1 , 0 , 1 , 1 ] \mathbf{a}^1_2=[0,0,0,0,1,0,1,1] a21=[0,0,0,0,1,0,1,1]. 向下交换的维度为1,其他为0.

然后计算 C 0 2 = C 0 1 × a 0 1 + C 1 1 × a 1 1 + C 2 1 × a 2 1 \mathbf{C_0^2}=\mathbf{C_0^1}\times \mathbf{a}^1_0+ \mathbf{C_1^1}\times \mathbf{a}^1_1+ \mathbf{C_2^1}\times \mathbf{a}^1_2 C02=C01×a01+C11×a11+C21×a21.

每一层的计算开销都是一样的,需要2次旋转,3次乘法和2次加法。

由Benes网络的特性,只需要 2 log ⁡ ( n ) − 1 2\log(n)-1 2log(n)1层的交换,就可以得到任意重排后的密文。

参考文献

[1] Gentry, Craig, Shai Halevi, and Nigel P. Smart. “Fully homomorphic encryption with polylog overhead.” Annual International Conference on the Theory and Applications of Cryptographic Techniques. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012.


http://www.kler.cn/news/312582.html

相关文章:

  • HarmonyOS NEXT应用开发案例实践总结合集
  • 【C++笔记】类和对象的深入理解(三)
  • 练习题 - Django 4.x Overviewses 框架概述
  • 1. TypeScript基本语法
  • LangChain 和 Elasticsearch 加速构建 AI 检索代理
  • 练习题 - Django 4.x Models Relationship fields 字段关联关
  • 等保测评中的关键技术挑战与应对策略
  • three.js shader 实现天空中白云
  • 用 Docker 部署 Seafile 社区版
  • C++学习指南(六)----list
  • 【docker】阿里云使用docker,2024各种采坑
  • 【笔记】扩散模型(八):DALL-E 2 (unCLIP) 论文解读与代码实现
  • C++设计模式——Interpreter解释器模式
  • 科技修复记忆:轻松几步,旧照变清晰
  • Android mmap分析
  • Linux进阶命令-scp
  • k8s快速搭建+prometheus部署及使用(纯干货!!!)
  • 基于正点原子Linux开发板的智能监控与家电控制系统设计:深度解析Video4Linux和TCP/IP技术栈
  • android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
  • Web开发:Thymeleaf模板引擎
  • Redis系列之底层数据结构SDS
  • 编程技巧:SQL 处理超大查询
  • 对商品分类系统的若干问题的思考
  • 【Linux】程序地址空间
  • 数据库函数
  • C++_CH18_构造函数与析构函数
  • Java优先级队列PriorityQueue
  • 大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍
  • 将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布
  • 【深度学习】注意力机制介绍,了解什么是注意力计算规则以及常见的计算规则,知道注意力机制的工作流程