同态加密原理解析

news2024/11/26 20:42:16

目录

  • 1.数学介绍
  • 2.使用多项式环进行加密
    • 2.1 私钥和公钥的产生
    • 2.2 加密
    • 2.3 解密
  • 3.同态计算
    • 3.1 同态加法
    • 3.2 同态乘法

1.数学介绍

同态加密方案基于一个难以计算的问题Ring Learning with Errorsred。这些方案中的数据在加密和未加密时都用多项式表示。

这里举一个简单的多项式: 4 x 2 + 2 x + 1 4x^2+2x+1 4x2+2x+1 注意,其中的系数都是整数并且每个系数都会 m o d   t mod \ t mod t。 假设 t = 24 t=24 t=24 ,如下图所示 21 + 6 = 3   m o d   24 21+6= 3 \ mod \ 24 21+6=3 mod 24
在这里插入图片描述
或者我们可以将范围变为 [ − 11 , 12 ] [-11,12] [11,12],这样方便我们取负数。

在这里插入图片描述
我们定义了一个特殊的多项式,称为多项式模数,并且只考虑多项式在被这个多项式模数除后的余数。在FV方案中,这个多项式模数的具体形式是 x d + 1 x^d+1 xd+1,其中 d = 2 n d=2^n d=2n n n n为某个整数。这里我们举例说明取 n = 4 n=4 n=4,因此这个多项式是 x 16 + 1 x^{16}+1 x16+1

因为我们只考虑关于 x 16 + 1 x^{16}+1 x16+1后的余数,所以余数的中的多项式取值范围便为 [ x 0 , x 15 ] [x^0,x^{15}] [x0x15],下面便是我们需要考虑的余数: a 15 x 15 + a 14 x 14 + a 13 x 13 + a 12 x 12 + a 11 x 11 + a 10 x 10 + a 9 x 9 + a 8 x 8 + a 7 x 7 + a 6 x 6 + a 5 x 5 + a 4 x 4 + a 3 x 3 + a 2 x 2 + a 1 x 1 + a 0 a_{15}x^{15}+a_{14}x^{14}+a_{13}x^{13}+a_{12}x^{12}+a_{11}x^{11}+a_{10}x^{10}+a_{9}x^{9}+a_{8}x^{8}+a_{7}x^{7}+a_{6}x^{6}+a_{5}x^{5}+a_{4}x^{4}+a_{3}x^{3}+a_{2}x^{2}+a_{1}x^{1}+a_{0} a15x15+a14x14+a13x13+a12x12+a11x11+a10x10+a9x9+a8x8+a7x7+a6x6+a5x5+a4x4+a3x3+a2x2+a1x1+a0
其中系数 a i a_i ai的取值范围为 { 0 , t − 1 } \{0,t-1\} {0,t1},也就是说这里面的每个系数都会被 m o d   t mod \ t mod t,我们可以用系数环面来说明,如下所示:
在这里插入图片描述在该图中每个环代表一个 x i x^i xi可以拥有24种系数的中一个。绿点代表系数为0。

假设当我们让 2 x 14 a n d   x 4 2x^{14} and\ x^4 2x14and x4 相乘,同时 m o d   x 16 + 1 mod \ x^{16}+1 mod x16+1,将这个项(如下图中的红点所示)向前绕着环体旋转4个幂次,然后将值反射到0点的另一侧,变成了 22 x 2 22x^2 22x2。这个只是为了直观展示,方便后面的讲解,当然你也可以使用多项式除法进行计算,结果相同。
在这里插入图片描述

2.使用多项式环进行加密

2.1 私钥和公钥的产生

我们首先定义 d = 16 , t = 7 , q = 874 d=16,t=7,q=874 d=16,t=7,q=874,那么多项式的模便为 x 16 + 1 x^{16}+1 x16+1

对于密钥或者私钥 s s s,我们产生一个系数为 { − 1 , 0 , 1 } \{-1,0,1\} {1,0,1}中的一个的随机多项式: s = x 15 − x 13 − x 12 − x 11 − x 9 + x 8 + x 6 − x 4 + x 2 + x − 1 s=x^{15}-x^{13}-x^{12}-x^{11}-x^9+x^8+x^6-x^4+x^2+x-1 s=x15x13x12x11x9+x8+x6x4+x2+x1

