【密码学】CKKS全同态加密方案浅析

news2024/11/27 14:38:39

本文主要为翻译内容,原文地址:https://www.inferati.com/blog/fhe-schemes-ckks    

  

CKKS算法是2017年论文《Homomorphic Encryption for Arithmetic of Approximate Numbers》中提出的近似计算同态加密算法,论文的作者是Cheon等四位韩国研究者。算法早期因论文首字母缩写,称作HEAAN算法,其首个C++实现的库也作同名。后来为了加以区分,采用作者姓氏首字母,称为CKKS算法。  

  

CKKS的核心是把加密噪声视为近似计算误差的一部分,也就是解密出来的结果直接视为原始消息的近似值。如果误差噪声相比消息来说足够小,那么噪声就不会破坏消息,在加密之前,将消息乘以一个缩放因子扩大消息,这样就可以减少添加噪声带来的误差。由此,消息+噪声可以用来替代原消息。

  

当然,CKKS还使用了重线性化和重缩放技术来减小密文计算时的扩张问题(有点像BV11、BGV、BFV结合的思想)让密文规模呈线性增长而不是指数级以增大乘法次数,还能顺带消除LSB位上的噪声。

1、介绍

        CKKS,一种近似数字算术同态加密,又名HEAAN(Homomorphic Encryption for Arithmetic of Approximate Numbers),旨在为实数提供同态计算。其主要思想是将噪声(也称为误差 e)视为我们要加密的消息 μ(这里我们称为有效载荷)的一部分,噪声是出于安全目的在基于环学习错误(Ring-LWE)的全同态加密方案中引入的。有效载荷和噪声相结合生成我们要加密的明文(\mu+e)

        因此,加密过程将(\mu+e)作为输入,对我们的有效载荷的近似值进行加密,并生成一个密文。其背后的原理是,如果噪声的量级与有效载荷相比低得多,那么它可能对有效载荷或对有效载荷进行计算的结果没有明显影响。实际上,即使在不考虑加密的正常情况下,计算机也使用定点或浮点表示来处理实际数据。一些实际数据无法使用这些系统精确表示,我们所能做的就是通过标准截断或舍入程序以预定义的精度对其进行近似。这种近似会导致误差,这些误差在计算过程中会累积和扩大。但对于大多数实际情况,误差并不显著,因此最终结果是令人满意的。因此,我们可以将加密域中的RLWE 误差视为明文域中的截断或舍入误差。

        与其他全同态加密方案类似,在 CKKS 中,当我们对密文进行计算时,明文(包括有效载荷和误差)的量级会增长。如果我们将两个密文相加,增长是有限的,但如果我们将它们相乘,增长会更高。举个例子,\mu_1 = 2.75,\ \mu_2 = 3.17,\ \mu_1 \cdot \mu_2 = 8.7175。很明显,乘积中的数字位数增加了一倍。假设我们将精度固定在两位小数,乘积可以缩小 100 倍得到\hat{\mu}^× = 8.71(如果我们使用截断)或 \tilde{\mu}^× = 8.72(如果我们使用舍入)。一般来说,这两个值都是对乘积精确值的良好近似,在大多数实际场景中是足够的。在这个相当简化的例子中,精度只有两位小数,在 IEEE-754 单精度和双精度标准中,精度分别固定为 7 位和 15 位,提供了更准确的结果。

        在明文域中,缩小规模是一个简单的过程,但在加密域中通常非常昂贵。早期的解决方案建议将舍入函数近似为一个多项式,以便提取和去除加密值的低位数字[HS15, CH18]。我们知道全同态加密非常适合在加密数据上计算多项式,这使得这种方法合理且易于实现。不幸的是,由于这些多项式的次数很高,这种方法在计算上很昂贵,在一般场景下可能不实用。然而,在 CKKS 之后,这一切完全改变了。

        CKKS 方案的核心是一种称为 RESCALE 的机制,该机制用于减小明文(有效载荷和噪声)的量级。这个过程可以非常高效地模拟截断过程。CKKS引入了众所周知的全同态加密过程的MODSWITCH技术modulus switching的缩写,模数转换),正如我们在前一篇文章【Introduction to the BGV encryption scheme】中所描述的,它主要在 BGV 方案中使用,以此来实现这种重新缩放的功能事实上,人们很快就会注意到这两个方案之间的巨大相似性。

        CKKS 解密以足够的精度生成有效载荷(\mu+e)的近似值。只有当误差的大小远小于有效载荷的大小时,这才是可以接受的。幸运的是,通常情况下是这样的 —— 鉴于该方案被合理地参数化 —— 因为如后文所述,噪声是可以被控制的。

        CKKS 重缩放提供了一种自然的方式来对加密实数进行计算,这与其他对整数进行计算全同态加密方案(如 FV [FV12]或BGV[BGV14])不同。应该指出的是,可以使用 BFV 和 BGV 对加密实数进行同态计算,但这需要复杂(并且通常效率低下)的编码过程[CSVW16]。此外,在计算过程中对结果进行缩小相当困难。

