初探全同态加密1 —— FHE的定义与历史回顾

news2024/12/23 10:41:50

文章目录

  • 一、加密体系
    • 1、什么是加密体系
    • 2、加密体系的属性 Properties
  • 二、同态加密:偶然的特殊性质
  • 三、同态加密体系的分类
  • 四、部分同态加密 Partially Homomorphic Encryption
    • 1、加法同态加密算法 —— ElGamal 加密算法
      • 1.1、ElGamal 的大致步骤
      • 1.2、ElGamal 的加法同态特性
    • 2、乘法同态加密算法 —— RSA加密
      • 2.1、RSA 的大致步骤
  • 五、近似同态加密 Somewhat Homomorphic Encryption
  • 六、有限级数全同态加密 Fully Leveled Homomorphic Encryption
  • 七、全同态加密 Fully Homomorphic Encryption, FHE
    • 1、全同态加密系统的定义
    • 2、全同态加密体系的性质


一、加密体系

1、什么是加密体系

 在开始之前,我们先温习一下最最传统的加密体系。
 构建一个 加密系统,往往都需要一个 密钥 Key。通过这个密钥,我们可以一头把明文的信息加密成密文,然后在另一头通过密钥再把密文变回原来的样子。如果没有这个 Key 的话,其他的人很难知道我们到底传递了什么信息。
在这里插入图片描述
上文的图例基本展示了所有常见加密体系的全貌。所有的加密体系,如果用比较正式的描述方法,无疑是做了三件事:

  1. 通过一个生成算法 K e y G e n ( 1 λ ) KeyGen(1^λ) KeyGen(1λ) 来随机生成一对用于加密和解密的密钥 ( E n c K e y , D e c K e y ) (EncKey,DecKey) (EncKey,DecKey)
  2. 加密方通过 加密密钥 E n c K e y EncKey EncKey加密算法 E n c r y p t i o n Encryption Encryption 来加密 原文 P l a i n t e x t Plaintext Plaintext,最后得到 密文 C i p h e r t e x t Ciphertext Ciphertext
  3. 随后,在解密的时候,解密方可以通过 解密密钥 D e c K e y DecKey DecKey解密算法 D e c r y p t i o n Decryption Decryption 来解密密文,最后还原回来原来的原文。

 我们这里描述的这三个步骤,其实通用于任何加密体系 (对称加密系统和非对称加密系统)。如果是对称的,那么加密和解密用的密钥就是一样的。如果是非对称的体系的话,那么加密用的就是 公钥 Public Key,然后解密用的是不一样的 私钥 Private Key

2、加密体系的属性 Properties

 在密码学研究中,每当我们看到一个新的系统的定义之后,接下来往往都要陈述这个系统所应具有的 属性 Properties

  • 正确性,Correctness
     正确性代表说,如果我拥有一个正确的密钥,那么我就可以通过 解密算法 D e c r y p t i o n Decryption Decryption 来把密文还原成原文。我们往往都使用概率的方法来表示解密的成功率:
    ∀ p t ∈ P T , ( k e n c , k d e c ) ← K e n G e n ( 1 λ ) : P r [ D e c r y p t i o n ( k d e c , E n c r y p t i o n ( k e n c , p t ) ) = p t ] = 1 \forall pt \in PT, (k_{enc},k_{dec}) \larr KenGen(1^λ) \\ :Pr[Decryption(k_{dec},Encryption(k_{enc},pt))=pt]=1 ptPT,(kenc,kdec)KenGen(1λ):Pr[Decryption(kdec,Encryption(kenc,pt))=pt]=1
    上面的等式代表了,如果我们拥有 正确的密钥,那么解密算法可以 还原 加密算法生成的密文的几率是 100%
  • 语义安全,Semantic Security
     我们可以理解为,如果我们拥有任意两个不同的原文所对应的密文,那么我们是无法区分到底哪个密文是对应了哪个原文的:
    ∀ m 0 , m 1 : { E n c ( k e n c , , m 0 ) } ≈ c { E n c ( k d e c , m 1 ) } \forall m_0,m_1:\{Enc(k_{enc},,m_0)\}≈_c\{Enc(k_{dec},m_1)\} m0,m1:{Enc(kenc,,m0)}c{Enc(kdec,m1)}
    语义安全的主要意义在于 旁观者 无法区分 两条加密的消息。那么如果有入侵者窃听网络,看到了我发出的加密信息,只要我使用的加密体系是语义安全的,那么我就可以确信入侵者无法从密文中得到关于加密内容的任何信息。

 满足了上述两条属性之后,一个加密体系就变得健全啦。


