全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时,得出问题的答案。

  

这篇文章的整体结构包括多项式环相关的数学介绍,基于多项式环的加密和解密是如何工作的,同态加法和乘法如何实现的。

原文来源:https://humanata.com/blog/illustrated_primer/#homomorphic-operations,现在已经无法访问。

前言        

        这些全同态加密方案【BFV、BGV、CKKS】都是基于一个称为Ring learning with errors(RLWE)的困难计算问题。

        本质上,这些方案中的数据在加密时(密文)和未加密时(明文)都用多项式表示。如: 4x^2 + 2x + 1

        与我们常学的多项式有一些不同,首先系数都是整数,余数是相对于某个整数 t 的余数(对 t 取模)。假设 t=24 ,那么一个24小时的时钟,21加6小时得到3小时。所有多项式的系数都是这样处理的。

        另外,我们可以将数字的取值范围设为-11到12,以便方便地对数字求反。请注意,这只是一个方便因素—— −1 的余数和23的余数(除以24)没有区别。

        第二个,也是比较棘手的,这些多项式的不同之处是使用余数的想法不仅适用于多项式的系数,也适用于多项式本身。

        我们定义了一个特殊的多项式,称为多项式模,并且只考虑多项式被该多项式模除后的余数。在BFV方案中,这个多项式模的具体形式是 x^d+1 ,其中 d=2^n 。对于一些 ,为了说明问题,我们取 n =4 ,因此多项式为 x^d+1

        因为我们考虑的是关于 x^d+1 的余项,所以我们只需要考虑幂次为 x^0x^{15}的多项式。任何较大的幂都会被多项式模除掉。这也可以通过考虑x^{16} \equiv -1\ (mod\ x^{16}+1)来理解,这意味着x^{16}可以用 −1 代替,以将 x 的较大幂次减少到0到15的范围内。

        我们考虑的所有多项式都是这种形式: 

        其中16个系数 a_i 可以从0到 t−1 。可以用一个由系数组成的环面来说明这一点,如下所示:

        在这个图中,每个环,代表多项式中出现的 的一个幂的24个系数的可能值。绿色的点表示系数0的位置。这为我们提供了一种很好的方式来可视化多项式,这将有助于我们在下面考虑加密和解密步骤的工作原理。

        BFV加密方案涉及大量的多项式乘法运算。当我们将x的两个幂相乘时,例如 2x^{14}x^4 ,我们将它们的指数相加——得到2x^{18} 。有人可能会假设,要找到关于多项式模的多项式余数,可能只需要将指数从 0 旋转到 x^{16},得到 2x^2 ,就像上面所示的整数系数一样。这就是多项式模为 x^d 时的情况。然而,我们的多项式模是 x^d+1 。如上所述,额外的 +1 因子引入了符号变化,这有助于进一步打乱乘法的结果。

        如上所述,将2x^{14} 乘以x^4x^d+1 ,取这一项(由上图的红点表示),围绕环向前旋转4次,通过0点调整系数的值,得到 22x^{2} (或 -2x^{2},如果考虑数值从-12到11而不是0到23)。

首先,2x^{14} 乘以x^4,根据幂运算法则,指数相加,得到 2x^{18}

在模 x^{16}+1 的情况下, x^{18}可写成 x^{16}\cdot x^{2}。又因为 x^d+1 ,所以x^{16}x^d+1 为 -1。

那么x^{18}=x^{16}\cdot x^{2}x^d+1 就变为-1\cdot x^{2}=-x^{2}。而前面的系数2乘以-1得到-2。

如果我们考虑数字从0到23,那么-2等价于22(在模24的情况下),所以结果是22x^{2}。如果我们考虑数字从 -12 到 11,那么结果是-2x^{2}

        这种形式的多项式具有非常丰富的结构和许多优良的性质。它们是分圆多项式的子集。严格来说,将它们中的一个用作多项式模并不是必需的,但这样做可以提供许多便利和加速。