图1. BGV 和 CKKS 方案的密文结构,MSB代表最高有效位 [CKKS17]

        为了了解 CKKS 的工作原理,图 1 可能会有所帮助。该图展示了 BGV 和 CKKS 的密文结构。BGV 和 CKKS(甚至对于 BFV)中的密文通常是一对多项式。一个多项式包含有效载荷信息,而另一个用于解密。这些多项式的系数受整数q的限制,被称为密文系数模数,也就是说,它们可以取 0 到q-1之间的任何值。为了便于说明且不失一般性,假设这些多项式的次数为 0。在图 1 中,我们展示了 BGV 和 CKKS 方案中包含有效载荷信息的多项式密文结构。

BGV密文结构

        首先,我们来研究 BGV 密文结构。记住这个类比并将密文想象成一个有界空间是很有用的。绿色区域是实体可能存在的开放空间。我们密文中的空间由 q 的值界定。有两个主要实体特别值得关注,即有效载荷 μ 和噪声 e。在 BGV 中,这两个组件是分开的,并且在计算的任何阶段都不应相互作用,否则有效载荷将丢失。这种分离只需在加密期间将噪声分量 e 按 t 进行缩放即可实现。这将如图 1(BGV ctxt)所示将误差向左移动 t。有效载荷可以在 t 界定的空间内自由移动,即取 0 到 t - 1之间的任何值。在同态计算过程中也应保持这一点。噪声分量 e 可以在 t 到q-1 的空间内自由移动(实际上小于这个范围,但为了使说明简单,我们不深入探讨细节)。只要误差或有效载荷位于它们各自的空间内,解密就有效,并且可以零精度损失地保留预期的有效载荷或计算结果。

CKKS密文结构

        CKKS 方案中的密文结构略有不同。首先,两个主要成分 μ 和 e 组合形成一个单一实体。噪声是有效载荷的一部分。实际上,加密后无法将这两个成分(分离为它们的确切值)。这个更大的实体现在可以在 q 界定的空间中自由移动。人们可能会合理地怀疑,将 μ 和 e 组合可能会扭曲或损坏有效载荷,特别是如果有效载荷的量级很小(与 e 同阶)。这是一个合理的担忧,解决这个问题很简单,CKKS 通过一个参数(称为比例因子 ∆)来缩放有效载荷。这将把有效载荷的最高有效位向左移动,使其离 e 更远。假设 μ 的最低有效位在加上 e 后会被扭曲,但并不太重要,在实践中这确实是如此。为了帮助你理解为什么会这样,让我们来做下面的例子。

示例1.1:

\mu = \pi = 3.14159265358979323846......e = 20\Delta = 10^6。假设我们在缩放后使用截断来去除最低有效数字。

我们有 \Delta \bullet \mu + e = 3141592 + 20 = 3141612,这仍然是对缩放有效载荷的良好近似。

如果我们想要检索原始有效载荷,我们可以简单地除以比例因子。我们可以得到 3141612/10^6 = 3.141612 ,一般来说,这仍然是 π 的一个很好的近似值。如果我们使用更大的 ∆,我们可以得到一个更好的近似值。

        在我们更深入地具体描述 CKKS 原语之前,复习一下定点算术会很有好处,因为 CKKS 所做的实际上是在加密域中模拟定点算术。我们请读者参考附录 A 以了解定点算术的概述。近似计算主要分为两类定点运算和浮点运算,区别在于缩放因子是否固定。CKKS方案采用的是定点运算,更加稳定(浮点运算很复杂,很难确定位的变化)。