二、同态加密:偶然的特殊性质

 我们都知道,光看密文本身,我们什么信息都不会得到。但是这是不是就代表,如果没有密钥只有密文,我们什么都不能做了呢?答案我们都知道:其实并不是
 但是在众多的加密算法当中,有一类算法生成的密文有一种特殊的 同态属性:假如我们使用 加密算法 Enc 得到了 数字1密文 ct1,然后我们又得到了 数字2密文 ct2。这个时候,如果我们把密文相加起来,ct+ct2 恰恰是 1+2=3 的密文!对于这种属性,我们称之为 加法同态
 同理可得,加法同态之外,还存在着 乘法同态 的加密算法。

 通过同态加密算法,用户 可以与一个 不可信的远程服务器 (云端) 进行某种 安全代理计算 Secure Delegated Computation。用户可以通过 同态加密的技术 来把自己敏感的隐私输入加密后托付给云端,然后云端可以 在加密过后的数据上 进行一定程度的计算,最后得到加密过后的用户想要的结果,并且返还给用户。最后用户就可以用解密密钥来打开得到的结果了。整个协议中,被代理方 云端 始终都 无法看到 任何和私密输入有关的有用信息。


三、同态加密体系的分类

 大致了解了两种最基础的同态性质之后,其他的概念就变得非常容易理解了。如果系统性的来看,同态加密体系大致上被分为四类:部分同态、近似同态、有限级数全同态、完全同态


四、部分同态加密 Partially Homomorphic Encryption

1、加法同态加密算法 —— ElGamal 加密算法

 同态加密 最初级 的阶段被称为 部分同态加密,定义就是 密文只有一种同态特性。这一阶段就包括了我们上文所描述的 加法同态乘法同态 两种模式。

 如果放到之前说的 安全代理计算 的场景下看,假如我们有 私密输入 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,然后我们希望 云端 可以帮我们计算 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn) ,那么我们可以把云端对于这些输入做的计算使用 函数 F 来表示。

 假如说我们可以通过一个 加法同态加密 的算法来计算 F 的话,那么代表了这个 函数F 肯定就只能包含 私密输入 xi 的任意线性组合 (加法运算)。一个可行的例子就是把各项私密输入乘以一个常数,然后相加起来:
f ( x 1 , x 2 , . . . , x n ) → c 1 x 1 + c 2 x 2 + . . . + c n x n f(x_1,x_2,...,x_n) \rarr c_1x_1+c_2x_2+...+c_nx_n f(x1,x2,...,xn)c1x1+c2x2+...+cnxn 但是如果我们想让两个输入 xi xj 相乘起来的话,那么上述的加法同态算法就无能为力了。F 只能是所有私密输入的 线性组合

常见的 加法同态加密算法 就是 基于循环群 GElGamal 加密算法

ElGamal基于 Diffie-Hellman 密钥交换协议 而产生的一个非常方便的 公钥加密算法,采用的是 循环群 的特性。由于篇幅的原因,这里不详细解释循环群的定义,我们只需要知道 每一个群都可以找到一个生成元 (generator) ,然后这个生成元可以进行幂的计算。

1.1、ElGamal 的大致步骤

ElGamal 加密实现方法大致如下:

  1. 首先我们找到一个 生成元 g ∈ G g \in G gG,然后随机选择一个 整数 x。我们把 gx 作为 公钥 pk,然后把 x 作为 私钥 sk
  2. 如果要加密一个 消息 m 的话,那么我们就再随机选择一个 整数 y,然后我们就可以输出 密文:
    c t ← ( v ← g y , e ← p k y ⋅ g m ) ct \larr (v \larr g^y,e \larr pk^y·g^m) ct(vgy,epkygm)注意这个密文分为 v, e 两段。
  3. 当我们需要解密一个 密文 ct 的时候,我们只需要首先计算 w ← v x = g y x = p k y w \larr v^x=g^{yx}=pk^y wvx=gyx=pky然后就可以轻松的还原出原文 m 了: m ← l o g g ( e / w ) m \larr log_g(e/w) mlogg(e/w)