基于多项式环的加解密

        我们已经介绍了用于BFV方案的多项式环的一些性质,现在我们可以讨论其加密和解密的工作原理。首先,我们需要讨论如何生成私钥和公钥,然后讨论如何使用它们进行加密和解密。

公钥和私钥

        加密接收明文,并使用由私钥派生的公钥将其转换为密文,这种从明文到密文的转换只有当你知道私钥的情况下才容易逆转,即从密文还原回明文。

        更具体地说,明文是环上的多项式,其具有多项式模 x^d+1,其中d = 2^n,以及系数模 t。明文加密后为密文,其是由两个环上的、具有相同多项式模的多项式构成的,但系数模为 q,通常 q 远大于 t

        例如,多项式模为 x^{4096} + 1,这意味着明文和密文中的多项式都有 d = 4096 个系数。明文多项式的系数需要模 t = 290764801,密文多项式的系数需要模 q = 9214347247561474048 或更大。

        出于演示目的,我们将使用小得多的数字,但希望这些数字能更好地说明方案的各个步骤中发生了什么。在第一部分中,为了使事情更加直观,我们将使用 d=16, t=7, q=874。注意,这些参数是不安全的!

  • 对于私钥或密钥,我们用 s 表示,它是我们随机生成的一个系数为-1、0或1的多项式。例如:

  • 对于公钥的 pk_1 部分,我们用 a 表示,它是我们从密文空间中随机生成一个多项式,其系数模为q。例如:

  • 误差多项式(噪音),我们用 e 表示,系数很小,来自离散高斯分布。这个多项式在这里使用一次,然后丢弃。例如:

        然后,公钥被定义为一对多项式pk = (pk_0, \ pk_1) = ([-as+e]_q,\ a),其中,多项式运算是求多项式模和系数模 q 的运算。

对于上面给出的示例,公钥的第一个多项式被构造为:

        其中第一个乘法取多项式 a,它的系数来自于对 q 取模的整个范围,然后乘以系数为-1、0或1的 s。由于模上多项式模的多项式的乘法具有“旋转和反射”性质,有效地混合和打乱了 a 的所有系数,并进一步增加了小的噪音。多项式 a 有效地掩盖了公钥中的私钥。

        从公钥破解加密方案基本上需要从 ([-as+e]_q, \ a) 对中计算出 s。唯一的因素是该方案中包含了噪音——如果 e 为零,则很容易从公钥中计算出  s。当 e 足够大,但又不太大时,这是一个难题。

        本文的示例中,私钥可以通过暴力攻击恢复——−尝试每个可能的  s (只有3 ^ 16 = 43046721组合)然后计算 as + e 来寻找出一个接近公钥的第一项的答案。对于真正的参数,这种暴力攻击的方法是完全不可行的。3 ^ 4096 是一个很大的数字,但有更聪明的方法,然后定义给定的一组参数的安全性。

加密

        加密过程看起来有点像公钥生成过程。加密需要一个明文,它是一个系数为模 t 的多项式 ,并将其转换为一对系数为模 q 的多项式。为了说明这一点,我们将加密一个只有两个非零系数的非常简单的多项式消息: m=3+4x^8\equiv 3-3x^8

        加密还需要三个小的多项式。两个误差多项式来自于与公钥误差多项式相同的离散高斯分布,分别为 e_1, e_2,另一个多项式我们称之为 u,它的系数为-1、0或1,就像私钥一样。

        这些多项式只在加密过程中使用,然后丢弃。

        密文由两个多项式表示,计算为: ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)

        请注意消息中的值是在mod t的范围内,而在我们的示例中,它们被缩放为q/t (即128),使它们覆盖mod q的范围。这是消息被插入到密文时的唯一更改。这些值通过添加到第一项来掩盖,第一项的值是在mod q的范围内,与随机的噪音没有区别。u的随机性改变了每次加密中使用的掩码,从而确保相同的明文在每次加密时产生不同的密文。