2、明文和密文空间

        在CKKS中,明文空间和密文空间几乎相同。它们包含多项式环R_q =\mathbb Z_q[x]/f(x)的元素,其中 q 是一个称为系数模数的整数,f(x) 是一个称为多项式模数的多项式。 R_q的元素是系数受 q 限制的整数系数多项式。它们的次数也受 f(x) 的次数限制。文献中 f(x) 最常见的选择是f(x)=x^n + 1,其中n(称为环维度)是 2 的幂次方数。CKKS明文实例和密文实例之间的区别在于它们包含的环元素数量。一个CKKS明文实例包含一个环元素(多项式),而一个CKKS密文实例至少包含两个环元素。

        上一段可能被认为与 CKKS 最初提出的目的相矛盾,即对加密实数进行计算,因为明文是具有整数系数的多项式。需要注意的关键思想是,CKKS 提出了新的编码和解码(编解码器)技术(稍后将进行描述),用于将实数向量(更准确地说是复数向量)映射到明文空间,反之亦然。正如我们之前提到的,CKKS 模拟定点算术运算,这些运算可以通过整数运算在整数操作数上完成。

3、明文编码和解码

        CKKS 工作【CKKS17】的另一个主要贡献是一种新的编解码器方法,该方法将一个复数向量映射到单个明文对象,反之亦然。编码过程如下,给定一个长度为 \frac{n}{2} 的复数向量 z\in \mathbb C^{\frac{n}{2}},返回单个明文元素a\in R。解码通过获取一个明文元素并返回一个复数向量来进行反向编码。这是使用公式 1 完成的。映射\pi是复规范嵌入,它是傅里叶变换的一种变体。

公式1:

        现在应该很清楚 CKKS 编解码器方案与定点表示之间的联系。在我们对输入有效载荷进行编码时,会进行缩放。通过乘以 ∆ 完成,去除最低有效小数部分是通过四舍五入完成的。在解码中,我们逆转这个过程。在编码中乘以 ∆ 并四舍五入以及在解码中除以 ∆ 与我们在公式 15 中的定点编码所做的类似。 

公式15:

4、参数

到目前为止,我们遇到了参数n,q 和 ∆。CKKS 在其实例化中使用了以下额外的特定于环学习错误(Ring-LWE)的分布:

R_2:是用于从系数为 {-1,0,1} 的整数多项式中均匀采样的密钥分布。

\chi:是误差分布,被定义为在数域R上具有参数 \mu 和 \sigma 且受某个整数 \beta约束的离散高斯分布。根据同态加密标准的当前版本 [ACC^{+}_{18}],参数 (\mu,\sigma,\beta) 被设置为 (0,\frac{8}{\sqrt{2\pi}}\approx3.2,[6\cdot\sigma]=19)

R_{q}:是R_{q}上的均匀随机分布。

        关于参数 (q,n,\Delta ) 的选择,我们在BFV 文章【Introduction to the BFV encryption scheme】中所做的相同讨论也适用于这里【同时可以参考《全同态加密张量运算库解读 》关于参数的解读】。需要注意的一点是,q应该足够大以支持计算电路所需的乘法深度。给定q的值是固定的,n被确定为提供足够的安全级别。为此,可以使用 RLWE 硬度估计器 [APS15]

        我们注意到,与我们在第一篇文章中描述的 BFV 方案不同,CKKS 是一种尺度可变方案。这意味着在每个级别上,都有不同的系数模数。请记住,当我们执行同态乘法时,密文会按 ∆ 进行缩放。这会导致 q 的大小减小 ∆,我们最终会得到一个系数模数为 q'=\frac{q}{\Delta} 的环。因此,此后我们将级别 l 的系数模数表示为 q_{l},其中 1 \leq l \leq L,L 是新加密密文的级别。因此,我们的密文系数彼此之间的关系为: q_{L}>q_{L - 1}>...>q_{1}

5、密钥生成

        这个过程与 BFV 中的密钥生成过程非常相似。我们对秘密密钥 SK 进行采样,它是 R_2 中的一个元素,即一个次数为 n 的多项式,系数在 \{-1,0,+1\}中。

        公钥 PK 是一对多项式 (PK_{1}, PK_{2}),计算方式如下: PK_{1}=[-a \cdot SK+e]_{q_{L}} , PK_{2}=a \stackrel{\mu}{\leftarrow} R_{q_{L}}

        因此,a 是从R_{q_{L}} 中均匀采样得到的随机多项式,e 是从 \chi中采样得到的随机误差多项式。回想一下,符号 [\cdot]_{q_{L}} 意味着多项式算术应该在模 q_{L} 下进行。请注意,由于 PK_2\mathbb{R}_{q_{L}} 中,多项式算术也应该在环多项式模 (x^{n}+1) 下进行。