1.2、ElGamal 的加法同态特性

 具体 ElGamal 的 正确性安全性 我们就不论证了。但是看到这个加密体系的加密方式之后,由于都是 幂运算,我们可以发现 ElGamal 潜在的 加法同态 的特性。
 假如我们拥有两条消息 m0,m1 的加密,分别为 ct0,ct1,展开来就是:
c t 0 = ( v 0 = g y 0 , e 0 = p k y 0 ⋅ g m 0 ) c t 1 = ( v 1 = g y 1 , e 1 = p k y 1 ⋅ g m 1 ) ct_0=(v_0=g^{y_0},e_0=pk^{y_0}·g^{m_0})\\ ct_1=(v_1=g^{y_1},e_1=pk^{y_1}·g^{m_1}) ct0=(v0=gy0,e0=pky0gm0)ct1=(v1=gy1,e1=pky1gm1) 我们可以注意到,如果我们 把两条密文的两个部分各自相乘 的话,我们就可以得到一个 新的密文 c t ^ \widehat{ct} ct $ c t ^ = c t 0 ⋅ c t 1 = ( v ^ = g y 0 + y 1 , e ^ = p k y 0 + y 1 ⋅ g m 0 + m 1 ) \widehat{ct}=ct_0·ct_1=(\widehat{v}=g^{y_0+y_1},\widehat{e}=pk^{y_0+y_1}·g^{m_0+m_1}) ct =ct0ct1=(v =gy0+y1,e =pky0+y1gm0+m1) 我们得到的结果恰恰就是原文 m0+m1 加在一起之后所对应的 加密密文!这样的话,如果我们得到了两条 ElGamal 加密算法的密文,我们就可以通过这样的方法得到密文的 任意线性组合 了。

2、乘法同态加密算法 —— RSA加密

 同理我们也可以应用于 乘法同态加密 的算法上—— F 就只能把所有的私密输入相乘起来,但是没有办法做任何 线性组合 (加法)。乘法同态的例子其实也非常常见,我们大家都熟悉的 RSA 加密就是一个乘法同态的系统。

2.1、RSA 的大致步骤

 RSA 加密的实现方法大致如下:

  1. 首先找到一个很大的数字 N = p · q,并且 p, q质数。然后找到一组数字 e, d 使得可以满足 e · d = 1 mod (p-1) (q-1)。我们把 (N, e) 作为 公钥(N, d) 作为 私钥
  2. 如果要加密一个消息 m,则密文 c t ← m e   m o d   N ct \larr m^e\ mod\ N ctme mod N
  3. 如果需要解密一个消息 ct,则原文 m ← c t d   m o d   N m \larr ct^d\ mod\ N mctd mod N这里和乘法逆元有关,需要仔细推导

 这个加密的 正确性 就在于 (me)d = m mod N。因为 RSA 加密和解密的过程也就只涉及到了幂的计算,我们又可以观察到同态的性质了。假如说我们有两条加密的消息 ct_0, ct_1 对应 m_0, m_1。那么我们可以把他们相乘起来得到来得到 c ^ \widehat c c ,并且可以观察到: c ^ = c t 0 ⋅ c t 1 = m 0 e ⋅ m 1 e = ( m 0 ⋅ m 1 ) e \widehat c=ct_0·ct_1=m_0^e·m_1^e=(m_0·m_1)^e c =ct0ct1=m0em1e=(m0m1)e 我们就得到了这两条消息 相乘 之后所对应的密文!这就是 乘法同态性质 了,我们可以接着这条密文继续往上叠加新的密文,这样一来我们就可以得到密文之间 任意的相乘


