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

news2024/11/19 13:22:28

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

  

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

原文来源: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.coloradmin.cn/o/2243407.html

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

相关文章

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)事件推荐开发者测试

意图框架向开发者提供真机测试能力,即开发者可连接设备进行调测。开发者完成代码开发之后,功能正式上架应用市场前,可以在HarmonyOS NEXT设备上面进行自验证,打磨体验。真机测试分为三个步骤:基础信息提供,…

MySQL —— MySQL基础概念与常用功能介绍

文章目录 基本概念数据类型数据类型分类 约束主键约束(PRIMARY KEY)外键约束(FOREIGN KEY)使用非空约束(not null)使用唯一性约束(UNIQUE)使用默认约束(DEFAULT&#xff…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术,是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等,按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率,提高工程人员效率,减少板材的浪费。覆铜…

商业物联网详细指南:优势与挑战

物联网是信息技术行业最具前景的领域之一。为什么它如此热门呢?原因在于全球连接性。设备可以像人群一样相互协作。正如我们所知,协作能显著提高生产力。 物联网对普通用户和企业都有益处。许多日常流程可以通过传感器、扫描仪、摄像头和其他设备实现自…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时,获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法,您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

【android USB 串口通信助手】stm32 源码demo 单片机与手机通信 Android studio 20241118

android 【OTG线】 接 下位机STM32【USB】 通过百度网盘分享的文件:USBToSerialPort.apk 链接:https://pan.baidu.com/s/122McdmBDUxEtYiEKFunFUg?pwd8888 提取码:8888 android 【OTG线】 接 【USB转TTL】 接 【串口(下位机 SMT32等)】 需…

在云服务器搭建 Docker

操作场景 本文档介绍如何在腾讯云云服务器上搭建和使用 Docker。本文适用于熟悉 Linux 操作系统,刚开始使用腾讯云云服务器的开发者。如需了解更多关于 Docker 相关信息,请参见 Docker 官方。 说明: Windows Subsystem for Linux&#xff…

缓存及其不一致

在实际开发过程中,一般都会遇到缓存,像本地缓存(直接在程序里搞个map也可以,但是可能会随着数据的增长出现OOM,建议使用正经的本地缓存框架,因为自己实现淘汰策略啥的挺费劲的)、分布式缓存&…

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

神经网络11-TFT模型的简单示例

Temporal Fusion Transformer (TFT) 是一种用于时间序列预测的深度学习模型,它结合了Transformer架构的优点和专门为时间序列设计的一些优化技术。TFT尤其擅长处理多变量时间序列数据,并且能够捕捉到长期依赖关系,同时通过自注意力机制有效地…

汽车资讯新动力:Spring Boot技术革新

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足,创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突

一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1,创建证书和密钥 需要openssl环境,如果是Window下,下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境,此环境是在jdk环境下 本案例所使用的账号密码均为: ka…

【进阶系列】python简单爬虫实例

python有一个很强大的功能就是爬取网页的信息,这里是CNBlogs 网站,我们将以此网站为实例,爬取指定个页面的大标题内容。代码如下: 首先是导入库: # 导入所需的库 import requests # 用于发送HTTP请求 from bs4 impor…

基于Java和Vue实现的上门做饭系统上门做饭软件厨师上门app

市场前景 生活节奏加快:在当今快节奏的社会中,越来越多的人因工作忙碌、时间紧张而无法亲自下厨,上门做饭服务恰好满足了这部分人群的需求,为他们提供了便捷、高效的餐饮解决方案。个性化需求增加:随着人们生活水平的…

CentOS 7中查找已安装JDK路径的方法

使用yum安装了jdk8,但是其他中间件需要配置路径的时候,却没办法找到,如何获取jdk路径: 一、确认服务器是否存在jdk java -version 二、查找jdk的 java 命令在哪里 which java 三、找到软链指向的地址 ls -lrt /usr/bin/java l…

分布式----Ceph部署

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储(软件定义的存储 SDS) 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…

UE5 材质里面画圆锯齿严重的问题

直接这么画圆会带来锯齿,我们对锯齿位置进行模糊 可以用smoothstep,做值的平滑过渡(虽然不是模糊,但是类似)

即插即用的3D神经元注意算法!

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月18日10点39分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文连接 点击开启你的论文编制之旅…

Mac的Terminal随机主题配置

2024年8月8日 引言 对于使用Mac的朋友,如果你是一个程序员,那肯定会用到Terminal。一般来说Terminal就是一个黑框,但其实Terminal是有10款官方皮肤。 每个都是不一样的主题,颜色和字体都会有所改变。现在就有一个方法可以很平均…