6、加密与解密

        为了在 R中加密一个明文消息 M(它是输入有效载荷向量的编码)。我们生成三个小的随机多项式,从 R_{2}中生成 u,从\chi中生成 e_{1} 和 e_{2},并返回在R_{q_{l}}^{2}中的密文C=(C_{1},C_{2}),如下所示:

C_{1}=[PK_{1}\cdot u + e_{1}+M]_{q_{l}};\ C_{2}=[PK_{2}\cdot u + e_{2}]_{q_{l}}

CKKS 中的加密与 BFV 中的加密的唯一区别在于我们不会用标量缩放 M。请注意,我们可以在任何级别 l 进行加密并生成密文。

解密是通过在层级 l 上使用密钥评估计算输入密文来生成明文消息的近似值: \hat{M}=\left[C_{1}+C_{2} \cdot SK\right]_{q_{l}}

我们将解密为何有效的证明留作读者的练习。你可能想要回顾我们的 BFV 文章,以获得一些应对这一挑战的帮助。

7、同态计算

        现在我们来描述在 CKKS 中同态操作是如何执行的。我们对两种操作感兴趣,即同态加法和同态乘法。前者与 BFV 非常相似。后者需要进行重缩放以保持计算精度不变。

EvalAdd

        与 BFV EvalAdd 类似,我们只需将输入密文中的相应多项式相加,如下公式所示。请注意,假定输入密文处于同一层且具有相同的规模。如果情况并非如此,我们需要将较高层的密文缩小规模,以使其与另一个密文的规模和层相匹配。

\begin{aligned} EvalAdd(C^{(1)}, C^{(2)})=([C_{1}^{(1)} + C_{1}^{(2)}]_{q_{l}},[C_{2}^{(1)} + C_{2}^{(2)}]_{q_{l}}) \\ =(C_{1}^{(3)}, C_{2}^{(3)})=C^{(3)}\end{aligned}

EvalMult

        同样,此过程与 BFV 中的 EvalMult 类似。推导也与我们在 BFV 中所做的类似,我们将其作为练习留给读者。我们仅展示如何在两个密文上计算 EvalMult,如下所示:

\begin{aligned} EvalMult\left(C^{(1)}, C^{(2)}\right)= & \left(\left[C_{1}^{(1)} \cdot C_{1}^{(2)}\right]_{q_{l}},\left[C_{1}^{(1)} \cdot C_{2}^{(2)}+C_{2}^{(1)} \cdot C_{1}^{(2)}\right]_{q_{l}}\right. \\ & {\left.\left[C_{2}^{(1)} \cdot C_{2}^{(2)}\right]_{q_{l}}\right)=\left(C_{1}^{(3)}, C_{2}^{(3)}, C_{3}^{(3)}\right)=C^{(3)} } \end{aligned}

        请注意, C^{(3)}包含 3 个多项式,这与输入密文不同;每个输入密文包含 2 个多项式。为了将C^{(3)}的大小减小到 2 个多项式,我们使用重线性化过程,该过程与我们在 BFV 中描述的相同,只是计算应在 R_{q_{l}}中进行。一旦我们应用重线性化过程,我们将得到一个未扩展的密文(即具有 2 个多项式),它加密乘积,但具有平方比例因子\Delta^{2}。实际上,在 CKKS 中,我们可以将具有不同比例因子\Delta_{1}\Delta_{2}的两个密文相乘,乘积将具有\Delta_{1} \bullet \Delta_{2}作为比例因子。这在明文域的定点算术运算中也是可能的。我们只需要确保乘积适合用于存储整数值的数据类型,并且不会发生环绕(整数溢出)。处理混合比例因子会使计算变得复杂,因为它需要跟踪比例因子。因此,为了使说明简单,我们坚持在整个计算过程中比例因子固定的情况。我们注意到,在执行 EvalMult 之前,密文的层级必须匹配。

