Hybrid Homomorphic Encryption:SE + HE

参考文献:

  1. [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.
  2. [MJS+16] Méaux P, Journault A, Standaert F X, et al. Towards stream ciphers for efficient FHE with low-noise ciphertexts[C]//Advances in Cryptology–EUROCRYPT 2016: 35th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Vienna, Austria, May 8-12, 2016, Proceedings, Part I 35. Springer Berlin Heidelberg, 2016: 311-343.
  3. [CDK+21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2021: 460-479.
  4. [CHK+21] Cho J, Ha J, Kim S, et al. Transciphering framework for approximate homomorphic encryption[C]//International Conference on the Theory and Application of Cryptology and Information Security. Cham: Springer International Publishing, 2021: 640-669.
  5. [DGG+21] Dobraunig C, Grassi L, Guinet A, et al. Ciminion: symmetric encryption based on toffoli-gates over large finite fields[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2021: 3-34.
  6. [HKL+22] Ha J, Kim S, Lee B H, et al. Rubato: Noisy ciphers for approximate homomorphic encryption[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2022: 581-610.
  7. [DGH+23] Dobraunig C, Grassi L, Helminger L, et al. Pasta: A Case for Hybrid Homomorphic Encryption[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2023, 2023(3): 30-73.

文章目录

  • HHE
  • LWE-Native Encryption
  • Filter Permutator & FLIP
    • Filter Permutator
    • FLIP
  • RtF Framework & HERA
    • RtF Framework
    • HERA
  • Noisy Symmetric Ciphers & Rubato

HHE

[NLV11] 实现了 BV 算法,研究同态加密的实用性。为了解决 HE 密文规模太大的问题,他们提出了 Hybrid Homomorphic Encryption / Transciphering Framework,组合使用对称加密(SE)和同态加密(HE)。

对于 Client-Server Model,如图所示:

在这里插入图片描述

HHE 关注的场景:

  • 2PC 场景(client + server),client 的计算/通信能力受限(云计算),或者 server 具有私有函数(机器学习
    1. client 生成 SE 密钥,以及 HE 公私钥,发布公钥
    2. client 使用 SE 加密数据,并使用 HE 加密 SE 的密钥,发送两者给 server
    3. server 先同态解密 SE 密文,然后同态计算,最后发送 HE 密文给 client
    4. client 解密 HE 密文,获得计算结果
  • MPC 场景(data providers + key holders + evaluators),可用于数据的秘密收集(物联网
    1. key holders(分布式)生成 HE 公私钥,发布公钥
    2. data providers 生成各自的 SE 密钥,使用 SE 加密数据,并使用 HE 加密 SE 的密钥,发送两者给 evaluators
    3. evaluators 先同态解密 SE 密文,然后同态计算,最后发送 HE 密文给 key holders
    4. key holders(分布式)解密 HE 密文,获得计算结果

LWE-Native Encryption

[CDK+21] 使用 Galois 自同构实现了 RLWE 密文的相位某些系数的消除,于是可以把 LWE 密文嵌入到 RLWE 密文,然后使用 FFT-style 算法实现了多个 LWE 密文的打包(LWEs-to-RLWE

基于此,[CDK+21] 建议在云计算场景中,使用对称版本的 Regev 加密方案。由于 LWE-based 都是 FHE 友好的,可以较为自然地在 RLWE 密文下同态解密(只需计算线性部分,不必纠错)。

  1. client 使用 PRF 生成各个 LWE 密文的随机带, a j = P R F ( s e e d , j ) ∈ Z q N a_j = PRF(seed, j) \in \mathbb Z_q^N aj=PRF(seed,j)ZqN
  2. client 将消息 m j ∈ Z t m_j \in \mathbb Z_t mjZt 随机编码为 μ j ∈ Z q \mu_j \in \mathbb Z_q μjZq(携带高斯噪声),计算 b j = ⟨ a j , s ⟩ + μ j b_j = \langle a_j, s\rangle + \mu_j bj=aj,s+μj
  3. client 发送的 SE 密文形如 ( s e e d , b 0 , b 1 , ⋯ ) (seed, b_0, b_1, \cdots) (seed,b0,b1,),具有较低的 ciphertext expansion factor(但是 b j b_j bj 带噪,密文扩张总是不可避免),具体为 log ⁡ q log ⁡ t + ∣ s e e d ∣ \frac{\log q}{\log t} + |seed| logtlogq+seed
  4. server 同态线性解密,获得 μ j \mu_j μj 带噪的消息编码,然后直接同态运算(需要 Regev 本身就具有足够的 Levels,也就是 log ⁡ q ≫ log ⁡ t \log q \gg \log t logqlogt
  5. server 将得到的 RLWE 密文降低到最低的 Level,返回给 client

Filter Permutator & FLIP

[MJS+16] 考虑了两种对称加密,

  • 分组密码(Block ciphers):各个消息分组上,解密电路的深度是固定的,但是由于使用了大轮数迭代,乘法深度很高。
  • 流密码(Stream Ciphers):初始的消息分组,解密电路的深度很小,但随着密钥流的生成,乘法深度会越来越高。

综合考虑两者的优缺点,[MJS+16] 组合它们设计了新的流密码,即满足分组密码的常数深度,又满足流密码的较浅深度

Filter Permutator

首先,他们提出了一个新的流密码结构,被称为 Filter Permutator Construction,它包含三部分:密钥寄存器、随机置换生成器(randomized linear layers)、滤波器(简单的非线性运算)。如图所示,

在这里插入图片描述

密钥流的每一个比特都是根据 F ∘ P i ( K ) F \circ P_i(K) FPi(K) 计算出来的,电路深度是常数的,并且没有大轮数迭代

FLIP

接着 [MJS+16] 构造了一族 Filter Permutators,称之为 FLIP。这个流密码是工作在布尔值 Z 2 \mathbb Z_2 Z2 上的(如果 FHE 的自然明文空间是 Z t , t ≥ 3 \mathbb Z_t, t\ge 3 Zt,t3,那么布尔电路的乘法深度会很高)。

首先,他们定义了布尔函数的直和,并证明了它可以将两个函数的 Non Linearity, Resiliency, Algebraic Immunity, Fast Algebraic Immunity 等安全属性组合并增强(细节请看原文)。

在这里插入图片描述

然后定义了三种简单的布尔函数,并给出了它们的安全属性(略):

在这里插入图片描述

[MJS+16] 使用 Filter Permutator Construction 去构造流密码,使用的滤波器 F : Z 2 n 1 + n 2 + n 3 → Z 2 F: \mathbb Z_2^{n_1+n_2+n_3} \to \mathbb Z_2 F:Z2n1+n2+n3Z2 是上述三种布尔函数的直和,令 n 1 , n 2 , n , k , n 3 = n k ( k + 1 ) 2 n_1,n_2,n,k,n_3 = \frac{nk(k+1)}{2} n1,n2,n,k,n3=2nk(k+1) 是合适的整数,
F ( x 0 , ⋯ , x n 1 + n 2 + n 3 − 1 ) = L n 1 ⊕ Q n 2 / 2 ⊕ ⨁ i = 1 n T k F(x_0,\cdots,x_{n_1+n_2+n_3-1}) = L_{n_1} \oplus Q_{n_2/2} \oplus \bigoplus_{i=1}^{n} T_k F(x0,,xn1+n2+n31)=Ln1Qn2/2i=1nTk
注意到函数直和的各个子函数的变量都是相互独立的,且函数求值结果是通过 XOR 组合的,因此这个滤波器 F F F 的乘法深度很低。

对于随机置换的生成,可以使用 Knuth / Fisher–Yates shuffle Algorithm。如果它接入一个 true random generator,那么它生成的随机置换是等概率的。

from random import randint
def randomize (arr, n):for i in range(n-1,0,-1): # From n downto 1j = randint(0,i+1) # Pick a random index from 0 to iarr[i],arr[j] = arr[j],arr[i] # Swap arr[i] with the element at random indexreturn arr

RtF Framework & HERA

[CHK+21] 注意到真实世界的数据主要是浮点数,但是 CKKS 和 SE 并不兼容

  • CKKS 支持定点复数的带噪算术,SE 解密则需要精确的模运算
  • 如果把 SE 强行迁移到复数域上,由于 SE 本质上就是将消息 m i m_i mi 经过某个带密钥的多项式求值为密文 c i c_i ci,但是对于正确的密钥 k k k 总会有 ∥ E k ( m i ) − c i ∥ 2 = 0 \|E_k(m_i)-c_i\|_2 = 0 Ek(mi)ci2=0这是以 k k k 为根的复数域多项式。利用牛顿迭代法或者梯度下降法,容易求出近似的根。

他们提出了 RtF (Real-to-Finite-field) framework,组合使用 BFV 以及 CKKS,并设计了一个 BGV/BFV 友好的 SE 方案,称为 HERA

RtF Framework

假设 BFV 的明文模数是 t t t,[CHK+21] 的思路是:将实数 m ∈ R m \in \mathbb R mR 缩放为 Z t \mathbb Z_t Zt 中元素,然后使用某个 Z t \mathbb Z_t Zt 上的 SE 加密它。于是可以使用 BFV 高效地解密 SE 密文,然后使用 CKKS 自举算法实现密文的切换。[CHK+21] 在 BFV 的 slot 上计算密钥流,在 BFV 的 coeff 上解密出消息,最后转换到 CKKS 的 slot 上计算函数。

框架为:

在这里插入图片描述

这里要求 BFV 和 CKKS 共享:分圆环维度 N N N、模数链 { q i } i \{q_i\}_i {qi}i、公私钥 ( p k , s k ) (pk,sk) (pk,sk)。假设 SE 密钥是 k ∈ Z t n k \in \mathbb Z_t^n kZtn,我们要求 n ∣ l n \mid l nl,这里的 l ∣ N l \mid N lN 是 BFV 的明文槽个数,对应的 CKKS 也是子环 Y = X N / l Y=X^{N/l} Y=XN/l 上的稀疏自举(明文槽个数为 l / 2 l/2 l/2)。[CHK+21] 定义了密钥 k k k(列矢)的重复编码,
C o n c a t ( k ) = ( k ∥ k ∥ ⋯ ∥ k ) ∈ Z t n × B Concat(k) = (k\|k\|\cdots\|k) \in \mathbb Z_t^{n \times B} Concat(k)=(kkk)Ztn×B
并提出了两种 BFV 打包方式:

  • column-wise packing,设置 B = l / n B=l/n B=l/n,把这个矩阵按列展开为 Z t l \mathbb Z_t^l Ztl 列矢,加密到单个 BFV 密文中。如果要计算 A ⋅ k A \cdot k Ak,其中 A ∈ Z t n × n A \in \mathbb Z_t^{n \times n} AZtn×n,首先令 A ′ = I l / n ⊗ A A'=I_{l/n} \otimes A A=Il/nA,然后使用 BSBG 对角线方法(或者 Pegasus 的瓷砖算法),同时计算 l / n l/n l/n 个副本 A ⋅ k A \cdot k Ak,这需要 Rotate 操作。
  • row-wise packing,设置 B = l B = l B=l,把这个矩阵的每个 Z t l \mathbb Z_t^l Ztl 行矢分别加密到 n n n 个 BFV 密文中。如果要计算 A ⋅ k A \cdot k Ak,其中 A ∈ Z t n × n A \in \mathbb Z_t^{n \times n} AZtn×n,那么就简单计算 n n n 个密文的乘加(并行 l l l 个副本),不需要 Rotate 操作。

它们被用于 SE 在 HE 中的同态解密。[CHK+21] 采用任意的 Z t \mathbb Z_t Zt 上流密码,算法为:

在这里插入图片描述

在这里插入图片描述

Client 将消息分组为 m i ∈ R n m_i \in \mathbb R^n miRn,编码到 Z t n \mathbb Z_t^n Ztn 上使用 SE 分别加密。对应的 Keystream 是根据 k ∈ Z t n k \in \mathbb Z_t^n kZtn 以及 n c i ∈ { 0 , 1 } λ nc_i \in \{0,1\}^\lambda nci{0,1}λ 生成的。Client 除了发送 k k k 的 HE 密文以及 m i m_i mi 的 SE 密文外,还需要发送分别使用的 Nonce 给 Server 去同态重构密钥流。

HERA

[CHK+21] 设计了一种 FHE-friendly 流密码,叫做 HERA,它的自然运算是 Z t \mathbb Z_t Zt 上的算术运算,且它的设计目标是乘法深度尽可能低(但是乘法复杂度会较高)。SE 的基本设计框架是:线性运算(扩散)、非线性运算(S-box,抵御求逆)、轮密钥加(带密钥的变换),如此重复若干轮。

[MJS+16] 使用了 randomized linear layers 以及很简单的非线性布尔函数,如果简单地将 FILP 迁移到 Z t \mathbb Z_t Zt 上,由于 BFV 中的(常数)矩阵乘法的计算开销需要大量的 KS 操作,导致线性层的复杂度甚至比简单非线性层更高。为了减小线性层的开销,[CHK+21] 则是使用了 randomized key schedule(随机化的轮密钥编排)以及固定且稀疏的线性层,非线性运算使用了简单的立方函数,最终构造了 AES-like 的流密码(似乎就是 CTR 模式的分组密码?只是不需要求逆)

HERA 的构造如下,

在这里插入图片描述

对于密钥编排,HERA 使用 nonce 和 XOF 来生成随机串 r c = ( r c 0 , r c 1 , ⋯ , r c r ) ∈ ( Z t 16 ) r + 1 rc=(rc_0,rc_1,\cdots,rc_r) \in (\mathbb Z_t^{16})^{r+1} rc=(rc0,rc1,,rcr)(Zt16)r+1,定义如下的轮密钥加,其中的 + , ⋅ +, \cdot +, 都是 component-wise 运算,
A R K [ k , n c , i ] ( x ) = x + k ⋅ r c i ARK[k,nc,i](x) = x + k \cdot rc_i ARK[k,nc,i](x)=x+krci
对于线性层,HERA 使用 MDS matrix(Maximum Distance Separable)分别执行列混淆以及行混淆。MDS matrix 具有最大的分支数 n + 1 n+1 n+1(branch number),因此具有很好的扩散性。

在这里插入图片描述

[CHK+21] 设置 HERA 的状态是 Z t 4 × 4 \mathbb Z_t^{4 \times 4} Zt4×4(排列 16 个数),于是直接使用了 AES 中的 MDS 矩阵(从 G F ( 2 8 ) GF(2^8) GF(28) 迁移到 Z t \mathbb Z_t Zt),

在这里插入图片描述

对于非线性层,HERA 使用简单的立方函数 x 3 x^3 x3 作为 S-box,定义
C u b e ( x ) = ( x 0 3 , x 1 3 , ⋯ , x 15 3 ) Cube(x) = (x_0^3, x_1^3,\cdots,x_{15}^3) Cube(x)=(x03,x13,,x153)
需要满足 gcd ⁡ ( 3 , t − 1 ) = 1 \gcd(3,t-1)=1 gcd(3,t1)=1,使得 x 3 x^3 x3 Z t ∗ \mathbb Z_t^* Zt 上可逆,从而 S-box 是个双射。

对于加密模式,HERA 采用了 inner-counter mode,对于任意的 k > 0 k>0 k>0,定义计数器 c t r = 0 , 1 , ⋯ , k − 1 ctr = 0,1,\cdots,k-1 ctr=0,1,,k1,计算的密钥流是:
z [ c t r ] = H E R A [ k , n c ∥ c t r ] ( i c ) z[ctr] = HERA[k, nc\|ctr](ic) z[ctr]=HERA[k,ncctr](ic)
固定的常数向量 i c = ( 1 , 2 , ⋯ , 16 ) ∈ Z t 16 ic=(1,2,\cdots,16) \in \mathbb Z_t^{16} ic=(1,2,,16)Zt16,并要求 t ≥ 17 t \ge 17 t17 是素数。

经过多种的现有攻击的分析,[CHK+21] 给出了一些实例化的参数集。为了实现 80 80 80 比特安全强度,迭代轮数为 r = 4 r=4 r=4;为了实现 128 128 128 比特安全强度,迭代轮数为 r = 5 r=5 r=5

Noisy Symmetric Ciphers & Rubato

[HKL+22] 观察到 SE 和 HE 基于不同的安全原理,

  • conventional SE 需要时间的检验,使用了关于 key 高次的多项式求逆
  • LWE-based SE 基于困难问题和安全归约,使用 noise 抵御代数攻击

他们提出了两者的权衡,构造了新的 Rubato,它使用一个 low-degree keyed function E k : Z q n → Z q l E_k: \mathbb Z_q^n \to \mathbb Z_q^l Ek:ZqnZql,并假设形如 ( a , E k ( a ) + e ) ∈ Z q n × Z q l (a, E_k(a)+e) \in \mathbb Z_q^n \times \mathbb Z_q^l (a,Ek(a)+e)Zqn×Zql 的样本是计算均匀的,其中 a a a 由 XOF 生成, e e e​ 是高斯噪声。为了分析它的安全性,需要同时使用 symmetric cryptanalysis 以及 LWE cryptanalysis(感觉 SE 的设计好随便啊)。这里的 q q q 是 RtF 框架中 BFV 的明文模数,而非密文模数。

Rubato 延续了 HERA 的设计结构(随机化密钥编排 + 固定的 MSD 矩阵),但不再使用 Cube 非线性层,而是使用了 [DGH+23] 所建议的另一种 Feistel-Like S-Box。由于这个 Feistel 求逆是简单的(次数很低,无法抵御 MITM 代数攻击),因此他们还采取了 [DGG+21] 的截断技术(直接丢弃部分信息,则求逆必须枚举)。

在这里插入图片描述

它直接采用了 HERA 的随机化密钥编排 A R K [ k , n c , i ] ( x ) = x + k ⋅ r c i ARK[k,nc,i](x)=x+k\cdot rc_i ARK[k,nc,i](x)=x+krci,并推广了状态 x ∈ Z q n x \in \mathbb Z_q^n xZqn 的大小为 n = v 2 n=v^2 n=v2(这里 q q q 是 HE 密文模数,而在 HERA 中使用的是 Z t 16 \mathbb Z_t^{16} Zt16 明文模数),使用 v v v 阶 MSD 矩阵去执行状态的混淆。为了计算效率,一般会寻找短的稀疏的 MSD 矩阵。Rubato 给出了 v = 4 , 6 , 8 v=4,6,8 v=4,6,8 的选取建议,

在这里插入图片描述

对于非线性层,Rubato 使用了 Feistel Network via a Quadratic Function,定义为:
F e i s t e l ( x ) = ( x 1 , x 2 + x 1 2 , ⋯ , x n + x n − 1 2 ) Feistel(x) = (x_1,x_2+x_1^2,\cdots, x_n+x_{n-1}^2) Feistel(x)=(x1,x2+x12,,xn+xn12)
它是双射,且次数仅为 2 2 2,这比 Cube 的次数更低,并且混合了相邻的状态分量。这个 Feistel 的求逆很容易,为了抵御 MITM 代数攻击,执行完 AES-like 轮函数之后,还要执行截断函数 T r n , l ( x ) = ( x 1 , ⋯ , x l ) Tr_{n,l}(x) = (x_1,\cdots,x_l) Trn,l(x)=(x1,,xl) 以抵御求逆(并且密码设计中永远不执行求逆运算)。

在输出密钥流之前,采样离散高斯噪声 e 1 , ⋯ , e l ← D α q e_1,\cdots,e_l \gets \mathcal D_{\alpha q} e1,,elDαq,定义运算:
A G N ( x ) = ( x 1 + e 1 , ⋯ , x l + e l ) ∈ Z q l AGN(x) = (x_1+e_1,\cdots, x_l+e_l) \in \mathbb Z_q^l AGN(x)=(x1+e1,,xl+el)Zql
也就是说,Rubato 产生的密钥流是带噪的,它只能用于 RtF Framework 中(虽然是在 BFV 上解密,但最终是在 CKKS 上的近似运算),而不能用到精确的 FHE 上面。

Rubato 也采取了 inner-counter mode,密钥流是 z [ c t r ] = R u b a t o [ k . n c ∥ c t r ] ( i c ) z[ctr] = Rubato[k. nc\|ctr](ic) z[ctr]=Rubato[k.ncctr](ic),其中 i c = ( 1 , 2 , ⋯ , n ) ∈ Z q n ic = (1,2,\cdots,n) \in \mathbb Z_q^n ic=(1,2,,n)Zqn,一般地 q ≫ n q \gg n qn。给定消息 m i ∈ R l m_i \in \mathbb R^l miRl,密文是
c i = ⌊ Δ ⋅ m i ⌉ + z [ i ] ( m o d q ) c_i = \lfloor \Delta \cdot m_i\rceil + z[i] \pmod{q} ci=Δmi+z[i](modq)
缩放因子 Δ ∈ R \Delta \in \mathbb R ΔR,假如 ∥ m ∥ 1 ≤ s \|m\|_1 \le s m1s,则选取 Δ = q 16 s \Delta = \dfrac{q}{16s} Δ=16sq(没说为什么这么选)。由于 z [ i ] z[i] z[i] 带噪,因此 BFV(明文模数 q q q,密文模数 Q Q Q)只能解密出缩放的近似值 ⌊ Δ ⋅ m i ⌉ + e i ∈ Z q \lfloor \Delta \cdot m_i\rceil + e_i \in \mathbb Z_q Δmi+eiZq,不过接着就切换到 CKKS 密文上成为 Q 0 q ( ⌊ Δ ⋅ m i ⌉ + e i ) + e B F V + e b o o t ∈ Z Q ′ \dfrac{Q_0}{q}\big(\lfloor \Delta \cdot m_i\rceil + e_i\big) + e_{BFV} + e_{boot} \in \mathbb Z_{Q'} qQ0(Δmi+ei)+eBFV+ebootZQ(首先 BFV 模切换到最低的 Q 0 Q_0 Q0,接着自举提升 CKKS 的密文模数到 Q ′ Q' Q)。由于我们是用 CKKS 做近似计算的,Rubato 引入的噪声 e i e_i ei 仅略微降低了明文精度,但不影响使用。

经过安全性分析后,[HKL+22] 给出了同一个安全级别下的不同参数集, 80 80 80 比特安全性的迭代轮数最低为 r = 2 r=2 r=2,而 128 128 128 比特安全性的迭代轮数是 r ∈ { 2 , 3 , 5 } r \in \{2,3,5\} r{2,3,5},乘法深度比 HERA 更低。

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

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

相关文章

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标:1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器&#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池?为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1)为了避免区域间的环路,OSPF规定不同区域间的路由交互只能通过ABR实现。 2)ABR是连接到骨干区域的,所以在区域设计上规定,所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…

C语言进阶:进阶指针(下)

一、 函数指针数组 我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组 那么函数有没有对应的指针数组呢? 如果有那应该怎么定义呢? 1. 函数指针数组的定义 我们说 函数指针数组的定义 应该遵循以下格式 int (*p[10])(); 首…

SpringBoot Aop使用篇

Getting Started SpringBoot AOP的实践 AOP相关的概念: Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类,比如日志、权限…

C++及QT的线程学习

目录 一. 线程学习 二. 学习线程当中,得到的未知。 1. 了解以下MainWindow和main的关系 2. []()匿名函数 有函数体,没有函数名. 3. join和detach都是用来管理线程的生命周期的,它们的区别在于线程结束和资源的回收。 4. operator()() 仿…

4G组网三相四线预付费电表-远程集中抄表

安科瑞薛瑶瑶18701709087/17343930412 DTSY1352 三相预付费电能表分别用于计量额定频率50Hz 的单、三相交流有功电能,具有预付费控制、负载控制、时间控制及 RS485 通信等功能,性能指标符合 GB/T17215.321-2008 标准。是改革传统用电体制&#xff0c…

杰理695的UI模式LED灯控制

UI模式LED灯修改每个模式对应的LED灯闪烁修改在ui_normal_status_deal(u8 *status, u8 *power_status, u8 ui_mg_para)

开源克隆声音的项目-OpenVoice V2

myshell的OpenVoice 出v2版本了 只需要上传一段20秒到5分钟之间的声音,就可以克隆声音。 单人讲话 没有背景噪音 时间在20秒至5分钟之间 本地部署我没有做,我在myshell的官网上测试了一下,可能是上传的音频有杂音,导致不是很清…

人机交互系统文本分类 text classification环节源码(E-commerce)

我把pre-trained model 下载到了本地 效果如下(到时候把代码中的sequence 和labels换成自己的text和分类就行了。): 源码见链接: https://download.csdn.net/download/qqqweiweiqq/89211553

2024年好用又便宜的云手机!哪款性价比高?

随着科技的飞速发展,云计算技术也在不断演进,而云手机作为其创新之一,已经开始在我们的生活中崭露头角。它通过将手机的硬件和软件功能移到云端,让用户能够借助强大的云计算资源完成各种任务。2024年,哪款云手机性价比…

Ubuntu关闭防火墙、关闭selinux、关闭swap

关闭防火墙 打开终端,然后输入如下命令,查看防火墙状态: sudo ufw status 开启防火墙命令如下: sudo ufw enable 关闭防火墙命令如下: sudo ufw disable 关闭selinux setenforce 0 && sed -i s/SELINUXe…

QML中使用正则表达式

我想在TextField控件中使用正则表达式,然后GPT4给出的回答是这样的: TextField {id: versionInputplaceholderText: qsTr("输入版本号")validator: RegExpValidator { regExp: /^[a-zA-Z0-9]*$/ } // 仅允许字母和数字width: 120 // 设置合…

SpringBoot中多数据源灵活切换解决方案

本篇内容介绍了“SpringBoot中如何使用Dynamic Datasource配置多数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 源码地址/文档说明 功能特性: 支持 数据源分组…

软件设计师-重点的创建型设计模式

一、简单工厂: 简单工厂模式属于创建型模式,但不属于23种设计模式之一。 软考中图 二、工厂方法: 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 结…

YOLOV5 TensorRT部署 BatchedNMS(engine模型推理)(下)

主要是在王新宇代码的基础上改进,引入对BatchedNMS的解码 文章目录 1. 修改yolov5.cpp2.修改yololayer.h1. 修改yolov5.cpp 首先增加全局变量,名字根据转onnx时修改的节点名字来,查看onnx文件可以看到,顺序不要弄错。 const char *INPUT_NAME = “images”; const char …

FFmpeg常用结构体、关键函数、ffplay.c分析

一、常用结构体: 1、AVFormatContext结构体: AVFormatContext是一个贯穿全局的数据结构,很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context,此结构包含了一个视频流的格式内容。其中存有AVIputFor…

抖音小店值得做吗?前期需要多少资金的投入?

大家好,我是电商糖果 这两天有位想做店的朋友,问了糖果一个问题。 他说开个体店是不是需要办理个体户营业执照。 我回答是的。 他又问办执照是不是需要花钱。 我说自己去工商局办理是免费的,找人代办市场上的价格一般在二百左右。 对方…

最大层内元素和

题目链接 最大层内元素和 题目描述 注意点 返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个树中的节点数在 [1, 10000]范围内-10^5 < Node.val < 10^5 解答思路 广度优先遍历树&#xff0c;使用队列存…

应用内竞价(Bidding)技术为什么一定要结合瀑布流广告分层+混合智能排序技术?

应用内竞价&#xff08;In-App Bidding或Header Bidding&#xff09;即在APP端实现竞价的优势显而易见&#xff0c;接入的所有广告平台按价格实时排序&#xff0c;价高者得&#xff0c;这样使得每次广告请求收益都是最大值&#xff0c;从而实现收益最大化。 竞价机制是买卖双方…