五、近似同态加密 Somewhat Homomorphic Encryption

 就如同我们在上一段所说,如果我们又想让私密输入相乘,又想得到它们之间的线性组合的话,单纯的部分同态加密算法 (RSA, ElGamal) 是无法完成的。

 所谓 近似同态加密 指的是 可以同时进行 加法乘法,但是可以做加法和减法的 次数有限,可以计算的函数 F 也在一个有限的范围内

 近似同态加密这一阶段常见的例子并不多,如果说最好理解的例子的话,那就应该是 基于配对 (Pairing) 的循环群加密算法 了。

配对 (Pairing)基于某些 特有的椭圆曲线循环群 可以进行的一种特殊运算,用 e(·,·) 来表示。具体 Pairing 做的事情,就是 把两个循环群中的值映射到第三个循环群中
e ( g x ∈ G , g y ∈ G ) → g T x y ∈ G T e(g^x \in G,g^y \in G) \rarr g_T^{xy} \in G_T e(gxG,gyG)gTxyGT 这样一来,我们就变相的得到了 前两个值的幂之间的乘积组合!再搭配 ElGamal 加密中可以把两个值的幂做 线性组合 的属性的话,那么我们就得到了一个 全同态的系统 了。

 事实上,现实并没有那么美好,因为 Pairing 这一特殊属性并 不会出现在 所有的循环群当中。所以如果我们把两个可以做 Pairing 的群中的值通过 Pairing 相乘起来,映射到了一个新的群 GT 当中之后,那么新的群并不一定能找到对应的 Pairing 属性!

这一局限性证明了这个系统是 近似同态 的,因为我们不能计算 任意逻辑和深度的函数F

学习一下 循环群 是什么东西。


六、有限级数全同态加密 Fully Leveled Homomorphic Encryption

 在这一阶段的话,我们已经可以对密文进行 任意的加法乘法组合 了,没有任何对于 次数的局限性

 但是之所以被称之为 有限级数 全同态的原因是,这个阶段的算法会引入一个新的 复杂度上限 L 的概念,这一复杂度上限约束了函数 F 的复杂度。如果我们可以把 F二进制电路 C 来表示的话,那么 C 的深度和大小 一定要在 L 的范围之内,即:
∣ C ∣ ≤ L |C| \le L CL 关于这个复杂度的上限 L 是怎么来的。首先,假如有一个全同态加密的算法,可以对密文进行任何的加法与乘法的运算。但是这个算法在加密的时候会在密文里面加入一定的 随机噪音

 当噪音在可控范围内的时候,那么解密算法就可以很容易从密文还原回原文。但是当我们 叠加密文在一起进行同态计算 的时候,每一个密文里面自带的噪音会被叠加扩大。如果我们只是对密文进行比较简单的逻辑,那么叠加起来的噪音还在一个 可以接受的范围。但是如果我们过于复杂地堆叠密文在一起,那么一旦 噪音的范围超过了临界值,那么就会彻底的覆盖掉原来的原文,从而导致 解密会失败
 在这个场景中,这个 同态加密系统 可以接受的 噪音上限 转换为 叠加的逻辑的复杂度 的话就是 L 了。这就是为什么我们只可以进行 复杂度小于 L 的计算,因为一旦复杂度超过 L,我们就再也无法还原回原来的原文了。


七、全同态加密 Fully Homomorphic Encryption, FHE

 一个全同态加密的系统 没有任何计算方法的限制,可以在 没有密钥的情况下,把密文任意的组合起来,形成新的密文,并且新的密文,无论计算的复杂度,都可以完美的被 还原成原文
 当达到这一阶段时,之前提到的 安全代理计算 就变得可行了。如果可以找到一个 效率比较高的全同态加密体系 的话,我们可以安全的把 所有本地的计算 全部 代理到云端,并且不会泄露任何一丁点数据!