8、重新缩放

        这个过程在我们第一篇文章【Introduction to the BFV encryption scheme】中讨论的尺度不变版本的 BFV 中并不存在。值得一提的是,BFV 也可以实例化为一个尺度可变方案。在这种情况下,可以使用一个称为 MODSWITCH 的过程在密文系数模数之间进行切换。CKKS 调整了 MODSWITCH 过程并将其称为 RESCALE。从数学上讲,它们是一样,但它们有两个不同的用途。在 CKKS 中使用它的主要目的通常是在乘法后减小比例因子,以与输入密文的比例因子相匹配。这个过程非常简单且计算效率高,它接受一个密文 C\in R_{q_{l}}^{2},并将其按比例因子 ∆ 进行缩小,以生成一个等效的密文 \hat{C}\in R_{q_{l - 1}}^{2},对相同的明文进行加密,但具有减小的比例因子和减少的噪声。这个过程模拟了公式18 中的重新缩放步骤 (\frac{1}{2f}),但在密文域上执行。

RESCALE(C,\Delta)=\frac{1}{\Delta}\cdot[C_{1},C_{2}]_{q_{l}}=[\hat{C}]_{q_{l - 1}} (9)

公式18:

9、乘法理解

        正如我们之前所说,CKKS 在密文域中模拟定点算术。图 2 和图 3 有助于理解这是如何实现的。首先,我们研究同态乘法在 BGV 中是如何工作的。同样,我们假设我们的密文有 2 个多项式,每个多项式都有一个系数。此外,我们只关注包含有效载荷的多项式。

        如图 2 所示,乘法运算会使两个部分(有效载荷和噪声)的量级都增大。乘法结果包含在 t 所界定的空间,即在系数的低位比特中。乘积中的噪声也类似地增长,并从噪声预算中占用一些空间。如前所述,只要有效载荷和噪声是分开的,解密就能成功进行,并且可以无错误地检索有效载荷。为了对乘积密文结构有更多的直觉认识,让我们解下面这个代数方程:

\begin{aligned} \mu_{1} \cdot \mu_{2}+e_{\times}' & =\left(t e_{1}+\mu_{1}\right) \cdot\left(t e_{2}+\mu_{2}\right) \\ & =t^{2} e_{1} e_{2}+t\left(e_{1} \mu_{2}+e_{2} \mu_{1}\right)+\mu_{1} \mu_{2} \end{aligned}

        为了减少乘法运算后噪声的增长,BGV 包含一种称为 MODSWITCH 的方法,该方法以加密明文 M且系数模数为 q的密文 C作为输入,并返回一个等效密文 C',它加密相同的明文,但具有不同的系数模数 q'。通常, q'=\frac{q}{p}以减少噪声,其中 p是一个能整除 q的数。请注意,此操作在不影响有效载荷部分的情况下缩小了噪声。原因是我们选择 q' 使得等式 11 成立。换句话说,从 t 的角度来看,q和 q' 是相同的。更具体地说,我们可以如等式 12 所示进行推导。

q\equiv q'\bmod t             (11)

\begin{cases}q\equiv q'\bmod t\\q\equiv\frac{q}{p}\bmod t\\q\equiv q\cdot p^{-1}\bmod t\\1\equiv p^{-1}\bmod t\end{cases}  (12)

        从上述推导中,很容易看出乘以 p^{-1}等同于在模 t 意义下乘以 1。因此,只要满足等式 11 中指定的约束条件,有效载荷就不会受到 MODSWITCH 的影响。请注意,在调用 MODSWITCH 之后,密文从与 q 相关联的层级移动到与 q' 相关联的下一个较低层级。

        在 CKKS 中会发生稍微不同的情况。图 3 说明了 CKKS 同态乘法的内部工作原理。输入的明文,每个都包括有效载荷和噪声分量合并为一个块,进行相乘以生成因乘法误差而失真的有效载荷的乘积。我们可以像在 BGV 情况下那样推导出等式 13。