Note:同态加法和乘法之所以可行,是因为消息仅以缩放的形式存在于密文中。其他项的作用是隐藏消息,并且在只有知道秘密密钥才能移除这些项的情况下,它们在隐藏消息方面被证明是有效的。

        使用上面给出的多项式显式计算密文的第一个元素:

        在密文的第一项中展开公钥,我们看到: ct_0=[e_1+e \cdot u - a\cdot u\cdot s+q \cdot m/t]_q。在这个表达式中,前两项是“小”的,与误差项成比例,后两项是“大”的。第一个大项有效地隐藏了第二个项,也就是明文多项式消息。

        密文的第二个元素是这样计算的:

        在密文的第二个元素中展开公钥,我们可以看到 ct_1=[a \cdot u+e_2]_q 。这展示了解密是如何工作的—如果我们知道 s,我们可以计算 ct_1 \cdot s=[a \cdot u \cdot s+e_2 \cdot s]_q,这可以用来删除密文第一个元素中的非消息大项。

        综上所述,密文可以用公钥、私钥、掩码、噪声和消息表示为:

解密

        如上所述,解密相对简单。首先,我们计算 [ct_0+ct_1 \cdot s]_q ,这将完全从消息中删除掩码。这给了我们一个扩展为 [q\cdot m/t+e_1+e\cdot u+e_2\cdot s]_q 的多项式,即缩放后的信息加上一些噪声项。因此,只要噪声项不是太大,我们就可以恢复消息。

        从图中可以看出,除了两个非零系数( x^8x^0 )外,明文的所有系数都小于q/t=128 。如果我们将这个多项式缩放回对 t 取模的范围,那么我们有:

        四舍五入这些系数恢复我们的消息 m=3-3x^8

        我们通过将近似系数四舍五入后缩放到最接近的整数对应值来获得我们的消息:

绿色-噪音、粉色-近似解

        把这些放在一起,我们通过计算来解密密文:{m}'=[ \left \lfloor q[ct_0+ct_1 \cdot s]_q \right \rceil]_t\left \lfloor \right \rceil 表示舍入到最接近的整数。

        如果系数中噪声太大,那么它们最终会更接近一个与正确整数不同的整数,然后解密将(悄无声息地)失败并产生错误的结果。在上面的例子中,最大的误差是 23/128 ,所以仍然有一些空间允许产生更多的噪音,并且能够正确的解密。可以通过使 q/t比值变大或变小来调整噪声空间净含量。

同态操作

        人们对这类密码体制如此感兴趣的一个主要原因是,它们允许同态加法和乘法(来自希腊语 homo - same,表示"相同" 和 morphe - shape,表示"形态")。这意味着您可以在数字仍然加密的情况下进行加法和乘法运算,而不必先解密。这是一个令人惊叹的功能,有望在数据保护和安全方面构建一个新的黄金标准。

同态加法

        最简单的情况是两个加密数字的相加。假设我们已经用相同的公钥加密了两个多项式 m_1m_2 :

a=([pk_0u_1+e_1+qm_1/t]_q,[pk_1u_1+e_2]_q), \\ b=([pk_0u_2+e_3+qm_2/t]_q,[pk_1u_2+e_4]_q)

        注意,我们需要使用两个不同的小多项式 u_1 和 u_2 ,以及4个小噪声多项式 e_1, e_2, e_3, e_4 来做到这一点。如果我们只是添加相应的密文元素,我们得到一个新的密文:

a+b= \\ ([pk_0(u_1+u_2)+(e_1+e_3)+q(m_1+m_2)/t]_q, [pk_1(u_1+u_2)+(e_2+e_4)]_q)

        由于消息仅存在于具有缩放的密文中,因此加法的结果与加密 m_1+m_2 的形式相同,只是增加了新的噪音:

c=([pk_0(u_3)+(e_5)+q(m_1+m_2)/t]_q,[pk_1(u_3)+(e_6)]_q)

        大致的解密(舍入之前)将为: [q(m_1+m_2)/t+e_5+eu_3+e_6s]_q。这意味着只要新的噪声项不太大,消息 m_1+m_2 就能正确解密。其中噪声有三种类型:

e_5 = e_1 + e_3 \\ eu_3 = e(u_1+u_2) \\ e_6s = (e_2+e_4)s

        我们担心的是,当这些项变得足够大,以至于噪音多项式中的一个系数大于 q/(2t) 时,解密就会失败,因为解密过程结束时的四舍五入操作会四舍五入到错误的数字。

        如果我们只考虑第一项,那么我们就把来自离散高斯分布的多项式中的系数相加。这意味着在某些情况下,我们会把一个负系数加到一个正系数上,结果会更接近于零。在其他情况下,系数会有相同的符号,所以结果会更大。我们可以做很多的同态加法,看看噪音是如何随着加法的数量增加而增加的,这是很有指导意义的。系数的分布如下图所示,其中我们添加了1、5和30个噪音多项式(随机地进行了数百次试验)。

        当我们添加了30个噪音多项式时,某些系数有可能会大于64,即超过了q/t的一半,所以解密不会产生正确的结果。

        另外两项表示不同的情况 —— 第二项是一个噪音多项式乘以一些“小的多项式”(系数为-1、0或1)的总和。这种乘法会产生更大的噪音。一个噪音多项式和一个小的多项式的乘积的系数大约将是随机正负号的噪音多项式系数的2/3rds的总和。这意味着这个噪音与多项式的最高次的平方根 \sqrt n 一致。

        对这一项绘制与上面相同的分布可以看出,它比第一项大得多,而且即使对于我们示例中的参数,也存在错误解密的危险,即使只是添加了几个参数。

        第三项是类似的 —— 一组噪音多项式之和,乘以一个“小的多项式”。它的噪音分布是这样的: 

        结合起来,我们可以画出这三项的最大系数的增长,作为已经发生的加法数量的函数。这是一个须状图,给出了这些最大值的可变性。(注意噪音的均值接近于零,这是最大系数的幅值分布) 

        这表明,对于我们所选择的参数,由两个以上加法产生的密文,解码错误的概率很高,而且两次加法失败的概率也很高。这是因为有时最大错误大于64,当q/t = 128时,会导致不正确的解密,就像这里一样。为了给这样的操作提供更多的空间,我们需要使用更大的q/t比值,这可以应对通常由所执行的操作数量引入的噪音量。

        不幸的是,由密文的同态乘法引入的噪音量又要大得多。

同态乘法

        我们首先回顾下公钥和密文形式:pk = (pk_0,\ pk_1) =([-as+e]_q,\ a)ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)。以及解密初级形态为 [ct_0+ct_1 \cdot s]_q

        同态乘法在程序上很简单,但是比加法复杂得多。如上所述,消息以 qm_1/t 的比例出现在密文的第一个元素中。因此,将两个密文的第一个元素相乘,再乘以t/q,就会得到一个带有 qm_1m_2/t 的项——如果我们仍然能够除去掩码项,这个项就可以恢复。

        因此,要理解同态乘法的机制,关键在于了解如何从密文的乘积中去掉掩码项。要做到这一点,我们的想法是把密文看作是私钥 s 的幂次方的一个简单多项式。这是这篇文章中使用多项式的第三种不同的方法,虽然它有点令人困惑,但是它是理解同态乘法如何工作的关键。

        我们可以写出解密过程的第一部分,使密文的每个元素都是 s 的多项式的系数:[ct_0 + ct_1s^1]_q

        请记住, ct和 s 本身就是多项式,所以这个方程是一个多项式乘以一个多项式 (s^0)加上一个多项式乘以另一个多项式(s^1),然后所有这些都取多项式模 x^d+1和系数模 q

        现在,我们在上面看到解密产生了一个与掩码项 au无关的量:[ct_0 + ct_1s^1]_q \rightarrow \frac{q}{t}m + noise

        好了,现在考虑两个密文 a 和 b,它们被定义为两个消息 m_1 和 m_2 的加密,它们可以被解密:

[a_0 + a_1s^1]_q \rightarrow \frac{q}{t}m_1 + n_1 \\\ [b_0 + b_1s^1]_q \rightarrow \frac{q}{t}m_2 + n_2

        其中 n_1 和 n_2 表示密文中的噪声。

        如果我们取它们的乘积,我们有: [a_0 + a_1s^1]_q[b_0 + b_1s^1]_q \rightarrow (\frac{q}{t}m_1 + n_1)( \frac{q}{t}m_2 + n_2)

右边的表达式与计算 a 和 b 所用的掩码无关,所以左边也必须与它们无关。如果我们把左边展开成 s 的形式(为了方便起见,再乘以 t/q )就得到了: mult(a,b)= c_0 + c_1s + c_2s^2,其中 c_0 = [\frac{t}{q}a_0b_0 ]_qc_1 = [\frac{t}{q}(a_1b_0+a_0b_1) ]_qc_2 = [\frac{t}{q}a_1b_1]_q

        这样做意味着我们可以计算出一个新的密文的组成部分,它比原来的密文多一个元素,并且可以正确地使用密钥 s 的幂次方进行解密。

        解密的形式展开如下: [ \left \lfloor t/q[ct_0s^0+ct_1s^1+ct_2s^2]_q\right \rceil]_t

        这只是增加了一个项,该项是一个多项式乘以另一个多项式的平方。这里需要处理大量的细节追踪工作,但这只是学校水平的代数运算(当然,不包括模数部分!)。这是一种解密步骤的推广,它允许我们解密同态乘法的结果。

        要了解这一切是如何显式地工作的,请考虑 a 和 b 在加密过程中的展开式:

a=([pk_0u_1+e_{11}+qm_1/t]_q,[pk_1u_1+e_{12}]_q), \\ b=([pk_0u_2+e_{21}+qm_2/t]_q,[pk_1u_2+e_{22}]_q)

        如果我们展开乘法的定义,同时对结果进行部分解密(即解密到除以 q/t 和整数之前),那么得到的表达式就很复杂。但是,由于每个密文的组件都是在解密过程中被构造成能够删除掩码项( au_i )的,所以这个展开的结果完全不依赖于来自公钥的掩码项!!!

得到的表达式如下:

ct_0s^0+ct_1s^1+ct_2s^2 \\ = \frac{q}{t}m_1m_2 + e_{22}m_1s+e_{12}m_2s+em_2u_1+em_1u_2+e_{21}m_1+e_{11}m_2 \\ + \frac{t}{q}e^2u_1u_2 + \frac{t}{q}e_{12}e_{22}s^2 + \frac{t}{q}e_{22}esu_1 + \frac{t}{q}e_{12}esu_2 \\ \frac{t}{q}e_{12}e_{21}s + \frac{t}{q}e_{11}e_{22}s + \frac{t}{q}e_{21}eu_1 + \frac{t}{q}e_{11}eu_2 + \frac{t}{q}e_{11}e_{21}

        这里有很多项,但是现在我们已经去掉了掩码,问题是,噪音(除了第一个)与 q/(2t) 的“噪音预算”相比有多大?

        为了感受这一点,我们模拟了大量加密的随机信息的乘法, d = 16, t = 7, q = 7168 = 1024 \times t。各类型噪音的系数大小分布如下图所示。请注意,总的噪音需要大于 q/(2t) = 512 才能导致解密错误。在这些项中,涉及噪音多项式的项、消息和私钥, e_{22}m_1s + e_{12}m_2s 是最大的贡献者。

        上图显示,对于这些参数,最大的贡献来自于包含噪音多项式乘以消息多项式和私钥的项。这种噪音的最大系数约为300。这里有两项,其他的项更小。把所有的噪音合并成一个,就得到了乘法结果的总噪音。这些系数的分布如下图所示: 