接下来我们产生一个公钥,使用密文空间中的随机多项式,其中系数 m o d   q mod \ q mod q a = 42 x 15 − 256 x 14 − 393 x 13 − 229 x 12 + 447 x 11 − 369 x 10 − 212 x 9 + 107 x 8 + 52 x 7 + 70 x 6 − 138 x 5 + 322 x 4 + 186 x 3 − 282 x 2 − 60 x + 84 a=42x^{15}-256x^{14}-393x^{13}-229x^{12}+447x^{11}-369x^{10}-212x^9+107x^8+52x^7+70x^6-138x^5+322x^4+186x^3-282x^2-60x+84 a=42x15256x14393x13229x12+447x11369x10212x9+107x8+52x7+70x6138x5+322x4+186x3282x260x+84

我们还定义了一个误差多项式,从离散高斯分布中提取出的“小”系数。这个多项式在这里只使用一次,然后被丢弃。 e = − 3 x 15 + x 14 + x 13 + 7 x 12 − 6 x 11 − 6 x 10 + x 9 + 4 x 8 − x 6 + 3 x 5 − 4 x 4 + 4 x 3 + 4 x + 1 e=-3x^{15}+x^{14}+x^{13}+7x^{12}-6x^{11}-6x^{10}+x^9+4x^8-x^6+3x^5-4x^4+4x^3+4x+1 e=3x15+x14+x13+7x126x116x10+x9+4x8x6+3x54x4+4x3+4x+1

公钥是由一对多项式组成 p k = ( [ − a s + e ] q , a ) pk=([-as+e]_q,a) pk=([as+e]q,a),多项式算术取多项式的模,系数算术取 q q q的模。

下面举一个例子,公钥的第一个多项式将这样构建

在这里插入图片描述

p k 0 = − 285 x 15 − 431 x 14 − 32 x 13 + 86 x 12 − 83 x 11 − 14 2 10 − 41 x 9 + 430 x 8 + 26 x 7 − 158 x 6 − 281 x 5 + 377 x 4 + 110 x 3 − 234 x 2 − 113 x + 252 pk_0=-285x^{15}-431x^{14}-32x^{13}+86x^{12}-83x^{11}-142^{10}-41x^9+430x^8+26x^7-158x^6-281x^5+377x^4+110x^3-234x^2-113x+252 pk0=285x15431x1432x13+86x1283x111421041x9+430x8+26x7158x6281x5+377x4+110x3234x2113x+252

系数取值范围为 { 0 , q − 1 } \{0,q-1\} {0,q1}的多项式 a a a ,与系数取值范围为 { − 1 , 0 , 1 } \{-1,0,1\} {1,0,1}的多项式 s s s 相乘,由于多项式乘法相对于多项式模数的“旋转和反射”特性,这有效地混合和打乱了 a a a 的所有系数,并且还进一步添加了小误差项 e e e 。多项式 a a a 有效地掩盖了公钥中的私钥 s s s

2.2 加密

加密便是将一个多项式且其系数 m o d   t mod \ t mod t 的明文,将它转化为一对系数 m o d   q mod \ q mod q 的多项式。这里我们举一个例子: m = 3 + 4 x 8 = 3 − 3 x 8   m o d   7 m=3+4x^8=3-3x^8 \ mod \ 7 m=3+4x8=33x8 mod 7

加密需要三个小多项式。两个误差多项式取自与公钥误差多项式相同的离散高斯分布,另一个多项式我们称之为 u u u ,它的系数为 { − 1 , 0 , 1 } \{-1,0,1\} {1,0,1},就像私钥一样。

在这里插入图片描述

密文由两个经计算后的多项式表示:

c t = ( [ p k 0 u + e 1 + q m / t ] q , [ p l 1 u + e 2 ] q ) ct=([pk_0u+e_1+qm/t]_q,[pl_1u+e_2]_q) ct=([pk0u+e1+qm/t]q,[pl1u+e2]q)
消息 m m m 是在模 t t t 的范围,给它乘上 q t \frac{q}{t} tq 将它的范围缩放到模 q q q 上,再加上噪声与掩码。

