当前位置:网站首页>同态加密:CKKS原理之旋转(Rotation)
同态加密:CKKS原理之旋转(Rotation)
2022-08-02 03:25:00 【PenguinLeee】
这篇文章主要介绍了CKKS算法的数学基础,并且基于这个基础讲了一下CKKS算法中的旋转操作。
一些记号
我们记整数环为 Z \mathbb{Z} Z,有理数环为 Q \mathbb{Q} Q,实数域为 R \mathbb{R} R,复数域为 C \mathbb{C} C。
对正整数 m m m,记 Z m \mathbb{Z}_{m} Zm 为模 m m m剩余类。记 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 为 Z m \mathbb{Z}_{m} Zm 里有模乘法逆元的元素,则 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 是乘法群。
Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 里的元素,都是一些和 m m m 互素的元素,并且 ∣ Z m ∗ ∣ = ϕ ( m ) \left|\mathbb{Z}_{m}^{*}\right|=\phi(m) ∣Zm∗∣=ϕ(m),其中 ϕ \phi ϕ 是欧拉计数函数, ϕ ( m ) = l e n ( { k : 1 ≤ k ≤ m , g c d ( k , m ) = 1 } ) \phi(m) = len(\{k: 1 \leq k \leq m, gcd(k, m) = 1\}) ϕ(m)=len({ k:1≤k≤m,gcd(k,m)=1})。
记 [ m ] = { 0 , … , m − 1 } , m > 0 [m] = \{0, \ldots, m-1\}, m > 0 [m]={ 0,…,m−1},m>0。注意一个事儿: Z m \mathbb{Z}_{m} Zm 和 [ m ] [m] [m] 可不是一个东西啊!
单位原根和分圆多项式
单位根
m m m 是正整数, F F F 是域。 如果 ω ∈ F , ω m = 1 \omega \in F, \omega^{m}=1 ω∈F,ωm=1,那么 ω \omega ω 叫做 m m m 次单位根,等价于 ω \omega ω 是 X m − 1 ∈ F [ X ] X^{m}-1 \in F[X] Xm−1∈F[X] 的根。 如果没有比 ω \omega ω 更小的 m m m 次单位根,那么 m m m 次单位根 ω \omega ω 叫单位原根。
ω \omega ω 是 m m m 次单位根。那么,如果 k ≡ ℓ ( m o d m ) k \equiv \ell(\bmod m) k≡ℓ(modm),则 ω k = ω ℓ \omega^{k}=\omega^{\ell} ωk=ωℓ。则可以引出 m m m 次单位根的等价类。
ω \omega ω 是 m m m 次单位原根,则可以知道原根的构造:
单位根都可以写成 ω j , j ∈ Z m \omega^{j}, j \in \mathbb{Z}_{m} ωj,j∈Zm
单位原根都可以写成 ω j , j ∈ Z m ∗ \omega^{j}, j \in \mathbb{Z}_{m}^* ωj,j∈Zm∗
在复数域 C \mathbb{C} C 上看这个事, ω : = e 2 π i / m ∈ C \omega:=e^{2 \pi \mathbf{i} / m} \in \mathbb{C} ω:=e2πi/m∈C是 m m m 次单位原根。则多项式
Φ m ( X ) : = ∏ j ∈ Z m ∗ ( X − ω j ) ∈ C [ X ] \Phi_{m}(X):=\prod_{j \in \mathbb{Z}_{m}^{*}}\left(X-\omega^{j}\right) \in \mathbb{C}[X] Φm(X):=j∈Zm∗∏(X−ωj)∈C[X]
叫 m m m 次分圆多项式。显然 m m m 次分圆多项式首一且度为 ϕ ( m ) \phi(m) ϕ(m)。
几个结论:
- Φ m ( X ) ∈ Z [ X ] \Phi_{m}(X) \in \mathbb{Z}[X] Φm(X)∈Z[X]
- Φ m ( X ) \Phi_{m}(X) Φm(X) 在 Q \mathbb{Q} Q上不可约。
- X m − 1 = ∏ d ∣ m Φ d ( X ) X^{m}-1=\prod_{d \mid m} \Phi_{d}(X) Xm−1=∏d∣mΦd(X)
第三个结论给了 Φ m ( X ) \Phi_{m}(X) Φm(X) 的迭代形式。 Φ 1 ( X ) = X − 1 \Phi_{1}(X)=X-1 Φ1(X)=X−1。对于 m > 1 m>1 m>1,有
Φ m ( X ) = X m − 1 ∏ d ∣ m , d < m Φ d ( X ) \Phi_{m}(X)=\frac{X^{m}-1}{\prod_{ {d \mid m , d<m}} \Phi_{d}(X)} Φm(X)=∏d∣m,d<mΦd(X)Xm−1
分圆环 A , A q , A Q \mathcal{A}, \mathcal{A}_{q}, \mathcal{A}_{\mathbb{Q}} A,Aq,AQ, A R \mathcal{A}_{\mathbb{R}} AR
m > 1 m>1 m>1 为整数。记 Φ m ( X ) ∈ Z [ X ] \Phi_{m}(X) \in \mathbb{Z}[X] Φm(X)∈Z[X] 为 m m m 阶分圆多项式。
我们将要考虑商环 A : = Z [ X ] / ( Φ m ( X ) ) \mathcal{A}:=\mathbb{Z}[X] /\left(\Phi_{m}(X)\right) A:=Z[X]/(Φm(X)),即整系数多项式环模 Φ m ( X ) \Phi_{m}(X) Φm(X).
m > 1 m>1 m>1 为整数。考虑商环 A q = Z q [ X ] / ( Φ ˉ m ( X ) ) \mathcal{A}_{q}=\mathbb{Z}_{q}[X] /\left(\bar{\Phi}_{m}(X)\right) Aq=Zq[X]/(Φˉm(X)),其中 Φ ˉ m ( X ) \bar{\Phi}_{m}(X) Φˉm(X) 是 Φ m ( X ) \Phi_{m}(X) Φm(X) 塞到 Z q [ X ] \mathbb{Z}_{q}[X] Zq[X] 里的像,即把 Φ m ( X ) \Phi_{m}(X) Φm(X) 的系数在 Z q \mathbb{Z}_{q} Zq 里取模。
有时假设 q q q 和 m m m互素。此时, X m − 1 X^{m}-1 Xm−1 在 Z ‾ q \overline{\mathbb{Z}}_{q} Zq 上有 m m m 个不同的根,其中 Z ‾ q \overline{\mathbb{Z}}_{q} Zq 是 Z q \mathbb{Z}_{q} Zq的代数闭包,此时 Φ ˉ m ( X ) ∈ Z q [ X ] \bar{\Phi}_{m}(X) \in \mathbb{Z}_{q}[X] Φˉm(X)∈Zq[X] 同理,在 Z ‾ q \overline{\mathbb{Z}}_{q} Zq 有 ϕ ( m ) \phi(m) ϕ(m) 个不同的 m m m 次原根。
有时也会考虑 A Q : = Q [ X ] / ( Φ m ( X ) ) \mathcal{A}_{\mathbb{Q}}:=\mathbb{Q}[X] /\left(\Phi_{m}(X)\right) AQ:=Q[X]/(Φm(X)) 、 A R : = R [ X ] / ( Φ m ( X ) ) \mathcal{A}_{\mathbb{R}}:=\mathbb{R}[X] /\left(\Phi_{m}(X)\right) AR:=R[X]/(Φm(X)). 和 A \mathcal{A} A 类似。只不过把系数一换。
自然(canonical)嵌入和相关的无穷范数
ω : = e 2 π i / m ∈ C \omega:=e^{2 \pi \mathbf{i} / m} \in \mathbb{C} ω:=e2πi/m∈C 是 m m m 次单位原根,也是 Φ m ( X ) \Phi_{m}(X) Φm(X) 的根。
考虑两个多项式 f ( X ) , g ( X ) ∈ Z [ X ] f(X), g(X) \in \mathbb{Z}[X] f(X),g(X)∈Z[X] ,使得 f ( X ) ≡ g ( X ) ( m o d Φ m ( X ) ) f(X) \equiv g(X)\left(\bmod \Phi_{m}(X)\right) f(X)≡g(X)(modΦm(X))。
再考虑 ω j \omega^{j} ωj, j ∈ Z m ∗ j \in \mathbb{Z}_{m}^{*} j∈Zm∗,则 ω j \omega^{j} ωj 是 Φ m ( X ) \Phi_{m}(X) Φm(X)的根,则必有 f ( ω j ) = g ( ω j ) f\left(\omega^{j}\right)=g\left(\omega^{j}\right) f(ωj)=g(ωj)。这就有了一个等价类。不妨找个代表元 a \boldsymbol{a} a,使得 a ( ω j ) : = f ( ω j ) \boldsymbol{a}\left(\omega^{j}\right):=f\left(\omega^{j}\right) a(ωj):=f(ωj)。
那么 a ∈ A \boldsymbol a \in \mathcal{A} a∈A 就是多项式(函数) a a a 在所有单位原根下的(函数)值。可以把这个映射过程写作(注意,这个 j j j 是有序的!):
canon ( a ) : = ( a ( ω j ) ) j ∈ Z m ∗ \operatorname{canon}(\boldsymbol{a}):=\left(\boldsymbol{a}\left(\omega^{j}\right)\right)_{j \in \mathbb{Z}_{m}^{*}} canon(a):=(a(ωj))j∈Zm∗
定义无穷范数:
∥ a ∥ : = ∥ canon ( a ) ∥ ∞ \|\boldsymbol{a}\|:=\|\operatorname{canon}(\boldsymbol{a})\|_{\infty} ∥a∥:=∥canon(a)∥∞
i.e.
∥ a ∥ = max { ∣ a ( ω j ) ∣ : j ∈ Z m ∗ } , \|\boldsymbol{a}\|=\max \left\{\left|\boldsymbol{a}\left(\omega^{j}\right)\right|: j \in \mathbb{Z}_{m}^{*}\right\}, ∥a∥=max{ ∣∣a(ωj)∣∣:j∈Zm∗},
这个东西 ∥ ⋅ ∥ \|\cdot\| ∥⋅∥ 叫自然范数。
范数的几样性质:正定、齐次、三角不等式,这里还有次乘性:
- ∥ a + b ∥ ≤ ∥ a ∥ + ∥ b ∥ \|\boldsymbol{a}+\boldsymbol{b}\| \leq\|\boldsymbol{a}\|+\|\boldsymbol{b}\| ∥a+b∥≤∥a∥+∥b∥, ∀ a , b ∈ A \forall \boldsymbol{a}, \boldsymbol{b} \in \mathcal{A} ∀a,b∈A (三角不等式)
- ∥ c a ∥ = ∣ c ∣ ∥ a ∥ \|c \boldsymbol{a}\|=|c|\|\boldsymbol{a}\| ∥ca∥=∣c∣∥a∥, ∀ a ∈ A , c ∈ Z \forall \boldsymbol{a} \in \mathcal{A}, c \in \mathbb{Z} ∀a∈A,c∈Z(齐次)
- ∥ a b ∥ ≤ ∥ a ∥ ∥ b ∥ \|a b\| \leq\|a\|\|b\| ∥ab∥≤∥a∥∥b∥, ∀ a , b ∈ A \forall \boldsymbol{a}, \boldsymbol{b} \in \mathcal{A} ∀a,b∈A。(次乘)
在 A Q \mathcal{A}_{\mathbb{Q}} AQ 或 A R \mathcal{A}_{\mathbb{R}} AR 上有类似的结论。以后就用 ∥ a ∥ = ∥ \|\boldsymbol{a}\|=\| ∥a∥=∥ canon ( a ) ∥ ∞ (\boldsymbol{a}) \|_{\infty} (a)∥∞ 来指代 A Q \mathcal{A}_{\mathbb{Q}} AQ 或 A R \mathcal{A}_{\mathbb{R}} AR 中 a \boldsymbol{a} a 的范数。
标准 & powerful基
下面需要先做一个符号上的区分:
符号(变量) X X X 和这玩意在 Φ m ( X ) \Phi_{m}(X) Φm(X) 上的像 x : = \boldsymbol{x}:= x:= [ X m o d Φ m ( X ) ] \left[X \bmod \Phi_{m}(X)\right] [XmodΦm(X)] ,其中 x ∈ A = Z [ X ] / ( Φ m ( X ) ) \boldsymbol x \in \mathcal{A}=\mathbb{Z}[X] /\left(\Phi_{m}(X)\right) x∈A=Z[X]/(Φm(X))。
实际上, A \mathcal{A} A 也可以写成 A = { f ( x ) : f ( X ) ∈ Z [ X ] } \mathcal{A}=\{f(\boldsymbol{x}): f(X) \in \mathbb{Z}[X]\} A={ f(x):f(X)∈Z[X]}。
x ∈ A \boldsymbol{x} \in \mathcal{A} x∈A 满足 Φ m ( x ) = 0 \Phi_{m}(\boldsymbol{x})=0 Φm(x)=0(因为模都给你模完了)。此外, A \mathcal{A} A 中每个元素均可唯一表示成 f ( x ) f(\boldsymbol{x}) f(x),其中 f ( X ) ∈ Z [ X ] f(X) \in \mathbb{Z}[X] f(X)∈Z[X] 的度数小于 ϕ ( m ) \phi(m) ϕ(m)。
立即推出对于任意的 a ∈ A \boldsymbol{a} \in \mathcal{A} a∈A 都可以唯一地表示成:
a = ∑ i ∈ [ ϕ ( m ) ] a i x i . \boldsymbol{a}=\sum_{i \in[\phi(m)]} a_{i} \boldsymbol{x}^{i} . a=i∈[ϕ(m)]∑aixi.
于是
{ x i } i ∈ [ ϕ ( m ) ] \left\{\boldsymbol{x}^{i}\right\}_{i \in[\phi(m)]} { xi}i∈[ϕ(m)]
构成了 A \mathcal{A} A 的一个 Z \mathbb{Z} Z-基底, 称为 A \mathcal{A} A 的标准基底。
设 m = m 1 ⋯ m k m=m_{1} \cdots m_{k} m=m1⋯mk 是 m m m 的素分解。考虑一个新的商环
B : = Z [ Y 1 , … , Y k ] / ( Φ m 1 ( Y 1 ) , … , Φ m k ( Y k ) ) \mathcal{B}:=\mathbb{Z}\left[Y_{1}, \ldots, Y_{k}\right] /\left(\Phi_{m_{1}}\left(Y_{1}\right), \ldots, \Phi_{m_{k}}\left(Y_{k}\right)\right) B:=Z[Y1,…,Yk]/(Φm1(Y1),…,Φmk(Yk))
对于 t = 1 , … , k t=1, \ldots, k t=1,…,k, 记 y t \boldsymbol{y}_{t} yt 为 Y t Y_{t} Yt 在 B \mathcal{B} B 的像。 于是有 B = Z [ y 1 , … , y k ] \mathcal{B}=\mathbb{Z}\left[\boldsymbol{y}_{1}, \ldots, \boldsymbol{y}_{k}\right] B=Z[y1,…,yk]. 那么,每个 B \mathcal{B} B 中元可以唯一写成 g ( y 1 , … , y k ) g\left(\boldsymbol{y}_{1}, \ldots, \boldsymbol{y}_{k}\right) g(y1,…,yk) 的形式,其中 g ( Y 1 , … , Y k ) ∈ Z [ Y 1 , … , Y k ] g\left(Y_{1}, \ldots, Y_{k}\right) \in \mathbb{Z}\left[Y_{1}, \ldots, Y_{k}\right] g(Y1,…,Yk)∈Z[Y1,…,Yk], 其中 Y t Y_{t} Yt 的度数小于 ϕ ( m t ) \phi\left(m_{t}\right) ϕ(mt) for t = 1 , … , k t=1, \ldots, k t=1,…,k。则
{ y 1 i 1 ⋯ y k i k } i 1 ∈ [ ϕ ( m 1 ) ] , … , i k ∈ [ ϕ ( m k ) ] \left\{\boldsymbol{y}_{1}^{i_{1}} \cdots \boldsymbol{y}_{k}^{i_{k}}\right\}_{i_{1} \in\left[\phi\left(m_{1}\right)\right], \ldots, i_{k} \in\left[\phi\left(m_{k}\right)\right]} { y1i1⋯ykik}i1∈[ϕ(m1)],…,ik∈[ϕ(mk)]
构成 B \mathcal{B} B 的 Z \mathbb{Z} Z-基底。
环 A \mathcal{A} A 和 B \mathcal{B} B 实际上是同构的。 记 x t : = x m / m t ∈ A \boldsymbol{x}_{t}:=\boldsymbol{x}^{m / m_{t}} \in \mathcal{A} xt:=xm/mt∈A , t = 1 , … , k t=1, \ldots, k t=1,…,k. 则有从 g ( y 1 , … , y k ) ∈ B g\left(\boldsymbol{y}_{1}, \ldots, \boldsymbol{y}_{k}\right) \in \mathcal{B} g(y1,…,yk)∈B 到 g ( x 1 , … , x k ) ∈ A g\left(\boldsymbol{x}_{1}, \ldots, \boldsymbol{x}_{k}\right) \in \mathcal{A} g(x1,…,xk)∈A , g ( Y 1 , … , Y k ) ∈ Z [ Y 1 , … , Y k ] g\left(Y_{1}, \ldots, Y_{k}\right) \in \mathbb{Z}\left[Y_{1}, \ldots, Y_{k}\right] g(Y1,…,Yk)∈Z[Y1,…,Yk] 的同构映射。
这个同构映射为 A \mathcal{A} A 定义了另一个 Z \mathbb{Z} Z-基底:
{ x 1 i 1 ⋯ x k i k } i 1 ∈ [ ϕ ( m 1 ) ] , … , i k ∈ [ ϕ ( m k ) ] . \left\{\boldsymbol{x}_{1}^{i_{1}} \cdots \boldsymbol{x}_{k}^{i_{k}}\right\}_{i_{1} \in\left[\phi\left(m_{1}\right)\right], \ldots, i_{k} \in\left[\phi\left(m_{k}\right)\right]} . { x1i1⋯xkik}i1∈[ϕ(m1)],…,ik∈[ϕ(mk)].
叫它 A \mathcal{A} A的 powerful basis。
除了基于规范嵌入的范数之外, A \mathcal{A} A 上其他的范数可以根据上述基底定义。
Galois自同构
记 A = Z [ X ] / ( Φ m ( X ) ) \mathcal{A}=\mathbb{Z}[X] /\left(\Phi_{m}(X)\right) A=Z[X]/(Φm(X)) ,然后 A = Z [ x ] \mathcal{A}=\mathbb{Z}[\boldsymbol{x}] A=Z[x] ,其中 x : = [ X m o d Φ m ( X ) ] \boldsymbol{x}:=\left[X \bmod \Phi_{m}(X)\right] x:=[XmodΦm(X)] 是未定元 X X X 在 A \mathcal{A} A 中的像。
对于 j ∈ Z m ∗ j \in \mathbb{Z}_{m}^{*} j∈Zm∗ ,第 j j j 个 Galois自同构 θ j \theta_{j} θj 是环同构:
θ j : A * A f ( x ) * f ( x j ) ( for f ( X ) ∈ Z [ X ] ) \begin{aligned} \theta_{j}: \mathcal{A} & \longrightarrow \mathcal{A} \\ f(\boldsymbol{x}) & \longmapsto f\left(\boldsymbol{x}^{j}\right) \quad(\text { for } f(X) \in \mathbb{Z}[X]) \end{aligned} θj:Af(x)*A*f(xj)( for f(X)∈Z[X])
θ j \theta_{j} θj 是well-defined,因为在 Z [ X ] \mathbb{Z}[X] Z[X]上, Φ m ( X j ) \Phi_{m}\left(X^{j}\right) Φm(Xj) 可被 Φ m ( X ) \Phi_{m}(X) Φm(X)整除。考虑它们的根,如果 ω : = e 2 π i / m ∈ C \omega:=e^{2 \pi i} / m \in \mathbb{C} ω:=e2πi/m∈C 是原根, 那么 ω j \omega^{j} ωj 也是。所以 ω \omega ω 是 Φ m ( X j ) \Phi_{m}\left(X^{j}\right) Φm(Xj) 的根。又因为 Φ m ( X ) \Phi_{m}(X) Φm(X) 的最小性,所以 Φ m ( X j ) \Phi_{m}\left(X^{j}\right) Φm(Xj) 可被 Φ m ( X ) \Phi_{m}(X) Φm(X)整除。此即若 f ( x ) = g ( x ) f(\boldsymbol{x})=g(\boldsymbol{x}) f(x)=g(x),则 f ( x j ) = g ( x j ) f\left(\boldsymbol{x}^{j}\right)=g\left(\boldsymbol{x}^{j}\right) f(xj)=g(xj),良定性得证。
对于 j , j ′ ∈ Z m ∗ j, j^{\prime} \in \mathbb{Z}_{m}^{*} j,j′∈Zm∗,有
θ j ∘ θ j ′ = θ j j ′ = θ j ′ ∘ θ j \theta_{j} \circ \theta_{j^{\prime}}=\theta_{j j^{\prime}}=\theta_{j^{\prime}} \circ \theta_{j} θj∘θj′=θjj′=θj′∘θj
若 j ′ = j − 1 ∈ Z m ∗ j^{\prime}=j^{-1} \in \mathbb{Z}_{m}^{*} j′=j−1∈Zm∗,则 θ j ′ \theta_{j^{\prime}} θj′ 是 θ j \theta_{j} θj的逆,于是 θ j \theta_{j} θj 是双射。
对任意 a ∈ A \boldsymbol{a} \in \mathcal{A} a∈A,可以注意到 canon ( θ j ( a ) ) \operatorname{canon}\left(\theta_{j}(\boldsymbol{a})\right) canon(θj(a)) 就是 canon ( a ) (\boldsymbol{a}) (a) 的置换,因此 ∥ θ j ( a ) ∥ = ∥ a ∥ \left\|\theta_{j}(\boldsymbol{a})\right\|=\|\boldsymbol{a}\| ∥θj(a)∥=∥a∥.
A q 、 A Q \mathcal{A}_{q}、 \mathcal{A}_{\mathbb{Q}} Aq、AQ 和 A R \mathcal{A}_{\mathbb{R}} AR上的Galois自同构同理可得。
明文上的一些代数学
回忆一下我写过的CKKS文章,消息叫做message(是向量或者矩阵),明文叫做plaintext(是多项式),密文叫做ciphertext(是一对多项式)。
记 A = Z [ X ] / ( Φ m ( X ) ) \mathcal{A}=\mathbb{Z}[X] /\left(\Phi_{m}(X)\right) A=Z[X]/(Φm(X))。于是CKKS中的明文可以被视为环 A P \mathcal{A}_{P} AP 的元素,其中 P = p r P=p^{r} P=pr 是素数的幂,且 p p p 不整除 m m m。
环 A P \mathcal{A}_{P} AP 实际上是一个 Z P \mathbb{Z}_{P} ZP-代数(有加法和乘法的线性空间),意味着在这个环里有一个 Z P \mathbb{Z}_{P} ZP 的同构拷贝作为子环。
首先考虑一下 r = 1 r=1 r=1 的情况,于是 P = p P=p P=p 是素数, Z p \mathbb{Z}_{p} Zp 是一个域。
此时 A p \mathcal{A}_{p} Ap 是一个 Z p \mathbb{Z}_{p} Zp-代数并且包含域 Z p \mathbb{Z}_{p} Zp 作为子域,所以可以自然地把 A p \mathcal{A}_{p} Ap 看成 Z p \mathbb{Z}_{p} Zp 下的向量空间。
下面先回忆一下 A p \mathcal{A}_{p} Ap 的定义, A p = Z p [ X ] / ( Φ ˉ m ( X ) ) \mathcal{A}_{p}=\mathbb{Z}_{p}[X] /\left(\bar{\Phi}_{m}(X)\right) Ap=Zp[X]/(Φˉm(X)),其中 Φ ˉ m ( X ) \bar{\Phi}_{m}(X) Φˉm(X) 是分圆多项式 Φ m ( X ) \Phi_{m}(X) Φm(X) 的系数模 p p p 的结果,是 Z p [ X ] \mathbb{Z}_{p}[X] Zp[X] 的元素。我们假设 p p p 不整除 m m m。
我们还定义了 x : = [ X m o d Φ ˉ m ( X ) ] \boldsymbol{x}:=\left[X \bmod \bar{\Phi}_{m}(X)\right] x:=[XmodΦˉm(X)], 于是 A p = Z p [ x ] \mathcal{A}_{p}=\mathbb{Z}_{p}[\boldsymbol{x}] Ap=Zp[x], 意味着对 A p \mathcal{A}_{p} Ap 中的所有元素,都有一个 f ( X ) ∈ Z p [ X ] f(X) \in \mathbb{Z}_{p}[X] f(X)∈Zp[X] 和它对应。
一些常见结论:
- 把多项式 Φ ˉ m ( X ) ∈ Z p [ X ] \bar{\Phi}_{m}(X) \in \mathbb{Z}_{p}[X] Φˉm(X)∈Zp[X] 完全因式分解成
Φ ˉ m ( X ) = F 1 ( X ) ⋯ F n ( X ) \bar{\Phi}_{m}(X)=F_{1}(X) \cdots F_{n}(X) Φˉm(X)=F1(X)⋯Fn(X)
其中 F i ( X ) ∈ Z p [ X ] F_{i}(X) \in \mathbb{Z}_{p}[X] Fi(X)∈Zp[X] 是不同的不可约多项式,每个多项式都有度数 d d d; 于是 ϕ ( m ) = n d \phi(m)=n d ϕ(m)=nd. - d d d 是 p p p 模 m m m 的阶数,此即 d d d 是 p d ≡ 1 ( m o d m ) p^{d} \equiv 1(\bmod m) pd≡1(modm) 成立的最小整数。
于是由中国剩余定理的多项式版本,可以搞出来一个 Z p \mathbb{Z}_{p} Zp-代数的同构
A p * Z p [ X ] / ( F 1 ( X ) ) × ⋯ × Z p [ X ] / ( F n ( X ) ) f ( x ) * ( [ f ( X ) m o d F 1 ( X ) ] , … , [ f ( X ) m o d F n ( X ) ] ) ( for f ( X ) ∈ Z p [ X ] ) \begin{aligned} \mathcal{A}_{p} & \longrightarrow \mathbb{Z}_{p}[X] /\left(F_{1}(X)\right) \times \cdots \times \mathbb{Z}_{p}[X] /\left(F_{n}(X)\right) \\ f(\boldsymbol{x}) & \longmapsto\left(\left[f(X) \bmod F_{1}(X)\right], \ldots,\left[f(X) \bmod F_{n}(X)\right]\right) \quad\left(\text { for } f(X) \in \mathbb{Z}_{p}[X]\right) \end{aligned} Apf(x)*Zp[X]/(F1(X))×⋯×Zp[X]/(Fn(X))*([f(X)modF1(X)],…,[f(X)modFn(X)])( for f(X)∈Zp[X])
还可以这么看 A = Z p [ X ] / Φ m ( X ) \mathcal{A} = \mathbb{Z}_{p}[X]/\Phi_{m}(X) A=Zp[X]/Φm(X)。记 E = Z p [ X ] / ( F 1 ( X ) ) E=\mathbb{Z}_{p}[X] /\left(F_{1}(X)\right) E=Zp[X]/(F1(X))。则可以在 Φ ˉ m ( X ) \bar{\Phi}_{m}(X) Φˉm(X) 里的不可约因子里任选一个 F 1 ( X ) F_{1}(X) F1(X)。记 η : = [ X m o d F 1 ( X ) ] ∈ \eta:=\left[X \bmod F_{1}(X)\right] \in η:=[XmodF1(X)]∈ E E E。
现在 F 1 ( X ) F_{1}(X) F1(X) 不可约,则 E E E 是一个基数为 p d p^{d} pd 的有限域。我们也有 E = Z p [ η ] E=\mathbb{Z}_{p}[\eta] E=Zp[η],意味着 E E E 中每个元素都可以写成 f ( η ) f(\eta) f(η) 的形式,其中 f ( X ) ∈ Z p [ X ] f(X) \in \mathbb{Z}_{p}[X] f(X)∈Zp[X]。这样 Z p \mathbb{Z}_{p} Zp 自然成了 E E E 的子域。根据定义, η \eta η 是 F 1 ( X ) F_{1}(X) F1(X) 的根, η ∈ E \eta \in E η∈E 也是 m m m 次单位原根。
现在考虑群 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗。易知 Φ ˉ m ( X ) \bar{\Phi}_{m}(X) Φˉm(X) 在 E E E 上有 ϕ ( m ) \phi(m) ϕ(m) 个根 η j \eta^{j} ηj for j ∈ Z m ∗ j \in \mathbb{Z}_{m}^{*} j∈Zm∗。因此这 ϕ ( m ) \phi(m) ϕ(m) 个根需要被分配到 Φ ˉ m ( X ) \bar{\Phi}_{m}(X) Φˉm(X) 的不可约因子上。于是,每个不可约因子 F i ( X ) F_{i}(X) Fi(X) 在 E E E 上都有 d d d 个根。
上面说的这些个根是怎么分配的呢?考虑由 p ˉ : = [ p m o d m ] ∈ Z m ∗ \bar{p}:=[p \bmod m] \in \mathbb{Z}_{m}^{*} pˉ:=[pmodm]∈Zm∗ 生成的 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 的乘法子群 H H H。这个子群有 d d d 个不同元素 1 ‾ , p ˉ , … , p ˉ d − 1 \overline{1}, \bar{p}, \ldots, \bar{p}^{d-1} 1,pˉ,…,pˉd−1。考虑商群 Z m ∗ / H \mathbb{Z}_{m}^{*} / H Zm∗/H,有 n = ϕ ( m ) / d n=\phi(m) / d n=ϕ(m)/d 个不同的陪集,每个陪集长这样:
k H = { k h : h ∈ H } ⊆ Z m ∗ k H=\{k h: h \in H\} \subseteq \mathbb{Z}_{m}^{*} kH={ kh:h∈H}⊆Zm∗
k k k 是陪集代表。
现在从每个陪集里面找一个代表,得到一串数 k 1 , … , k n ∈ Z m ∗ k_{1}, \ldots, k_{n} \in \mathbb{Z}_{m}^{*} k1,…,kn∈Zm∗。则 H H H 在 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 里的所有陪集是:
k 1 H , … , k n H . k_{1} H, \ldots, k_{n} H \text {. } k1H,…,knH.
每个 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 中的元素都在一个陪集中。
下面我们要把多项式域的结果扔到向量空间上了。首先看一个结果:
- 对于任意的代表集 k 1 , … , k n ∈ Z m ∗ k_{1}, \ldots, k_{n} \in \mathbb{Z}_{m}^{*} k1,…,kn∈Zm∗ of H H H in Z m ∗ \mathbb{Z}_{m}^{*} Zm∗, 可以把它组织成下面的形式,使得对 i = 1 , … , n i=1, \ldots, n i=1,…,n,多项式 F i ( X ) F_{i}(X) Fi(X) 在 E E E 上有 d d d 个根,即 η k \eta^{k} ηk for k ∈ k i H k \in k_{i} H k∈kiH.
因此,对 i = 1 , … , n i=1, \ldots, n i=1,…,n 我们都有 Z p \mathbb{Z}_{p} Zp-代数的同构:
Z p [ X ] / ( F i ( X ) ) * E [ f ( X ) m o d F i ( X ) ] * f ( η k i ) ( for f ( X ) ∈ Z p [ X ] ) . \begin{aligned} \mathbb{Z}_{p}[X] /\left(F_{i}(X)\right) & \longrightarrow E \\ {\left[f(X) \bmod F_{i}(X)\right] } & \longmapsto f\left(\eta^{k_{i}}\right) \quad\left(\text { for } f(X) \in \mathbb{Z}_{p}[X]\right) . \end{aligned} Zp[X]/(Fi(X))[f(X)modFi(X)]*E*f(ηki)( for f(X)∈Zp[X]).
因为 E E E 中每个元素都可以写成 f ( η ) f(\eta) f(η) 的形式,其中 f ( X ) ∈ Z p [ X ] f(X) \in \mathbb{Z}_{p}[X] f(X)∈Zp[X]。于是有 Z p \mathbb{Z}_{p} Zp-代数的同构:
A p * E n f ( x ) * ( f ( η k 1 ) , … , f ( η k n ) ) ( for f ( X ) ∈ Z p [ X ] ) . \begin{aligned} \mathcal{A}_{p} & \longrightarrow E^{n} \\ f(\boldsymbol{x}) & \longmapsto\left(f\left(\eta^{k_{1}}\right), \ldots, f\left(\eta^{k_{n}}\right)\right) \quad\left(\text { for } f(X) \in \mathbb{Z}_{p}[X]\right) . \end{aligned} Apf(x)*En*(f(ηk1),…,f(ηkn))( for f(X)∈Zp[X]).
我们不妨称 E E E 为槽(slot)代数。 A p * E n \mathcal{A}_{p} \longrightarrow E^{n} Ap*En 这个自同构允许我们在 E n E^{n} En 做逐元素的加法和乘法,并且可以对应到 A p \mathcal{A}_{p} Ap 上。
比如 a ∈ A p \boldsymbol{a} \in \mathcal{A}_{p} a∈Ap 对应 ( α 1 , … , α n ) ∈ E n \left(\alpha_{1}, \ldots, \alpha_{n}\right) \in E^{n} (α1,…,αn)∈En , b ∈ A p \boldsymbol{b} \in \mathcal{A}_{p} b∈Ap 对应 ( β 1 , … , β n ) ∈ E n \left(\beta_{1}, \ldots, \beta_{n}\right) \in E^{n} (β1,…,βn)∈En,则 a + b \boldsymbol{a}+\boldsymbol{b} a+b 对应 ( α 1 + β 1 , … , α n + β n ) ∈ E n \left(\alpha_{1}+\beta_{1}, \ldots, \alpha_{n}+\beta_{n}\right) \in E^{n} (α1+β1,…,αn+βn)∈En, a ⋅ b \boldsymbol{a} \cdot \boldsymbol{b} a⋅b 对应 ( α 1 ⋅ β 1 , … , α n ⋅ β n ) ∈ \left(\alpha_{1} \cdot \beta_{1}, \ldots, \alpha_{n} \cdot \beta_{n}\right) \in (α1⋅β1,…,αn⋅βn)∈ E n E^{n} En.
在计算上实现这个自同构也比较简单。
Galois自同构和向量内数据的移动
有了 A p * E n \mathcal{A}_{p} \longrightarrow E^{n} Ap*En 这个自同构,我们就可以对向量(或者说多项式),弄一些SIMD操作。但是,在向量内部移动数据也是有用的一批。这个事可以通过上一篇文章介绍的 A p \mathcal{A}_{p} Ap 上的Galois自同构实现。
回忆杀:对于 j ∈ Z m ∗ j \in \mathbb{Z}_{m}^{*} j∈Zm∗,第 j j j 个 Galois 自同构 θ j \theta_{j} θj 是 Z p \mathbb{Z}_{p} Zp-代数的自同构:
θ j : A p * A p f ( x ) * f ( x j ) ( for f ( X ) ∈ Z p [ X ] ) \begin{aligned} \theta_{j}: \mathcal{A}_{p} & \longrightarrow \mathcal{A}_{p} \\ f(\boldsymbol{x}) & \longmapsto f\left(\boldsymbol{x}^{j}\right) \quad\left(\text { for } f(X) \in \mathbb{Z}_{p}[X]\right) \end{aligned} θj:Apf(x)*Ap*f(xj)( for f(X)∈Zp[X])
由 A p * E n \mathcal{A}_{p} \longrightarrow E^{n} Ap*En 这个自同构
f ( x ) ∈ A p * ( f ( η k 1 ) , … , f ( η k n ) ) ∈ E n f(\boldsymbol{x}) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{k_{1}}\right), \ldots, f\left(\eta^{k_{n}}\right)\right) \in E^{n} f(x)∈Ap*(f(ηk1),…,f(ηkn))∈En
我们可以得到
θ j ( f ( x ) ) ∈ A p * ( f ( η j k 1 ) , … , f ( η j k n ) ) ∈ E n \theta_{j}(f(\boldsymbol{x})) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{j k_{1}}\right), \ldots, f\left(\eta^{j k_{n}}\right)\right) \in E^{n} θj(f(x))∈Ap*(f(ηjk1),…,f(ηjkn))∈En
因此, θ j \theta_{j} θj 在向量上做的置换比较特殊。通过精心选取 k 1 , … , k n k_{1}, \ldots, k_{n} k1,…,kn就可以用特定的Galois自同构来做一些有用的映射。
Frobenius自同构
映射
σ : E * E f ( η ) * f ( η p ) ( for f ( X ) ∈ Z p [ X ] ) . \begin{aligned} \sigma: \quad E & \longrightarrow E \\ f(\eta) & \longmapsto f\left(\eta^{p}\right) \quad\left(\text { for } f(X) \in \mathbb{Z}_{p}[X]\right) . \end{aligned} σ:Ef(η)*E*f(ηp)( for f(X)∈Zp[X]).
是 Z p \mathbb{Z}_{p} Zp-代数的自同构,称为 Frobenius自同构。Frobenius自同构在有限域中十分重要。
一个结论是, ∀ α ∈ E \forall \alpha \in E ∀α∈E 有 σ ( α ) = α p \sigma(\alpha)=\alpha^{p} σ(α)=αp.
另一个结论是 ∀ α ∈ E \forall \alpha \in E ∀α∈E 有
α ∈ Z p * σ ( α ) = α . \alpha \in \mathbb{Z}_{p} \Longleftrightarrow \sigma(\alpha)=\alpha . α∈Zp*σ(α)=α.
在自同构 A p * E n \mathcal{A}_{p} \longrightarrow E^{n} Ap*En
f ( x ) ∈ A p * ( f ( η k 1 ) , … , f ( η k n ) ) ∈ E n f(\boldsymbol{x}) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{k_{1}}\right), \ldots, f\left(\eta^{k_{n}}\right)\right) \in E^{n} f(x)∈Ap*(f(ηk1),…,f(ηkn))∈En
下,我们有
θ p ˉ ( f ( x ) ) ∈ A p * ( f ( η p k 1 ) , … , f ( η p k n ) ) = ( σ ( f ( η k 1 ) ) , … , σ ( f ( η k n ) ) ) ∈ E n , \theta_{\bar{p}}(f(\boldsymbol{x})) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{p k_{1}}\right), \ldots, f\left(\eta^{p k_{n}}\right)\right)=\left(\sigma\left(f\left(\eta^{k_{1}}\right)\right), \ldots, \sigma\left(f\left(\eta^{k_{n}}\right)\right)\right) \in E^{n}, θpˉ(f(x))∈Ap*(f(ηpk1),…,f(ηpkn))=(σ(f(ηk1)),…,σ(f(ηkn)))∈En,
其中 p ˉ = [ p m o d m ] ∈ Z m ∗ \bar{p}=[p \bmod m] \in \mathbb{Z}_{m}^{*} pˉ=[pmodm]∈Zm∗。因此,映射 θ p ˉ \theta_{\bar{p}} θpˉ 是逐元素的。
在超方体(hypercube)上做旋转
我们已经知道自同构 θ p ˉ \theta_{\bar{p}} θpˉ 做了一个Frobenius映射,映射到向量中每一个元素上,但是目前为止这个映射并没有完成类似于CKKS的旋转操作。现在我们看一下怎么用 θ j \theta_{j} θj 做旋转。
首先是一些简单的例子:
一维旋转(!!!!!!!!!!!!)
设 g ∈ Z m ∗ g \in \mathbb{Z}_{m}^{*} g∈Zm∗ 并且假设 1 , g , g 2 , … , g n − 1 1, g, g^{2}, \ldots, g^{n-1} 1,g,g2,…,gn−1 是 H H H 在 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 上的所有的陪集代表。. 那么必然有 g n ∈ H g^{n} \in H gn∈H。
为什么?注意到对于某个 e ∈ { 0 , … , n − 1 } e \in\{0, \ldots, n-1\} e∈{ 0,…,n−1} 和某个 h ∈ H h \in H h∈H,必有 g n = g e h g^{n}=g^{e} h gn=geh 。此外,必有 e = 0 e=0 e=0 ,否则 g n − e ∈ H g^{n-e} \in H gn−e∈H,意味着两个不同的陪集代表在 H H H 里,而这不可能。所以有 g n = h ∈ H g^{n}=h \in H gn=h∈H。
假设 g n = 1 g^{n}=1 gn=1,则对于自同构 A p * E n \mathcal{A}_{p} \longrightarrow E^{n} Ap*En,我们用上 Z m ∗ \mathbb{Z}_{m}^{*} Zm∗ 中所有的 H H H 的陪集代表 1 , g , … , g n − 1 ∈ Z m ∗ 1, g, \ldots, g^{n-1} \in \mathbb{Z}_{m}^{*} 1,g,…,gn−1∈Zm∗,于是有:
f ( x ) ∈ A p * ( f ( η 1 ) , f ( η g ) , … , f ( η g n − 2 ) , f ( η g n − 1 ) ) ∈ E n f(\boldsymbol{x}) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{1}\right), f\left(\eta^{g}\right), \ldots, f\left(\eta^{g^{n-2}}\right), f\left(\eta^{g^{n-1}}\right)\right) \in E^{n} f(x)∈Ap*(f(η1),f(ηg),…,f(ηgn−2),f(ηgn−1))∈En
做映射 θ g \theta_{g} θg 便有:
θ g ( f ( x ) ) ∈ A p * ( f ( η g ) , f ( η g 2 ) , … , f ( η g n − 1 ) , f ( η g n ) ) ∈ E n \theta_{g}(f(\boldsymbol{x})) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{g}\right), f\left(\eta^{g^{2}}\right), \ldots, f\left(\eta^{g^{n-1}}\right), f\left(\eta^{g^{n}}\right)\right) \in E^{n} θg(f(x))∈Ap*(f(ηg),f(ηg2),…,f(ηgn−1),f(ηgn))∈En
由于我们假设了 g n = 1 g^{n}=1 gn=1,所以
θ g ( f ( x ) ) ∈ A p * ( f ( η g ) , f ( η g 2 ) , … , f ( η g n − 1 ) , f ( η 1 ) ) ∈ E n \theta_{g}(f(\boldsymbol{x})) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{g}\right), f\left(\eta^{g^{2}}\right), \ldots, f\left(\eta^{g^{n-1}}\right), f\left(\eta^{1}\right)\right) \in E^{n} θg(f(x))∈Ap*(f(ηg),f(ηg2),…,f(ηgn−1),f(η1))∈En
于是我们最终做到了旋转这件事。
对于 e = 1 , … , n − 1 e=1, \ldots, n-1 e=1,…,n−1,做映射 θ g e \theta_{g^{e}} θge 可以做到“向左”旋转 e e e 位。
现在假设 g n ∈ H g^{n} \in H gn∈H ,但是 g n ≠ 1 g^{n} \neq 1 gn=1。这意味着 g n = p ˉ s ∈ Z m ∗ g^{n}=\bar{p}^{s} \in \mathbb{Z}_{m}^{*} gn=pˉs∈Zm∗ ,其中 s ∈ { 1 , … , d − 1 } s \in\{1, \ldots, d-1\} s∈{ 1,…,d−1}。此时我们有:
θ g ( f ( x ) ) ∈ A p * ( f ( η g ) , f ( η g 2 ) , … , f ( η g n − 1 ) , σ s ( f ( η 1 ) ) ) ∈ E n . \theta_{g}(f(\boldsymbol{x})) \in \mathcal{A}_{p} \longleftrightarrow\left(f\left(\eta^{g}\right), f\left(\eta^{g^{2}}\right), \ldots, f\left(\eta^{g^{n-1}}\right), \sigma^{s}\left(f\left(\eta^{1}\right)\right)\right) \in E^{n} . θg(f(x))∈Ap*(f(ηg),f(ηg2),…,f(ηgn−1),σs(f(η1)))∈En.
于是对向量 a \boldsymbol{a} a 做 θ g \theta_{g} θg 确实是旋转了,但是在最后一个地方加了点扰动(伪旋转)。
更一般的结论是,对于 e = 1 , … , n − 1 e=1, \ldots, n-1 e=1,…,n−1 ,映射 θ g e \theta_{g^{e}} θge 向左旋转了 e e e 位,同时把最后的 e e e 位扰动了。向右旋转同理。
如果向量里真有不在 Z p \mathbb{Z}_{p} Zp 里的元素的话,我们仍然可以做旋转。如下所示:
对于 a ∈ A p \boldsymbol{a} \in \mathcal{A}_{p} a∈Ap,我们可以用一个掩码 M e \boldsymbol{M}_{e} Me,它对应的是
M e ∈ A p * ( 1 , … , 1 ⏟ n − e 1 ′ s , 0 , … , 0 ⏟ e 0 ′ s ) ∈ E n . \boldsymbol{M}_{e} \in \mathcal{A}_{p} \longleftrightarrow(\underbrace{1, \ldots, 1}_{n-e 1^{\prime} \mathrm{s}}, \underbrace{0, \ldots, 0}_{e 0 ' s}) \in E^{n} . Me∈Ap*(n−e1′s1,…,1,e0′s0,…,0)∈En.
我们也有
1 − M e ∈ A p * ( 0 , … , 0 ⏟ n − e 0 ′ s , 1 , … , 1 ⏟ e 1 ′ s ) ∈ E n 1-\boldsymbol{M}_{e} \in \mathcal{A}_{p} \longleftrightarrow(\underbrace{0, \ldots, 0}_{n-e 0^{\prime} s}, \underbrace{1, \ldots, 1}_{e 1^{\prime} s}) \in E^{n} 1−Me∈Ap*(n−e0′s0,…,0,e1′s1,…,1)∈En
如果
a ∈ A p * ( α 0 , … , α n − 1 ) ∈ E n \boldsymbol a \in \mathcal{A}_{p} \longleftrightarrow\left(\alpha_{0}, \ldots, \alpha_{n-1}\right) \in E^{n} a∈Ap*(α0,…,αn−1)∈En
那么
M e ⋅ θ g e ( a ) ∈ A p * ( α e , … , α n − 1 , 0 , … , 0 ⏟ e 0 ′ s ) ∈ E n M_{e} \cdot \theta_{g^{e}}(\boldsymbol{a}) \in \mathcal{A}_{p} \longleftrightarrow(\alpha_{e}, \ldots, \alpha_{n-1}, \underbrace{0, \ldots, 0}_{e 0 ' s}) \in E^{n} Me⋅θge(a)∈Ap*(αe,…,αn−1,e0′s0,…,0)∈En
并且
( 1 − M e ) ⋅ θ g e − n ( a ) ∈ A p * ( 0 , … , 0 ⏟ n − e 0 ′ s , α 0 , … , α e − 1 ) ∈ E n \left(1-\boldsymbol{M}_{e}\right) \cdot \theta_{g^{e-n}}(\boldsymbol{a}) \in \mathcal{A}_{p} \longleftrightarrow(\underbrace{0, \ldots, 0}_{n-e 0^{\prime} s}, \alpha_{0}, \ldots, \alpha_{e-1}) \in E^{n} (1−Me)⋅θge−n(a)∈Ap*(n−e0′s0,…,0,α0,…,αe−1)∈En
于是有
M e ⋅ θ g e ( a ) + ( 1 − M e ) ⋅ θ g e − n ( a ) . M_{e} \cdot \theta_{g^{e}}(\boldsymbol{a})+\left(1-M_{e}\right) \cdot \theta_{g^{e-n}}(\boldsymbol{a}) . Me⋅θge(a)+(1−Me)⋅θge−n(a).
它便是旋转的结果。
更高效的做法是这样:
θ g ∗ ( ( 1 − M n − e ) ⋅ a ) + θ g k − n ( M n − e ⋅ a ) \theta_{g^{*}}\left(\left(1-\boldsymbol{M}_{n-e}\right) \cdot \boldsymbol{a}\right)+\theta_{g^{k-n}}\left(\boldsymbol{M}_{n-e} \cdot \boldsymbol{a}\right) θg∗((1−Mn−e)⋅a)+θgk−n(Mn−e⋅a)
边栏推荐
- 16.JS事件, 字符串和运算符
- After the mailbox of the Pagoda Post Office is successfully set up, it can be sent but not received.
- 1. Beginning with PHP
- hackmyvm-random walkthrough
- PHP deserialization vulnerability
- Warzone: 3 (Exogen) vulnhub walkthrough
- vim edit mode
- Thread Pool (Introduction and Use of Thread Pool)
- DNS详解
- (4) 函数、Bug、类与对象、封装、继承、多态、拷贝
猜你喜欢
ES6 three-dot operator, array method, string extension method
Thread Pool (Introduction and Use of Thread Pool)
PHP deserialization vulnerability
PHP反序列化漏洞
Offensive and defensive world - novice MISC area 1-12
(1) print()函数、转义字符、二进制与字符编码 、变量、数据类型、input()函数、运算符
GreenOptic: 1 vulnhub walkthrough
Orasi: 1 vulnhub walkthrough
redis未授权访问(4-unacc)
Pycharm packages the project as an exe file
随机推荐
(2) Sequence structures, Boolean values of objects, selection structures, loop structures, lists, dictionaries, tuples, sets
After Alibaba Cloud sets up domain name resolution redirection, I cannot use Chrome to access it
Shuriken: 1 vulnhub walkthrough
CTF entry md5
Masashi: 1 vulnhub walkthrough
Orasi: 1 vulnhub walkthrough
(8) requests, os, sys, re, _thread
一个网络安全小白鼠的学习之路——nmap的基本使用
CTF入门笔记之ping
How to log in to Alibaba Cloud server using the admin account
File upload vulnerability
(3) Thinkphp6 database
PHP8.2 version release administrator and release plan
12. What is JS
Praying: 1 vulnhub walkthrough
web安全之目录遍历
4. The form with the input
uniapp | Compilation error after updating with npm update
TypeScript error error TS2469, error TS2731 solution
Add a full image watermark to an image in PHP