重线性化

        上面概述的乘法策略允许我们进行多次乘法,但代价是每次乘法都将密文的大小增加一个多项式。密文在大小上增长可能是一个问题。事实证明,有一些方法可以将密文的大小还原为两个多项式,但代价是增加噪声。这就是所谓的 Relinearisation(重线性化),因为你要去掉 s 多项式中的二次项和更高的项。

        另一项使这种加密方案切实可行的重要技术是将多个消息打包到一个明文中(单指令多数据(SIMD)),通过并行化提高吞吐量。

结论

        粗略地说,加密是将消息隐藏在一个环上的多项式中,并添加一些噪音。每个密文都包含足够的信息,可以在给定私钥的情况下除去自己的掩码。因为密文只涉及到消息的缩放,所以仍然可以对它们执行加法和乘法,并使用一些巧妙的结构来在之后移除掩码。该方案的安全性来自于在不知道私钥的情况下,在噪声存在的情况下很难去除掩码。这个问题的难度具有一些优秀的安全性能,例如没有已知的量子算法来攻击这些系统。

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

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

相关文章

10天进阶webpack---(2)webpack模块兼容性处理

回顾CMJ和ESM的区别 CMJ的本质可以使用一个函数概括 // require函数的伪代码 function require(path){if(该模块有缓存吗){return 缓存结果;}function _run(exports, require, module, __filename, __dirname){// 模块代码会放到这里}var module {exports: {}}_run.call(mod…

【STM32】NVIC / EXTI / AFIO 介绍

文章目录 中断系统NVIC简介NVIC基本结构NVIC优先级分组EXTI外部中断EXIT基本结构AFIO复用IO口EXTI内部框图 AFIO / EXTI / NVIC 相关函数AFIO相关函数EXTI相关函数NVIC相关函数 旋转编码器简介对射式红外传感器计次接线图CountSensor(传感器)驱动程序封装…

【Linux内核大揭秘】程序地址空间

文章目录 什么是程序地址空间地址空间的组成虚拟内存技术 如何理解程序地址空间页表页表的细节关于堆区 在Linux中如何查看各个分段的信息总结 什么是程序地址空间 程序地址空间是一个程序在执行期间可以访问的内存范围。它由操作系统为每个进程分配,以确保进程之间…

nginx代理出现的请求头中获取不到acc_token问题

1.问题 程序开发完成之后,发现页面登录之后,获取不到用户信息。发现时没有获取到token信息。本地程序开发完成,后端服务成功署到服务器。通过云服务器开放对应的端口,使用本地的前端服务,直接连接服务器后端服务&…

WordPress之generatepress主题安装

1.打开主题列表 2.如果没有自己需要主题点击安装新主题 点击安装并启用 3.不喜欢的 主题可以点击主题进去删除 4.主题自定义编辑 打开自定义,可以修改布局,颜色,排版等等

MySQL之JDBC入门详解

01-JDBC入门 一、JDBC概念 jdbc : java database connection , java数据库连接 jdbc是sun公司定义的java程序访问数据库的规范。 二、JDBC操作需要6步 三、入门程序 1、使用eclipse打开一个新的工作空间 2、切换到java视图界面 3、创建java工程:01-jdbc-helloworl…

BackTrader-Commission 06