1、全同态加密系统的定义

 一个全同态加密系统,一共拥有四个算法:

  1. 密钥生成算法 K e y G e n ( 1 λ ) → s k KeyGen(1^λ) \rarr sk KeyGen(1λ)sk
    生成加密与解密需要用到的 密钥 sk。为了简单表示,我们这里假设这个加密系统是 对称的 (即加密密钥等于解密密钥)。
  2. 加密算法 E n c ( s k , m ∈ 0 , 1 ∣ M ∣ ) → c t Enc(sk,m \in 0,1^{|M|}) \rarr ct Enc(sk,m0,1M)ct
    原文 m 加密成 密文 ct
  3. 解密算法 D e c ( s k , c t ) → m Dec(sk,ct) \rarr m Dec(sk,ct)m
    密文 ct 还原为 原文m
  4. 运算算法 E v a l ( F , c t 1 , . . . , c t l ) → c t ^ Eval(F,ct_1,...,ct_l) \rarr \widehat{ct} Eval(F,ct1,...,ctl)ct
    l 个密文 组合起来,通过一个 二进制逻辑电路 F,最后得到 组合的密文 c t ^ \widehat{ct} ct ,使得 D e c ( s k , c t ^ ) = F ( m 1 , . . . , m l ) Dec(sk,\widehat{ct})=F(m_1,...,m_l) Dec(sk,ct )=F(m1,...,ml)

 我们可以看到,最后一步的运算算法 Eval,就是全同态加密的精髓了。回到上文的例子,如果我们想让 云端的服务器 替我们进行一些机器学习的模型分析,那么在这里,我们只需要 模型分析预测的过程 转换为 二进制逻辑电路 F,然后我们 提供加密过后的数据样本 ct1,ct2,…,ctl,然后云端就可以通过 Eval(F, ct1, …, ctl) 得到加密的最后预测的结果。

2、全同态加密体系的性质

 现在我们来看看这个系统的 属性 (Properties)

  1. 首先,这个体系必须得是 正确的 (Correctness)
     也就是说,如果我们任意选择一个 电路 F,并且任意选择 一组 原文消息 m1, m2, …, ml。如果我们拥有一开始 KeyGen 算法 生成的 密钥 的话,那么:
    D e c ( s k , E v a l ( F , E n c ( s k , m 1 ) , . . . , E n c ( s k , m l ) ) ) = F ( m 1 , . . . , m l ) Dec(sk,Eval(F,Enc(sk,m_1),...,Enc(sk,m_l)))=F(m_1,...,m_l) Dec(sk,Eval(F,Enc(sk,m1),...,Enc(sk,ml)))=F(m1,...,ml)
  2. 其次,这个系统需要达到 语义安全。这一定义我们上文已经阐述过了。
  3. 最后,为了让全同态加密体系变得有实际的使用意义,我们必须还得加一条额外的规定:简短性 (Compactness)
     也就是说 Eval 这个算法输出的结果必须要 在一个限定范围之内。如果要加一个硬性条件的话,就是 Eval 这个算法的 输出结果大小 必须要 独立于 二进制电路 F 的大小。也就是说,就算 F 再大,Eval 的结果大小也不会有所改变:
    ∀ F , s k , c t i ← E n c ( s k , m i ) ∣ E v a l ( F , c t 1 , . . , c t l ) ∣ = p o l y ( λ ) \forall F,sk,ct_i \larr Enc(sk,m_i) \\ |Eval(F,ct1,..,ct_l)|=poly(λ) F,sk,ctiEnc(sk,mi)Eval(F,ct1,..,ctl)=poly(λ) 关于为什么需要加上 简短性,这是因为,如果没有这个要求,我们可以非常轻易的做出一个 毫无意义 (作弊的) 全同态系统:
    1. 密钥生成、加密算法可以任意选择一个语义安全的对称加密算法。
    2. E v a l ( F , c t i ) → ( F , c t i ) Eval(F,ct_i) \rarr (F,ct_i) Eval(F,cti)(F,cti):运算算法 Eval 要做的事情很简单,直接把对于 F 的描述和 原来的密文 cti 全部输出到 新的密文 c t ^ \widehat{ct} ct 当中。
    3. D e c ( s k , ( F , c t i ) ) → F ( D e c ( s k , c t 1 ) , . . . , D e c ( s k , c t l ) ) Dec(sk,(F,ct_i)) \rarr F(Dec(sk,ct_1),...,Dec(sk,ct_l)) Dec(sk,(F,cti))F(Dec(sk,ct1),...,Dec(sk,ctl)):最后在解密的时候,先把密文里所有的 cti 全部依次解密回原文,然后再根据对 F 的描述手动跑一下 F 得到原来的结果。