\Delta^{2}\mu_{1}\cdot\mu_{2}+e_{\times}'=(\Delta\mu_{1}+e_{1})\cdot(\Delta\mu_{2}+e_{2}) \\ =\Delta^{2}\mu_{1}\mu_{2}+\Delta(\mu_{1}e_{2}+\mu_{2}e_{1})+e_{1}e_{2} (13)

        这几乎就是我们想要的结果,只是乘积的有效载荷被缩放了。为了使乘积保持与输入相同的比例因子,即 \Delta,在 CKKS 的术语中,我们可以使用被称为 RESCALE 的 MODSWITCH,将乘积按进行缩小,并降低乘法噪声的量级。这一步骤与我们在 FPMul 公式18 中所做的类似,以保持比例因子和精度固定。请注意,对于 CKKS 来说,不再需要满足等式 11。

10、安全性

        如我们之前所见,CKKS 与其他基于 RLWE 的全同态加密方案(特别是 BGV)有显著的相似之处。然而,在安全性方面,最近的一项工作[LM21]强调了一个重要的区别。一种有效的被动攻击被提出针对 CKKS。该攻击可以由具有以下能力的被动敌手(Eve)发起:

  • 加密预言机这意味着 Eve 可以根据自己的意愿选择一些消息,并请求对其进行加密以生成有效的相应密文。这是一个非常合理的假设,因为全同态加密可以作为一种公钥加密方案进行部署,即加密密钥是公开可用的,任何人都可以访问它。即使全同态加密以私密模式部署,这仍然是一个合理的假设,并且它构成了一种常见攻击模型 —— 选择明文攻击下的不可区分性(IND-CPA)的基础。
  • 能够选择将进行同态求值的函数。这也是一个合理的假设,因为 Eve 可能是负责执行外包同态计算的服务器本身。
  • 解密预言机的访问权限:这意味着Eve可以选择一个密文并要求对其进行解密。这并不是一个非常牵强的假设,因为在计算后可能会共享解密结果。一些应用程序可能要求服务器知道某些解密后的值(由客户端在解密后以明文形式提供),以便继续进行应用程序。

        具有上述特性的攻击模型现在被称为IND-CPA+ [LM21]。它可以被视为一种介于 IND-CPA 和 IND-CCA 之间的攻击模型。虽然 BFV 和 BGV 在 IND-CPA+ 下都是安全的,但普通的 CKKS 却不是。无需深入细节,这种攻击利用了 CKKS 中解密函数的线性性质以及近似解密结果提供了关于RLWE 错误的线索这一事实。通过简单的代数运算,在一次攻击尝试中(在最佳情况下)就可以恢复整个秘密密钥。这种攻击的计算需求是找到R_q中一个多项式的逆,这可以使用扩展欧几里得算法的变体和贝祖等式轻松找到,在最坏情况下可以在O(n^2log n)的时间内解决。

        针对此漏洞,攻击的提出者建议通过在发布 CKKS 的解密结果之前向其添加额外的噪声来调整 CKKS 的解密函数【HElib库亦是通过修改解密函数来添加与密钥无关的噪声,以减轻这种攻击的风险】,以掩盖底层的 RLWE 噪声。一个开放的研究问题是如何找到添加噪声的严格界限,使得 CKKS 在 IND-CPA+ 下仍然安全,并且计算精度不受影响。

        我们注意到,如果解密结果永远不会被发布或与不受信任的各方共享,那么仍然可以毫无顾虑地使用普通 CKKS,而不用担心其安全性问题。

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

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

相关文章

Nginx + Lua + Redis:打造智能 IP 黑名单系统

Nginx Lua Redis:打造智能 IP 黑名单系统 nginx通过LuaRedis实现动态封禁IP 需求背景 在Web服务中,为了防止恶意用户或爬虫对服务器造成不必要的负载和潜在的安全威胁,我们可以通过设置动态IP黑名单来拒绝来自这些IP的请求。本文将详细介绍…

京东文字点选验证码识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 该文章模型已经上线ocr识别网站,欢迎测试!!,地址:https://yxlocr.windy-rain.cn/ocr/textclick/7 该验证码成品展示效果如下: 京东点选验证码数据集如下:…

2024最新的开源博客系统:vue3.x+SpringBoot 3.x 前后端分离

本文转载自:https://fangcaicoding.cn/article/54 大家好!我是方才,目前是8人后端研发团队的负责人,拥有6年后端经验&3年团队管理经验,截止目前面试过近200位候选人,主导过单表上10亿、累计上100亿数据…

局域网 docker pull 使用代理拉取镜像