Backtrader 策略实例,该部分内容通过使用backtrader对常用的策略实例的编写,提高和熟悉backtrader的实际场景的使用。 [Backtrader]实例:均线策略 [Backtrader] 实例:MACD策略 [Backtrader] 实例:KDJ 策略 [Backtrader] 实例:RSI 与 EMA 结合 [Backtrade…

WordPress伪静态设置

为什么要设置WordPress伪静态,搜索引擎优化(SEO)中,静态URL通常被认为更易于搜索引擎爬虫抓取和索引,有助于提高网站的搜索引擎排名。 WordPress伪静态设置方法主要依赖于服务器环境,以下是针对不同服务器…

sublime python出现中文乱码怎么办

一、乱码现象 利用sublime自带编译快捷方式ctrlB会出现中文乱码的情况。 print("没有循环数据!") print("完成循环!") 二、寻找原因 1、由于之前我已经安装了插件ConvertToUTF8,排除文本编码错误问题。 2、相同的代码在插件sublimerepl搭建的…

【ARM Linux 系统稳定性分析入门及渐进 1.2 -- Crash 工具依赖内容】

请阅读:【Linux 维测及Crash使用专栏】 文章目录 Prerequisites1. 内核对象文件2. 内存镜像3. 平台处理器类型4. Linux 内核版本 Prerequisites crash 工具需要依赖下面的内容: 1. 内核对象文件 vmlinux 文件:需要一个 vmlinux 内核对象文件&#xff…

电路设计过程就是波形整形过程

这种说法有一定的道理。在电路设计中,常常需要对输入的电信号波形进行处理和调整,以满足后续电路或系统的要求,这在某种程度上可以理解为波形整形的过程。 例如,在数字电路中,输入的信号可能存在噪声、干扰或者不符合…

计算机视觉-显著性检测实验报告

实验四 显著性检测实验 一、实验目的 掌握多种显著性检测算法的基本原理。学会使用计算机程序实现不同的显著性检测方法。通过对比不同的显著性检测算法,理解各算法的优缺点。分析显著性检测在实际图像处理应用中的效果和局限性。 二、实验内容和要求 1&#x…

05-Dubbo的应用及注册和SPI机制

05-Dubbo的应用及注册和SPI机制 Dubbo 的服务注册中应用级注册优化 Dubbo 的注册中心 Dubbo 支持很多种注册中心,支持的主流注册中心包括:ZooKeeper、Nacos、Redis Dubbo 需要引入注册中心依赖,并且配置注册中心地址,这里以 ZooKe…

【 AI 大模型:重塑软件开发的新势力】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

南宁周边乡村游微信小程序ssm+论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行,目前微信开发者工具任然在不断的完善中,在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具,开发者工具将使用这个微信帐号…

ssm校园二手交易管理系统+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码看文章最下面 需要定制看文章最下面 目 录 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 系统开发技术 3 2.1 MySQL数…

DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)

一、简介 DB-GPT 是一个开源项目,其将大语言模型 LLM 与数据库紧密结合。该项目主要致力于探索如何让预训练的大规模语言模型(例如 GPT)能够直接与数据库进行交互,从而生成更为准确且信息丰富的回答。 DB-GPT部署后能否直接使用…

掌握 Jest 配置文件:优化单元测试的灵活性与可维护性

引言 在现代软件开发中,单元测试是确保代码质量和稳定性的关键步骤。Jest 是一个广泛使用的 JavaScript 测试框架,提供了丰富的配置选项来优化测试过程。通过配置文件,开发者可以更灵活地控制测试环境,确保测试的可靠性和可维护性…

网络:IP分片和组装

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言16位标识,3位标志,13位片偏移分片组装总结 前言 对于IP分片和组装的总结 当一个IP数据报的大小超过网络的MTU(最…

Node.js:Express 中间件 CORS 跨域资源共享

Node.js:Express 中间件 & CORS 中间件全局中间件局部中间件分类错误级中间件内置中间件 CORS原理预检请求 中间件 中间件是不直接接收请求,也不直接发送响应,而是在这之间处理一个中间过程的组件。 当一个请求到来,会经过多…