这个 poly(λ) 是什么东西????
 这里的 poly(λ) 是指一个多项式函数,该函数的输入是安全参数 λ。通常,安全参数 λ 决定了加密方案的安全性级别,例如密钥的长度或密码系统的其他关键参数。poly(λ) 表示这个函数的复杂度是相对于安全参数 λ多项式增长 的,而不是指数、对数或其他更复杂的增长模式。
 在加密方案的分析中,poly(λ) 通常用于描述算法的运行时间、通信复杂度或密文大小等指标,表明这些指标是与安全参数成多项式关系的。保持复杂度在多项式范围内是衡量加密方案可行性的重要标准之一。

如果没有对与 Eval 输出大小的限制的话,那么我们反复叠加多次 Eval 之后,得到的密文大小将会越来越大。最后解密的时候,只需要把所有的原始密文解开,然后算一下 F 就行了。这就好比是一个用户把自己的健康信息加密了,让医院去判断他有没有生病,医院直接原封不动的把密文送回来,然后把自己的整套数据模型加上医疗课本也发回来,跟用户说,你自己去算吧,是一个意思。

 这一类全同态系统还有一个更大的弊端,也就是最后得到的密文并 无法完全掩盖住运算电路 F 的具体细节。在这个医院的使用场景中,有可能医院自己最值钱的就是这套数据分析系统。如果白白的把自己的 F 发回给了用户,那自己的辛苦劳动成果就被别人轻易窃取了。
 综上所述,只要满足 正确、语义安全、简短 这三个要素,我们就拥有一个 有意义 (Non-trivial) 的全同态加密体系了。

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

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

相关文章

vue3+vite项目中使用阿里图标库(svg)图标

前端项目中有很多地方会用到小图标,阿里的 iconfont 是一个不错的选择,同时, 它上面的 svg 矢量图标占用资源更少加载更快是一个不错的选择, 下面我们就来说一说,项目中如何来使用 svg 图标 安装插件 vite-plugin-svg…

RP2040 C SDK SysTick滴答定时器功能使用

RP2040 C SDK SysTick滴答定时器功能使用 ✨更好的阅读体验请移步到:飞书-云文档:https://u1etqmuwl9z.feishu.cn/wiki/VkoHwPGqHierOEkY651cZvaOntg?fromfrom_copylink RP2040的SysTick滴答定时器为24位的,计数方式为倒计时,扩展…

基于对数变换的图像美白增强,Matlab实现

博主简介:matlab图像处理(QQ:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于对数变换的图像美白增强,用matlab实现。 一、案例背景和算法介绍 这次案例是美白算法&…

Stable Diffusion Web UI基础插件推荐

通过前面知识的介绍,我们对使用 Web UI 进行绘画有了基本了解,在平时我们使用中,有很多好用的插件,通过这些插件我们创作能够事半功倍,下面我就推荐一下在平时经常使用到的插件,希望这篇文章能够帮助大家更…

MelosBoom:解锁数据价值的新纪元

在当今的数字时代,数据被誉为“新的石油”,但用户在传统的Web2环境中,往往无法真正享受到自己贡献数据的价值。大型互联网公司通过集中化的系统和算法,垄断了数据的使用权,并从中获取巨大的商业利益,而数据…

浏览器页面被禁用 F12(dev tools)

解决办法1: 使用浏览器设置栏, 打开开发者工具, 设置->更多工具->开发者工具 解决办法2: 命令行启动浏览器, 携带参数, 强制打开所有页面的 devtools chrome.exe –auto-open-devtools-for-tabs –user-data-dir./

时序必读论文10|ICLR23 Crossformer 跨维度依赖的多变量时序预测模型

论文标题:iCROSSFORMER : TRANSFORMER UTILIZING CROSS DIMENSION DEPENDENCY FOR MULTIVARIATE TIME SERIES FORECASTING 开源代码:https://github.com/Thinklab-SJTU/Crossformer 前言 Crossformer是一篇非常典型的在transformer基础上魔改注意力机…

k8s使用本地docker私服启动自制的flink集群

目标:使用本地flink环境自制flink镜像包上传到本地的私服,然后k8s使用本地的私服拉取镜像启动Flink集群 1、将本地的flink软件包打包成Docker镜像 从官网下载flink-1.13.6的安装包,修改其中的flink-conf.yaml,修改下面几项配置 …

鸿蒙开发之ArkTS 基础九 枚举类型

枚举把变量固定在特定的范围内 枚举的语法: enum 枚举名字 { 常量1 值1, 常量1 值1, 常量1 值1, ... } 定义具体如下: 使用具体如下:

【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)