局域网 docker pull 使用代理拉取镜像 1、需求: 我有win主机,上面装有代理可连接dockerhub;我另有linux主机,直接pull因墙失败,想走win的代理访问dockerhub拉镜像;两台主机在同一个局域网中; …

项目1 yolov5鱼苗检测计数

yolov5鱼苗检测 1. yolov5鱼苗检测1.1. 环境配置1.2 Predict1.3 Validate1.4 Train1.5 生成 ONNX 2 代码解析2.1 模型2.2 数据集2.3 损失函数2.4 训练2.5 预测 之前做的项目,再回顾一下 环境:GPU1卡,CPU4核,每显卡12GB&#xff0c…

音视频入门基础:FLV专题(18)——Audio Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页,如果某个Tag的Tag header中的TagType值为8,表示该Tag为Audio Tag: 这时StreamID之后紧接着的就是AudioTagHeader,也就是说这时Tag header之后的就是AudioTagHeader&…

(二 上)VB 2010 设计初步

目录 一、常用类应用 1.Console类控制台 2.窗体基本控件 二、面向对象程序设计 1.类和对象 2.对象的属性、方法、事件属 1.属性 2.方法 3.事件、事件过程 1.事件 2.事件过程 3.对象浏览器 三、.NET类库与命名空间 1.命名空间 常用命名空间 1.System命名空间 2.…

基于uniapp微信小程序的校园二手书交易系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

学习threejs,使用粒子实现下雪特效

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Points简介1.11 ☘️…

服务器文件访问协议

服务器文件访问协议 摘要NFS、CIFS、SMB概述SMBWindows SMBLinux SambaPython SMB NFS 摘要 本篇博客参考网上文档和博客,对基于网络的服务器/主机的文件访问、共享协议进行简要总结,完整内容将会不断更新,以便加深理解和记忆 NFS、CIFS、S…

基于ResNet50模型的船型识别与分类系统研究

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【LSTM模型实现光伏发电功率的预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理视频监控新选择

在数字化转型的浪潮中,视频监控作为安防领域的核心组成部分,正经历着前所未有的技术革新。随着技术的不断进步和应用场景的不断拓展,视频监控系统的兼容性、稳定性以及安全性成为了用户关注的焦点。NVR小程序接入平台/设备EasyNVR&#xff0c…

单元测试详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需…

基于 ThinkPHP+Mysql 灵活用工_灵活用工系统_灵活用工平台

基于 ThinkPHPMysql 灵活用工灵活用工平台灵活用工系统灵活用工小程序灵活用工源码灵活用工系统源码 开发语言 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示 一、企业管理后台 二、运用管理平台 三、手机端

【Linux内核揭秘】深入理解命令行参数和环境变量

文章目录 命令行参数什么是命令行参数main函数的参数 环境变量什么是环境变量常见的环境变量PATHHOMESHELLPWDOLDPWD 本地变量总结 命令行参数 什么是命令行参数 形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等…

Pytest-Bdd-Playwright 系列教程(4):基于敏捷的通用步骤定义

Pytest-Bdd-Playwright 系列教程(4):基于敏捷的通用步骤定义 前言一、项目结构二、通用步骤定义三、特性文件设计四、测试脚本实现五、运行测试总结 前言 在敏捷迭代中,为了适应快速、高频的交付,自动化测试框架的设计…

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等...

全文链接:https://tecdat.cn/?p38026 分析师:Fanghui Shao 在当今金融领域,风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户,还是信贷风控模型的构建,以及基于决策树的银行信贷风险预警,…

Ubuntu22.04环境搭建MQTT服务器

官网: https://mosquitto.org 1.引入库 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa2.升级安装工具 sudo apt-get update 3.安装 sudo apt-get install mosquitto 4.安装客户端 sudo apt-get install mosquitto-clients5.添加修改配置文件 进…

Python | Leetcode Python题解之第519题随机翻转矩阵

题目: 题解: class Solution:def __init__(self, m: int, n: int):self.m mself.n nself.total m * nself.map {}def flip(self) -> List[int]:x random.randint(0, self.total - 1)self.total - 1# 查找位置 x 对应的映射idx self.map.get(x,…

【linux网络编程】| socket套接字 | 实现UDP协议聊天室

前言:本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以, 我们主要就是要实现客户端以及服务端的逻辑代码。 那么, 接下来开始我们的学习吧。 ps:本节内容…