在这里插入图片描述
c t 0 ct_0 ct0, c t 1 ct_1 ct1的计算结果如下,大家没事可以动手算一下。

在这里插入图片描述
在这里插入图片描述
总之一个密文可以由公钥,私钥,掩码,噪声,消息表示为:

在这里插入图片描述

2.3 解密

我们首先通过计算 [ c t 0 + c t 1 s ] q [ct_0+ct_1s]_q [ct0+ct1s]q从消息中完全删除掩码。将计算结果扩展得 [ q m / t + e 1 + e u + e 2 s ] q [qm/t+e_1+eu+e_2s]_q [qm/t+e1+eu+e2s]q,可以看到其中包含缩放后的消息和一些噪声,只要噪声不太大我们便可以通过舍入恢复消息。

在这里插入图片描述具体来说

在这里插入图片描述
我们将该多项式重新缩放到模 t t t 上,也就是乘上 t q \frac{t}{q} qt

在这里插入图片描述
四舍五入这些系数便可以恢复我们的消息: m = 3 − 3 x 8 m=3-3x^8 m=33x8

我们用下图 来进行说明:在缩放到最接近的整数后,我们将近似系数四舍五入,从而得到我们的信息:在这里插入图片描述总之,我们通过下式来计算解密结果: m ′ = [ ⌊ t q [ c t 0 + c t 1 s ] q ⌉ ] t m^{'}=[\lfloor \frac{t}{q}[ct_0+ct_1s]_q \rceil]_t m=[⌊qt[ct0+ct1s]q]t其中 ⌊ ⌉ \lfloor \rceil 表示取整最接近的整数。

3.同态计算

3.1 同态加法

假设我们有两个多项式 m 1 a n d   m 2 m_1 and \ m_2 m1and m2,它们使用相同的公钥加密: a = ( [ p k 0 u 1 + e 1 + q m 1 / t ] q , [ p k 1 u 1 + e 2 ] q ) a=([pk_0u_1+e_1+qm_1/t]_q,[pk_1u_1+e_2]_q) a=([pk0u1+e1+qm1/t]q,[pk1u1+e2]q) b = ( [ p k 0 u 2 + e 3 + q m 2 / t ] q , [ p k 1 u 2 + e 4 ] q ) b=([pk_0u_2+e_3+qm_2/t]_q,[pk_1u_2+e_4]_q) b=([pk0u2+e3+qm2/t]q,[pk1u2+e4]q)我们将a,b相加得到c: c = ( [ p k 0 u 3 + e 5 + q ( m 1 + m 2 ) / t ] q , [ p k 1 u 3 + e 6 ] q ) c=([pk_0u_3+e_5+q(m_1+m_2)/t]_q,[pk_1u_3+e_6]_q) c=([pk0u3+e5+q(m1+m2)/t]q,[pk1u3+e6]q)缩放之前的解密: [ q ( m 1 + m 2 ) / t + e 5 + e u 3 + e 6 s ] q [q(m_1+m_2)/t+e_5+eu_3+e_6s]_q [q(m1+m2)/t+e5+eu3+e6s]q只要最后的噪声不太大,在缩放后被舍入掉,便可以得到正确的解密结果。

3.2 同态乘法

首先我们根据同态的解密公式得: [ c t 0 + c t 1 s 1 ] q [ct_0+ct_1s^1]_q [ct0+ct1s1]q注意:这个方程是一个多项式 ( c t 0 ) (ct_0) (ct0)乘以1( s 0 s^0 s0)加上一个多项式 ( c t 1 ) (ct_1) (ct1)乘以另一个多项式 ( s 1 ) (s^1) (s1),然后对 x d + 1 x^d+1 xd+1 取模,对 q q q 取模。

现在,我们在上面看到解密产生了一个独立于掩码项 a u au au 的量 n o i s e noise noise [ c t 0 + c t 1 s 1 ] q → t q m + n o i s e [ct_0+ct_1s^1]_q \rightarrow \frac{t}{q}m+noise [ct0+ct1s1]qqtm+noise
我们现在考虑两个多项式 m 1 a n d   m 2 m_1 and \ m_2 m1and m2 使用相同的公钥加密: [ a 0 + a 1 s 1 ] q → t q m 1 + n 1 [a_0+a_1s^1]_q \rightarrow \frac{t}{q}m_1+n_1 [a0+a1s1]qqtm1+n1 [ b 0 + 1 s 1 ] q → t q m 2 + n 2 [b_0+_1s^1]_q \rightarrow \frac{t}{q}m_2+n_2 [b0+1s1]qqtm2+n2
如果我们取它们的乘积,我们有: [ a 0 + a 1 s 1 ] q [ b 0 + 1 s 1 ] q → ( t q m 1 + n 1 ) ( t q m 2 + n 2 ) [a_0+a_1s^1]_q[b_0+_1s^1]_q \rightarrow (\frac{t}{q}m_1+n_1)(\frac{t}{q}m_2+n_2) [a0+a1s1]q[b0+1s1]q(qtm1+n1)(qtm2+n2)
我们将左边展开: m u l t ( a , b ) = c 0 + c 1 s + c 2 s 2 mult(a,b)=c_0+c_1s+c_2s^2 mult(a,b)=c0+c1s+c2s2其中 c 0 = [ t q a 0 b 0 ] q c_0=[\frac{t}{q}a_0b_0]_q c0=[qta0b0]q c 1 = [ t q ( a 1 b 0 + a 0 b 1 ) ] q c_1=[\frac{t}{q}(a_1b_0+a_0b_1)]_q c1=[qt(a1b0+a0b1)]q c 2 = [ t q a 1 b 1 ] q c_2=[\frac{t}{q}a_1b_1]_q c2=[qta1b1]q
最后的公式应该为: m u l t ( a , b ) = [ ⌊ t q [ c 0 + c 1 s + c 2 s 2 ] ⌉ ] t mult(a,b)=[\lfloor \frac{t}{q}[c_0+c_1s+c_2s^2]\rceil]_t mult(a,b)=[⌊qt[c0+c1s+c2s2]⌉]t

英文链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1625790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版 土堆教程

最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 CPU GPU 版 | 土堆教程 Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版 教程大纲如何使用此教程快速开始版本 Windows下判断有无NVIDIA GPU安装Anaconda作用流程下载安装 Anaconda 创建虚拟环境利用conda或者…

jmeter安装和简单使用

jmeter安装和简单使用 1. 安装 jmeter是基于Java开发的测试应用,其运行依赖于java环境,所以在下载运行jmeter前,先确保本机已经安装jdk或者jre,安装jdk步骤此处不描述。 下载jmeter: jmeter是Apache旗下的产品&…

电阻理论基础

电流的形成是电荷运动,电子方向相反,标量 电压:电势有参考点,是一个相对量 电阻的值不取决于电压和电流的, Ra表示标准电阻 R表示任意温度的电阻

数据结构:时间复杂度和空间复杂度

目录 1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例 3.空间复杂度 1. 如何衡量一个算法的好坏 下面求斐波那契数列的算法好还是不好,为什么?该如何衡量一个算…

新书推荐机器学习大数据平台的构建、任务实现与数据治理

在大数据与机器学习日新月异的今天,构建稳定、安全、可扩展的数据平台已成为企业和研究机构的迫切需求。这本书应运而生,提供了详尽且实用的指南,帮助读者在云计算环境中构建、优化和治理大数据平台。 作者以清晰明了的写作风格,…

实现基于UDS LIN诊断协议的本地OTA升级

一、目标 在上篇文章LIN诊断实现MCU本地OTA升级_lin ota-CSDN博客中已经基于LIN诊断协议实现了通过PC端上位机对MCU进行本地的OTA升级,但是没有完全按照UDS协议实现。本篇将在上篇文章的基础上进行改进,实现基于UDS LIN诊断协议的本地OTA升级。本篇文章对…

C语言 | Leetcode C语言题解之第52题N皇后II

题目: 题解: struct hashTable {int key;UT_hash_handle hh; };struct hashTable* find(struct hashTable** hashtable, int ikey) {struct hashTable* tmp NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);return tmp; }void insert(struct hashTabl…

nvm 使用教程

在任意目录中的空白处 按住Shift键不放,鼠标点击右键,在弹出的菜单中选择 “在此处打开 Powershell 窗口(S)”。 查看远程线上的nodejs版本 nvm ls available 查看自己安装的nodejs版本 nvm ls 切换nodejs版本号 nvm use 版本号 安装 xxx版本的nodej…

浅谈游戏机制

浅谈游戏机制 前言什么是游戏机制?机制组成机制类别结语 前言 最近在编写游戏开发文档的时候了解到游戏机制,第一次接触游戏机制的概念难免有些陌生,但感觉又跟常见,在网上查阅浏览了一些资料后了解到游戏机制还不止一个。 现在将…

Linux|Awk 变量、数字表达式和赋值运算符

引言 本部分[1]将深入学习 Awk 的高级应用,以应对更为复杂的文本或字符串过滤任务。将介绍包括变量、数值表达式和赋值运算符在内的 Awk 功能。 这些概念与你之前可能在诸如shell、C、Python等许多编程语言中接触过的概念并没有本质上的不同,所以你不必过…

【RAG 论文】Chain-of-Note:为 RAG 引入 CoT 让模型生成阅读笔记来提高面对噪音文档和未知场景的鲁棒性

论文:Chain-of-Note: Enhancing Robustness in Retrieval-Augmented Language Models ⭐⭐⭐ Tencent AI Lab, arXiv:2311.09210 文章目录 一、论文速读二、实现的细节2.1 Note Design2.2 Data Collection2.3 Model Training 三、实验结果3.1 QA Performance3.2 对 …

Python:解析pyserial串口通讯

简介:串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单&#…

全额退款20000,what?

接单的时候有多兴奋,退单的时候就有多落寞。今天我对客户全额退款了,跟踪了10天的项目正式结束。 这是我接单以来项目单价最高的一个项目,本来不太想接的,因为业务领域不擅长,又想挑战一下。兜兜转转找了几个人因为各种…

Python请求示例电商商品详情数据(API接口开发系列),从入门到实战

在电商系统中,商品详情数据通常通过API接口提供。以下是一个从入门到实战的Python请求示例,展示如何获取电商商品详情数据。 入门篇:理解API接口 首先,你需要了解API(应用程序接口)的基本概念。API允许不…

用Redis实现获取验证码,外加安全策略

安全策略 一小时内只能获取三次,一天内只能获取五次 Redis存储结构 代码展示 import cn.hutool.core.util.RandomUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import org.spri…

JVM学习笔记(五)内存模型

目录 1、原子性 1.1 问题分析 1.2 解决方法 2、可见性 2.1 退不出的循环 2.2 解决办法 3、有序性 3.1 诡异的结果 3.2 解决办法 3.3 有序性理解 3.4 happens-before 4、CAS与原子类 4.1 CAS 4.2 乐观锁与悲观锁 4.3 原子操作类 5、synchronized 优化 5.1 轻量…

鸿蒙入门11-DataPanel组件

数据面板组件 用于将多个数据的占比情况使用 占比图 进行展示 参数 参数形式 : DataPanel( options:{ values: number[], max?: number, type?: DataPanelType } ) 参数名 参数类型 是否必填 默认值 参数描述 values number[] 是 - 数据值列表 最大支持…

Recommended Azure Monitors

General This document describes the recommended Azure monitors which can be implemented in Azure cloud application subscriptions. SMT incident priority mapping The priority “Blocker” is mostly used by Developers to prioritize their tasks and its not a…

zigbee cc2530的室内/矿井等定位系统RSSI原理

1. 定位节点软件设计流程 2. 硬件设计 cc2530 最小系统 3. 上位机 c# 设计上位机,通过串口连接协调器节点,传输数据到pc上位机,显示节点坐标信息 4. 实物效果 需要4个节点,其中一个协调器,两个路由器作为参考节点&a…

1分钟掌握 Python 函数参数

任何编程语言函数都是非常重要的一部分,而在进行函数调用时,了解函数的参数传递方式是非常有必要的。Python中支持哪些传参方式呢? Python中的传参方式是比较灵活的,主要包括以下六种: 按照位置传参按照关键字传参默…