摘要 为了克服常规PID控制方法在无人机俯仰姿态控制中的不足,本研究设计了一种基于模糊自适应PID控制的控制律。通过引入模糊控制器,实现了对输入输出论域的优化选择,同时解决了模糊规则数量与控制精度之间的矛盾。仿真结果表明,…

【探索数据结构与算法】希尔排序原理、实现与分析(图文详解)

目录 一、 引言 二、算法思想 三、算法步骤 四、代码实现 五、复杂度 💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:探索数据结构与算法 一、 引言 希尔排序(Shell Sort)是插入排序的一种更高效的改进版本&#x…

vulnhub靶机:Skytower

下载 下载地址:https://www.vulnhub.com/entry/skytower-1,96/ 导入靶机 解压发现是VirtualBox格式的,下载一个VirtualBox:Downloads – Oracle VirtualBox 选择解压后的vbox文件,然后点击左上角管理 点击导出虚拟电脑&#xff…

Datawhale------Tiny-universe学习笔记——Qwen

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说,猛一听这个名字首先会一懵:Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍:Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

卡尔曼滤波中Q和R与噪声的关系

卡尔曼滤波 一种用于估计系统状态的递归滤波器,通过融合传感器测量和系统模型,提供系统状态的最优估计。 Q和R是什么 在卡尔曼滤波中,Q和R分别表示过程噪声和测量噪声的协方差矩阵。 Q Q Q矩阵(过程噪声协方差矩阵)…

电子连接器温升仿真教程 一

电子连接器温升是指电子连接器的所有端子在施加额定电载荷的情况下,经过一段时间后,达成热平衡,连接器局部温度不再继续升高,此时规定测试点的温度与测试环境温度的差值。连接器的温升规格值因其应用环境不同,而不同。工业应用,且不与人体接触的电子连接器一般允许温升会…

日系编曲:电吉他音色制作 拾音器选择 电吉他音色制作逻辑 音箱分类 效果器单块分类

拾音器选择 拾音器:获取琴弦震动产生电信号经过线材传输到音箱(amp)使听众听到 一般的电吉他分为三块和两块拾音器,挡位分为三档或五档 Bridge(琴桥拾音器):声音更加清晰,音色更突…

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入

一,初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录,程序中操作文件和目录,都可以通过File类来完成。 通过这个File对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获…

第3步VM的虚拟机无法用网络安装直接改用CDROM镜像包安装软件

精简版的CentOS只有ip add可用 ping命令可用其它软件版本太低都不能用,改用光盘镜像来安装软件。 步骤:1、修改Vm的设置,将光盘映像改为ISO文件。 步骤:2、在centos挂载cdrom 步骤:3、挂载成功后直接安装软件 发现软件…

认知杂谈68《燃爆!兄弟萌不可错过的人生开挂宝典》

内容摘要​: 生活如舞台,我们要做自己人生的导演兼主演。实现自我成长需打牢基础,如读《认知觉醒》等书并制定成长计划。 要向上生长,定短期和长期目标,学新技能、提升沟通能力,可借助在线平台和社群。用番…

面试经典150题——多数元素

目录 题目链接:169. 多数元素 - 力扣(LeetCode) 题目描述 示例 提示: 解法一:哈希表 Java写法: C写法: 解法二:它就在那里 Java写法: C写法: 解法…