素幂子群的阈值同态与安全比较

素幂子群的阈值性质及其在安全整数比较中的应用

里斯·卡尔顿,亚历山大·埃塞克斯(B),以及克里斯托弗·卡普尔金
西安大略大学,加拿大伦敦 {rcarlton,aessex,kkapulki}@uwo.ca

1 引言

针对安全整数比较问题,已提出了众多解决方案,最早可追溯到Yao对 Millionaires问题的原始解法[26]。尽管以往的研究采用了包括不经意传输、混淆电路和同态加密在内的多种方法,但其基本思路在很大程度上仍是通过布尔电路按位方式对输入进行操作来实现比较功能。

本文中,我们提出了一种利用素幂阶群 Z ∗ n的子群所具有的新型阈值标量同态性质进行安全整数比较的新方法。我们构建了一个协议,通过对单个加密值(几乎)直接应用同态性质,高效地比较两个加密整数。

一种单侧同态阈值函数。设 t为定义阈值的正整数。在第4节中,我们提出了一种密码系统,该系统引入了新颖的标量同态,允许两个参与方 P1和 P2,各自持有一个消息 m1和 m2 ∈N,安全地计算以下单侧阈值函数:

$$
f_t(m_1, m_2) =
\begin{cases}
m_1 + m_2 & \text{if } m_1 + m_2 < t \
0 & \text{otherwise}
\end{cases}
$$

在本文中,我们使用术语阈值来指代一种能够同态计算该阈值函数的密码系统,同时注意到,术语阈值同态密码系统在文献中被广泛用于指代一种需要达到一定数量参与者才能解密密文的密码系统(这一概念与此处无关),例如肖恩马克尔斯和蒂尔斯的阈值密码系统[22]。

论文结构

相关工作在第2节中描述。构造的数学预备知识在第3节中给出。加密方案在第4节中介绍,安全比较协议在第5节中介绍。协议的安全性分析在第6节中给出,第7节讨论实现的性能。

2 相关工作

混淆电路是解决安全比较问题[26]的原始构造。该方法涉及将输入分解为其位表示,并在布尔电路中进行安全计算。自那时以来,大量协议致力于提高性能并降低通信开销[1,6,16,17]。近年来,不经意传输实现[7]的进步使该方法在实践中具有较高的计算效率。

另一类安全计算是算术黑箱模型,该模型旨在将算术运算抽象为理想的响应式功能[19,23,27]。它在一定程度上脱离了混淆电路模型,使功能调用在输入的比特大小上具有次线性特性,但在比特复杂度上仍为超线性,并且可能包含影响性能的大常数。

第三种方法使用同态加密。菲什林[11]首次提出了这种方法,该方法基于 Goldwasser和Micali[13]提出的语义安全密码系统,利用布尔电路对两个数进行安全比较。其他对逐位加密值进行安全布尔运算的方案包括布莱克和科列斯尼科夫[4]、加拉伊等人[12]以及林和曾[18]的方案。随后,Damg˚ard、Geisler和Krøigaard(DGK)[9,10]对该方法进行了改进。弗根[24,25]通过引入佩利耶[21]等额外的密码系统,对其方法做出了轻微改进。

基于同态加密的解决方案通常在计算效率上不如其混淆电路 counterpart。然而,基于同态的比较协议可能更容易实现,并且可以提供更低的整体通信开销,这就是为什么针对更快的构造的新研究仍然很重要。

相关密码系统在 Z ∗ n

DGK 比较协议中使用的密码系统与格罗斯[14]的密码系统密切相关。DGK 最初使用了一个 Z ∗ n 的子群,其素数阶同时整除(p −1)和(q −1),但当发现该值会被公钥泄露后,便进行了修正[10]。

Groth的方案建议对 p和 q的相应子群进行参数化,使得它们的组合阶数相对于离散对数问题仍然足够大,但各自的阶数较小以提高效率。Coron等人[8]提出了一种攻击方法,其攻击复杂度低于预期,破坏了语义安全。此后,Groth的方案与DGK在随机化空间上采用相同的参数化方式,并具有相同的加密函数,仅在消息空间上有所不同:Groth利用未知阶的光滑子群填满 Z∗ n的剩余空间,以支持较大的消息空间。DGK则使用类似于Benaloh密码系统的小消息空间[2],然而后者将 Z∗ n的全部空间都用于密文空间,这在加密时非常高效,但在解密效率上远不如DGK。

与我们的密码系统最密切相关的是Joye等人提出的系统[3,15],该系统是对Goldwasser和Micali密码系统[13]的推广,其消息空间的阶为 2k,其中 k ≥ 1。他们的方法利用了在已知 m因式分解的情况下高效计算 2k‐次幂剩余符号的特性,从而实现了快速解密和更高的带宽,即相对于公钥长度而言更大的消息空间。

我们的密码系统

第4节中提出的密码系统在两个主要方面不同于上述密码系统。首先是我们在 Z∗ n的素数幂子群中进行运算,即阶为 bd的子群,其中底为素数基 b,指数为 d> 1(尽管当 b= 2时,我们的方案最接近Joye等人的方案)。其次是与上述方案将消息 m加密为 gmhr不同,我们方案中的密文形式为 gbmhr,这引入了一种新的阈值同态性质,详见第4.1节。利用该方案的同态性质,我们用于安全比较的协议摆脱了对输入进行逐位加密的标准方法,而是直接在一个密文内部对整个值执行比较操作。当然,也存在一些限制条件。

其一是如果输入范围足够大,则将输入拆分为多个块可能更高效(参见第5.4节)。另一个限制是所提出密码系统的阈值同态性质是单向的,这意味着只有当 m1 > m2时,两个消息之间的差值才被隐藏;而当m1 ≤ m2时,差值会被暴露。这一性质本身具有独特且有趣的应用价值,但要实现双向(百万富翁)比较,还需在基础密码系统之外增加额外组件(参见第5节)。

3 预备知识

在整篇论文中,我们将使用一个RSA模数 n= p · q,其中 p和 q是素数,并以如下方式选取:

$$
p = 2b^d p_s p_t + 1 \quad \text{and} \quad q = 2b^d q_s q_t + 1.
$$

这里,b 是一个较小的素数基(例如,2),d 是一个大于1的正整数,且ps、pt、qs、qt 是两两不同的素数。我们注意到

$$
\mathbb{Z} n^* \cong \mathbb{Z} {2b^d p_s p_t} \times \mathbb{Z} {2 q_s q_t}
= (\mathbb{Z}_2)^2 \times (\mathbb{Z}
{b^d})^2 \times \mathbb{Z} {p_s q_s} \times \mathbb{Z} {p_t q_t}
$$

因此,$\mathbb{Z}_n^*$有一个阶为 $b^d$的循环子群 G,以及一个唯一的(必然是循环的)阶为 $p_s q_s$的子群 H。引入素数 pt, qt是为了将 p和 q增加到所需的长度。

设 $g \leftarrow G$和 $h \leftarrow H$分别为其对应子群的随机生成元。公钥由 PK=(n, b, d, g, h, u)给出,其中 u是 ps和 qs的位长度。记号 $x \leftarrow_S$表示从集合 S中均匀随机选取的值 x。要加密消息 $0 \leq m < d - 1$,需选择一个随机的 $r \leftarrow {1,…, 2^u - 1}$并计算 $c = g^{b^m} h^r \mod n$。为了解密 c,首先利用 h的阶为 $p_s q_s$这一性质计算 $c^{p_s q_s} = (g^{b^m})^{p_s q_s}$。此外,令 x表示 $p_s q_s$在 $\mathbb{Z}_{b^d}$中的逆元。通过将 $c^{p_s q_s}$提升至 x次幂,问题归结为求解离散对数问题:

$$
g^{b^m} = (c^{p_s q_s})^x.
$$

由于 g是一个阶为$b^d$的元素,该问题可以在 $O(\sqrt{d} \cdot b)$次操作内完成,当 b、d 较小时这是高效的。显然,可以选择数字 b、ps、 qs、 pt、 qt以高效的方式随机生成(并测试其是否为素数)。为了完成该方案的数学描述,我们需要解释如何高效地选择相应子群 G和 H的生成元 g和 h。生成元h的选择方式与 Groth[14]以及Damg˚ard等人方案中各自随机化空间的生成元选择方式相同,即我们找到阶为 ps(相应地, qs)的子群 $\mathbb{Z}_p^ $(相应地, $\mathbb{Z}_q^ $)的生成元 hps(相应地, hqs)。寻找 hps和 hqs的过程是直接的,且可在大多数有限域上离散对数问题的软件实现中找到(例如,迪菲‐赫尔曼、数字签名算法、Elgamal等)。接下来使用中国剩余定理找出满足以下条件的 h:

$$
h \equiv h_{ps} \mod p \
h \equiv h_{qs} \mod q.
$$

g以相同方式被选择,然而重要的是,由于 g的阶是公开的,为了安全性,它在$\mathbb{Z} p^ $和 $\mathbb{Z}_q^ $中必须具有相同的阶。因此,需要分别在 $\mathbb{Z}_p^ $和 $\mathbb{Z}_q^ $中找到一个阶为 $b^d$的子群生成元 $g {b^d}$,并以上述方式利用中国剩余定理计算 g。

素数幂子群的生成元

寻找素幂阶生成元的方法在文献中并不常见,因此我们在此概述该方法。为了找到一个阶为 $b^d$的素数 p的子群 $\mathbb{Z} p^*$的生成元 $g {b^d}$,只需执行以下步骤:

while True:
    x ← ${2... p−2}
    y ← x^(p − 1)/b mod p 
    if y ≠ 1: 
        return x^((p − 1)/b^d)

重复此过程以找到素数 q的子群 $\mathbb{Z} q^ $的一个生成元 $g_{b^d}$,然后使用中国剩余定理将这两个生成元结合起来,生成 g,即群 $\mathbb{Z}_n^ $(其中n= pq)的一个阶为 $g {b^d}$的子群的生成元。

3.1 SmallRSA子群判定假设

我们构造我们的困难性假设,以使我们系统的语义安全证明(参见定理2)尽可能直接明了。简而言之,给定上述参数,应无法区分模 n下的一个随机二次剩余与 $\mathbb{Z}_n^*$中一个阶为 $p_s q_s$的元素,且不能对 n进行因式分解。

为了使这一直觉精确化,我们首先从公钥生成算法中提取出关键信息。

定义 1. 一个RSA五元组是由(n, b, d, g, u)组成的五元组,其中:
1. u是一个整数,使得在 $\mathbb{Z}_n^ $的一个阶为位长度 u的素数的子群中,离散对数问题不可行;
2. b是一个位长度小于 u的素数;
3. d是一个大于1的整数;
4. n是一个形如 n= pq的整数,其因式分解不可行,其中:
$$
p = 2b^d p_s p_t + 1 \quad \text{and} \quad q = 2b^d q_s q_t + 1;
$$
并且其中ps 和 qs 是位长度为 u的素数,而 pt、 qt 是位长度不为 u的素数;
5. g 是 $\mathbb{Z}_n^
$中阶为 $b^d$ 的元素。

我们指出,在我们的加密方案中(第4节),RSA五元组(n, b, d, g, u)仅比公钥少一个数。这是有意为之的,因为我们将使用最后一个参数来定义该问题及其相应的困难性假设。

特别地,我们注意到本节前面描述的公钥生成过程可用于生成RSA五元组,只需忽略 h即可。

定义 2.(Small RSA 子群判定问题) 给定一个RSA五元组$(n, b, d, g, u)$以及 $x \in QR_n$,如果 $x$的阶为 $p_s q_s$,则输出‘yes’,否则输出‘no’。(这里,我们将$QR_n$ 写作模$n$的二次剩余集合。)

注意,由于对ps、 qs、 pt 和 qt 长度的要求,这构成了一个定义明确的判定问题。当然,如果我们能够对 n进行因式分解,那么这个问题将很容易解决。然而,在另一种情况下,这似乎是不可行的,从而引出了以下定义:

定义3.(小RSA子群判定假设) 给定一个RSA五元组$(n, b, d, g, u)$和 $x \in QR_n$,我们称 G 满足小RSA子群判定假设,如果对于任意多项式时间算法 A,A在解决Small RSA子群判定问题上的优势是可忽略的。

我们的假设(以及命名约定)与格罗斯的假设非常相似(参见[14,定义 2]),尽管无法直接归约。实际上,在他的假设中,格罗斯将消息空间的分布与 $\mathbb{Z}_n^*$中二次剩余的分布进行了比较。但在我们的情况下这是不可能的,因为消息空间的阶作为公钥的一部分是公开的,因此我们转而比较随机化空间(即阶为 $p_s q_s$的唯一子群)与一个随机二次剩余的分布。

4 加密方案

我们现在描述构成我们加密方案的算法。我们定义一个算法 G,当给定一个安全性参数 $\tau \in \mathbb{Z}^+$ 时,该算法输出一对$(l, u)$,其中 l 定义了一个长度,使得两个随机 l‐比特素数的乘积的因式分解在计算上不可行,而 u 定义了一个长度,使得在具有素数 u‐比特阶的群中计算离散对数在计算上不可行。

KGen(τ)

给定安全性参数 τ> 0,运行 G(τ)以获得(l, u)。选择一个小的素数基 b和消息空间上界 $d \in \mathbb{Z}^+$。令 n= pq针对 l位素数 p和 q按以下方式构造:

$$
p = 2b^d p_s p_t + 1 \
q = 2b^d q_s q_t + 1.
$$

设ps、 qs为独立选择的随机 u位素数, pt、 qt为独立选择的随机 v位素数,且满足 $b^d < 1/4|n| −\tau$(参见第4节)。若 $\log_2(b^d)+u \leq l$,则令 $v= l−(\log_2(b^d)+u)$。否则若 $\log_2(b^d)+u > l$,则令 v= 0并设置pt= qt= 1。接下来,令 G为 $\mathbb{Z}_n^ $的一个阶为 $b^d$的子群, H为 $\mathbb{Z}_n^ $的一个阶为 $p_s q_s$的子群。选取 G的一个生成元 g,使得g在 $\mathbb{Z}_p^ $ 和 $\mathbb{Z}_q^ $中均具有阶 $b^d$,并选取 H的一个生成元 h,使得 h在 $\mathbb{Z}_p^ $ 中的阶为 ps,在 $\mathbb{Z}_q^ $ 中的阶为 qs(参见第3节)。最后令 $x= p_s q_s x’$,其中$x’=(p_s q_s)^{-1} \mod b^d$。

公钥为 PK=(n, b, d, g, h, u)。私钥为 SK=(x)。

Enc(PK, m)

消息空间由范围{0… d − 1}内的整数组成。要使用公钥 PK对消息 m进行加密,需选择随机数 $r \leftarrow {1… 2^u −1}$并计算

$$
C = g^{b^m} h^r \mod n.
$$

输出密文 C

Dec(SK, C)

使用私钥 SK对密文 C进行解密,计算

$$
(C)^x \mod n = (g^{b^m} h^r)^{p_s q_s x’} = (g^{b^m})^{p_s q_s x’} (h^r)^{p_s q_s x’} = g^{b^m p_s q_s x’} = g^{b^m}.
$$

如果结果为1,则输出 m= 0。否则通过计算 $b^m = \log_g(g^{b^m} \mod n)$,然后计算 $m = \log_b(b^m)$来恢复 m。由于 g的阶是小素数基 b的幂 d,这可归结为在阶为 b的循环群中进行 d次离散对数的计算。由于 b被选择为较小的值,因此该计算是高效的。

备注1. 在特殊情况 $b= 2$ 下,我们可以将 $p$ 和 $q$ 写成以下形式:

$$
p = 2^d p_s p_t + 1, \tag{1}
$$
$$
q = 2^d q_s q_t + 1. \tag{2}
$$

这种情况产生了一种与Joye等人基于次幂剩余符号的密码系统类似的密码系统。[3,15]基于 $2^d$‐次幂剩余符号。在已知n的分解的情况下, d实际上可以直接恢复(即无需通过指数运算消除 h项),使用Joye等人提出的算法(参见[15]的 算法1),从而实现更快的解密。

备注2. 通过将消息置于 g的指数的指数中(即双指数),并将可能的消息集合限制为 $0 \leq m < d$,我们获得了一种具有有趣同态性质的密码系统,据我们所知,该性质尚未被探索,接下来将进行讨论。

限制bd的长度

之前在相关密码系统中已使用过能同时整除(p−1)和(q−1)的公因数[3,9,15]。我们考虑相对于 $|b^d|$ 与 $|p|$ 以及 $|q|$的适当上界。回顾 $p= b^d p_s p_t +1$和 $q= b^d q_s q_t +1$,因此 $n= pq= b^{2d} p_s p_t q_s q_t + b^d(p_s p_t + q_s q_t) + 1$。令 $x=(n − 1)/b^d = b^d p_s p_t q_s q_t + p_s p_t + q_s q_t$。McKee 和 Pinch 提出的一种因式分解方法[20]1可以利用小步大步法通过 n次运算恢复 $O(n^{4/b^d})$的因数。因此,为了安全性,必须满足

$$
b^d < \frac{1}{4}|n| − \tau.
$$

4.1 同态性质

首先我们注意到,与 $\mathbb{Z}_n^*$中的相关方案相比,我们的加密方案不具备加法同态性:

$$
\text{Enc}(m_1) \cdot \text{Enc}(m_2) = g^{b^{m_1}} h^{r_1} \cdot g^{b^{m_2}} h^{r_2} = g^{(b^{m_1} + b^{m_2})} h^{(r_1 + r_2)}.
$$

也就是说,在$\mathbb{Z}_n^*$ 中将密文相乘会产生一个 g的指数,该指数可能不是 b的幂,因此无法表示有效明文的加密。

与相关系统的标量乘法同态类似,我们系统的scalar additive同态是:

$$
\text{Enc}(m_1)^{b^{m_2}} \mod n = (g^{b^{m_1}} h^r)^{b^{m_2}} = g^{b^{m_1} b^{m_2}} h^{r’} = g^{b^{(m_1+m_2)}} h^{r’} = \text{Enc}(m_1+m_2).
$$

这产生了一个有趣的阈值同态性质:

$$
\text{Enc}(m_1)^{b^{m_2}} =
\begin{cases}
\text{Enc}(m_1 + m_2) & \text{if } m_1 + m_2 < d \
\text{Enc}(0) & \text{otherwise}
\end{cases}
$$

定理1 (同态阈值函数) 设 $f_d(m_1, m_2)$为阈值函数,当 $m_1 + m_2 < d$时输出 $m_1 + m_2$,否则输出0。对于 $m_1, m_2 \in \mathbb{N}$,上述标量同态在 $m_1, m_2$上计算 $f_d$ 的加密,即$\text{Enc}(m_1)^{b^{m_2}} = \text{Enc}(f_d(m_1, m_2))$。

证明. 由于 g在 $\mathbb{Z}_n^*$中的阶为 $b^d$,因此 g的指数 $x \in \mathbb{N}$满足 $g^x \mod b^d \mod n$,于是 $\text{Enc}(m_1)^{b^{m_2}}$可写成 $g^{b^{(m_1+m_2)} \mod b^d} h^r$。如果 $m_1 + m_2 < d$,则 $b^{m_1+m_2} \mod b^d = b^{m_1+m_2}$;但如果 $m_1 + m_2 \geq d$,则存在某个 $a \geq 0$使得$b^{m_1+m_2} = b^d + a$成立。由于 $b^d \equiv 0 \mod b^d$,因此 $b^d + a = 0 \cdot b^a \equiv 0 \mod b^d$。

4.2 加密的语义安全

在本节中,我们证明我们系统的语义安全性。

定理2. 上述加密方案是语义安全的,前提是定义3中的复合阶子群判定假设成立。

该证明是标准技术的一个直接应用(参见例如[5,定理3.1]),尽管我们完全用算法的语言来表述。具体而言,我们假设存在一个算法 A′,其以非可忽略的优势 ε(τ)破坏了我们加密方案的语义安全。利用该算法,我们将构造一个多项式时间算法 A,用于解决Small RSA子群判定问题。

这里的直觉关键是 A试图判断一个元素 x是否能构成我们加密方案的有效公钥。

证明. 假设存在一个多项式时间算法 A′,能够破坏上述加密方案的语义安全。具体来说,给定一个可能无效的公钥, A′生成两条消息 m0和 m1。如果该公钥有效,则在给定对应其中一条消息的密文 c时,它能以50%+ ε的概率正确猜测 c是哪条消息的加密结果;而对于无效的公钥, A′随机选择其中一条消息。

利用 A′,我们将构造一个多项式时间算法 A来解决Small RSA子群判定问题。该算法 A的输入为一个RSA五元组$(n, b, d, g, u)$和一个二次剩余 $x \in \mathbb{Z}_n^*$ 。根据这些值,我们构造一个(可能无效的)公钥$(n, b, d, g, x, u)$,并将其提供给 A′。

算法 A′通过生成两个明文 m0和 m1来响应。我们选择 $i \leftarrow {0, 1}$和 $r \leftarrow {1… 2^u−1}$,并计算 $c \equiv g^{b^{m_i}} x^r \mod n$的值。根据该值, A′输出 $j \in {0, 1}$。基于此信息,我们按如下方式构造 A的输出:

$$
\text{yes if } i = j, \text{ no otherwise.}
$$

如果 x从 $\mathbb{Z}_n^*$的二次剩余中均匀选取,则 c在由 x生成的子群的适当陪集中也是均匀分布的。因此,当 x变化时, c也随之均匀变化,从而特别地独立于 i的选择。因此, A′正确猜测的概率等于50%。

另一方面,如上所述, $r < 2^u$,因此关键是 $r < p_s, q_s$。当 x是阶为 $p_s q_s$的元素时,这使 A′具有优势 ε,并且可以明显看出该优势会传递给 A。

5 安全比较协议

在本节中,我们提出了一种利用前一节所述加密方案对整数进行安全比较的协议。正如我们之前所展示的,该方案的阈值同态性质可用于私密地计算单向阈值函数 $f_d(m_1, m_2)$的加密结果。这在某些应用中可能是可取的,但对于输出单个比特$(m_1 \geq m_2)$的双边安全比较协议而言,在$m_1 < m_2$的情况下, $f_d$会输出 和$(m_1 + m_2)$,因此需要额外的组件。

5.1 高层策略

我们的策略是使用一个额外的(但不同的)密码系统。密码系统 CSfd是第 4节中提出的具有阈值同态性质的密码系统。附加的密码系统 CS⊕是一个具有加法同态的通用语义安全密码系统。 P1和 P2分别持有 CSfd 和 CS⊕的私钥。

其思路是使用 CSfd ,通过以下输入,利用我们的同态阈值方法计算 fd,从而计算语句$(m_1 > m_2)$。

$$
f_d(m_1, d− m_2) =
\begin{cases}
d + m_1 − m_2 & \text{if } d + m_1 − m_2 < d \
0 & \text{otherwise}
\end{cases}
$$

如果 $m_1 \geq m_2$, P1将收到对0的加密。相反,如果 $m_1 < m_2$, P1将收到它们差值的加密,这会向 P1泄露关于 P2输入的信息。为了解决这个问题, P2将在 P1解密之前同态地向 CS fd 添加一个盲化因子 s。如果 $f_d(m_1, d − m_2) = 0$, P1在解密过程中恢复出的指数将等于 P2所使用的盲化因子 s,否则它将是 $d + m_1 − m_2 + s$。各方执行一次明文相等性测试(PET),以私密地确定这些值是否相等,从而判断 $m_1 \geq m_2$是否成立。

5.2 明文相等性测试子协议

设PET(a1, a2)为两方P1, P2之间执行的安全明文相等性测试,其中每一方分别持有一个私有值 a1, a2,且 P2持有私钥。该协议接受各方的私有输入,若 a1= a2成立则输出0,否则输出一个随机值。

设 CS⊕=(Gen⊕,Enc⊕,Dec⊕) 为一个消息空间具有大素数阶的语义安全加法同态密码系统。不失一般性,一种高效的实现方式是采用在快速椭圆曲线上实现的Elgamal的指数变体(参见例如[22])。

明文相等性测试。 明文相等性测试 PETCS⊕ 包含3 个步骤:
1. P2计算加密 $A_2 \leftarrow \text{Enc}⊕(a_2)$并将其发送给 P1;
2. P1同态计算 a1与 a2之间的差值为 $A_1 \leftarrow \text{Enc}_2(−a_1)·A_2$,然后通过计算 $A’_1 \leftarrow (A_1)^r$对明文结果加盲,其中 $r = 0$是消息空间 M⊕中的一个均匀随机值,然后将结果 $A’_1$发送给 P2;
3. P2计算 $m \leftarrow \text{Dec}⊕(A’_1)$,如果 $m = 0$则输出真,否则输出假。

这种明文相等性测试方法被广泛使用,因此我们仅简要回顾其正确性和隐私性。关于正确性,注意到步骤2结束时的结果是加密值$\text{Enc}⊕(r(a_2 − a_1))$,当 $a_1 = a_2$时,该值是对0的加密,否则为非零值。简而言之, P2的隐私性由Enc⊕的语义安全保证。 P1的隐私性在 $a_1 = a_2$时得到保证,需满足以下两个条件:(a) 差值非零,(b) 随机因子非零,以及(c) 消息空间具有某个素数阶 k。前者在给定情况下成立,后两者根据定义成立,因此$(a_2−a_1) r \in \mathbb{Z}_k^ $均为阶为 k的循环群的生成元,从而当 r时, $r(a_1−a_2)$在 $\mathbb{Z}_k^ $中是均匀分布的。

5.3 安全比较协议

我们现在在图1中展示我们的安全整数比较协议。正确性如下所示,安全性在第6节中证明。

定理3(正确性) 两个参与方 P1 和 P2 拥有私有输入 $0 \leq m_1、 m_2 < d$。该协议的结果是,参与方 P2 输出一个比特,对应于($m_1 \geq m_2$), P1 不输出任何内容。

参与方 P1 首先创建 $b^{m_1}$ 的加密,然后发送给 P2,后者同态计算

$$
w = b^{m_1} b^{d−m_2} + s = b^{d+m_1 −m_2} + s.
$$

情况1。 如果 $m_1 \geq m_2$,则$(m_1 −m_2) \geq 0$,因此我们有 $b^{d+a}$,其中 $a \geq 0$。根据第4.1节中提出的同态性质, $b^{d+a} = 0 \cdot b^a \equiv 0 \mod b^d$,因此 $w = 0 + s = s$。

示意图0 )

5.4 通过分块扩展到任意长度比较

尽管可以使用图1中协议的一次执行来比较任意长度的整数,但其渐近复杂度在输入数的位长度上是指数级的。假设我们要比较两个 $\ell$‐位数字。那么我们有 $d \geq 2^\ell$。因此,我们需要一个至少为 $\mathbb{Z}_n^*$ 的 $2^\ell$ 比特的子群(如果 $b > 2$ 则需要更多比特),这意味着公钥为 $O(2^\ell)$ 比特。

出于效率考虑,将 $b$ 和 $d$ 设为固定值,并通过运行多个实例来扩展协议以适应任意输入大小会更有帮助。我们采用的方法是将输入以底 $d$ 表示,并分别对每个系数进行比较。该方法仅需对最终的明文相等性测试阶段做轻微修改。

假设我们希望比较两个整数 $0 \leq m_1, m_2 < 2^\ell$,其中 $2^\ell > d$。令$k = \lfloor \log_d(2^\ell) \rfloor$。将整数 $m_1, m_2$以 $d$为底重写如下:

$$
m_1 = \alpha_{k-1} d^{k-1} + \alpha_{k-2} d^{k-2} + \cdots + \alpha_1 d + \alpha_0
$$
$$
m_2 = \beta_{k-1} d^{k-1} + \beta_{k-2} d^{k-2} + \cdots + \beta_1 d + \beta_0
$$

对于 $0 \leq \alpha_i, \beta_i < d$。接下来我们观察到,如果 $m_1 \geq m_2$,那么以下 $k$ 个布尔表达式中恰好有一个为真:

$$
(\alpha_{k-1} \geq \beta_{k-1}) \quad \text{or} \quad (\alpha_{k-1} = \beta_{k-1}) \land (\alpha_{k-2} \geq \beta_{k-2}) \quad \text{or}
$$
$$
(\alpha_{k-1} = \beta_{k-1}) \land (\alpha_{k-2} = \beta_{k-2}) \land (\alpha_{k-2} \geq \beta_{k-2}) \quad \text{or}
$$
$$
\cdots
$$
$$
\text{or} \quad (\alpha_{k-1} = \beta_{k-1}) \land (\alpha_{k-2} = \beta_{k-2}) \land \cdots \land (\alpha_0 \geq \beta_0).
$$

反之,如果$m_1 < m_2$,则每个表达式均为假。现在我们可以利用这一事实,通过运行 $k$个协议实例,并将各个明文相等性测试替换为上述的每个布尔测试,来安全地评估$(m_1 \geq m_2)$。在最后一步, P1以打乱的顺序将各个PET密文发送给 P2。随后,如果某次解密表明存在匹配, P2将无法判断该匹配对应的是哪个表达式——只能知道发生了匹配,因此 $m_1 \geq m_2$。

6 安全性

我们的安全性模型假设在两方计算环境中存在一个半诚实(被动)的对手。各方遵循协议中的正确流程,但试图通过协议执行过程中交换的消息获取有关对方输入的额外信息。我们采用基于模拟的证明方法,证明在真实协议执行中参与者的视图与给定的模拟视图在计算上不可区分时,该协议是安全的。

仅涉及该方的输入和输出。下面我们定义半诚实模型下的模拟安全性。

参与方 P1和 P2在协议 Π中进行交互,该协议根据预期输入计算协议的函数F并产生预期输出。设F为定义协议 Π理想功能性的函数F,将一对输入 (in1,in2)映射到一对输出(out1,out2)。参与者 Pi(其中 i= A, B)的 view记为VIEWΠ Pi(in1, in2),定义为Pi在整个协议执行过程中所观察和生成的信息。设Simi为一个模拟器,它接收参与方 Pi的输入以及协议的理想功能性 F,并生成协议的一段执行记录。基于此设定,我们现在给出协议的模拟安全性的定义。

定义4。 我们说一个协议 Π从Pi的角度(对于 i= A, B)对被动攻击者是安全的,如果对每一方都存在一个概率多项式时间模拟器Simi,使得Simi(ini, F(in1, in2))在计算上不可区分于(VIEWΠ Pi(in1, in2), outi)。

我们说一个协议 Π 是安全的,可抵御被动攻击者,如果它从 P1 和 P2的角度来看都是安全的。

本节其余部分的目标是证明图1中的比较协议(在下文中将始终表示为 Π)对被动攻击者是安全的。我们通过分别证明P1和 P2的安全性来实现这一点。

在我们的情况下,理想功能 F 是一个函数,其输入为$(m_1, m_2)$,输出为 α(一个二元指示符,当 $m_1 \geq m_2$ 时结果为真,否则为假)。显然, F 定义了协议 Π 的功能。当 Π 终止时, P2 收到 F 的输出。令 OUTPUTΠ(m1, m2) 表示 P2 接收到的输出。

引理1. 协议 Π 保护 P1 的隐私。

证明。 为了证明P2不会泄露关于 m1的任何信息,我们将为 P2构建一个有效的模拟器Sim2,使其具有以下性质:

$$
\text{Sim} 2(m_2, \text{CS}_2 \text{ private key}, (m_1 \geq m_2)) \stackrel{c}{\equiv} \text{VIEW} {\Pi}^{P_2}(m_1, m_2).
$$

这里,我们用 $\stackrel{c}{\equiv}$表示计算不可区分性的关系。模拟器Sim2获得 m1,并通过首先采样一个随机值 $C \leftarrow \mathbb{Z}_n^*$,然后采样随机值 r、 s ,并计算密文 $D \leftarrow C^{m_2} \cdot g^s h^r$和Enc′(s),从而能够模拟 P2’s。为了模拟从P2接收到的最终 PET密文,若$(m_1 \geq m_2)$成立,则模拟器加密Enc′(0);否则,从Enc的明文空间中采样一个随机非零值 r,并计算Enc′(r)。

根据 CS1的语义安全,多项式时间算法无法区分 C与 m1的有效加密。所有其他值均可直接从 C和提供给Sim2的输入计算得出。

引理2. 协议 Π 保护 P2 的隐私。

证明. 现在我们构造一个具有如下性质的模拟器 Sim1:

$$
\text{Sim} 1(m_1, \text{CS}_1 \text{ private key}) \stackrel{c}{\equiv} (\text{VIEW} {\Pi}^{P_1}(m_1, m_2), \text{OUTPUT}_{\Pi}(m_1, m_2)).
$$

在第一步中,Sim1使用其输入从 CS1 构造 $C \leftarrow \text{Enc}(m_1)$。接着,它为 $z \leftarrow \mathbb{Z}_{b^d}$ 构造一个 CS1加密 $D \leftarrow \text{Enc}(z)$。它将 CS1 的私钥应用于 D 以恢复 z。对于从 P2 接收到的明文相等密文,它在 CS2 的密文空间中选择一个随机值。例如,如果在素数阶群 G 中使用 Elgamal,则发送 $E = \langle \alpha, \beta \rangle$,其中 $\alpha, \beta \leftarrow G$。最后,它计算 z 与 E 中加密明文之间的同态差,并使用 CS2 的公钥进行盲化/重随机化。根据 CS2 的语义安全, E 是一个均匀值,因此没有任何多项式时间算法能够以优势区分 E 与 P1 视角下的 $\text{Enc}’(s)$。

仅需进一步证明从模拟密文 D 恢复的指数,即 $z \leftarrow \mathbb{Z} {b^d}$,在计算上不可区分于 P1 对恢复指数 w 的真实视图。首先定义集合 $R \subset \mathbb{Z} {b^d}$ 为所有满足 $r \equiv 0 \mod b$ 的值 $r \in \mathbb{Z}_{b^d}$ 的集合。令 $s, z \leftarrow R$。 P1 解密 D 并恢复明文 w,但无法区分真实世界中 $w = b^{d+m_1−m_2−1} + s$ 的情况与模拟值 z 的情况。后一种情况根据定义是 R 中的一个均匀值。为了证明前一种情况在 R 中也产生一个均匀值,只需首先证明对所有 $(m_1, m_2, s)$ 均有 $(b^{d+m_1−m_2} + s) \mod b^d \in R$ 成立,其次证明结果在 R 中是均匀分布的。

首先我们注意到,若$(b^{d+m_1−m_2} + s \mod b^d) \mod b = 0$,则$(b^{d+m_1−m_2} + s) \mod b^d \in R$。由于内层和外层的模具有相同的底,因此可以将其简化为 $(b^{d+m_1 −m_2} + s) \mod b = 0$。接下来观察到,对于所有 x, $b^x \equiv 0 \mod b$成立,因此只剩下 $s \mod b = 0$这一条件,而该条件由 s的定义本身就已满足。因此,$(b^{d+m_1 −m_2} + s) \in R$。其次,由于s在 R中是均匀分布的,则 $b^{d+m_1 −m_2} + s$在 R 中也是均匀分布的。因此,任何算法都无法以某种优势区分 w的真实值与 R中的均匀值,从而也无法区分真实密文$g^{b^{d+m_1 −m_2} + s} h^r$与模拟密文 $g^z h^r$。

7 性能分析

在本节中,我们将图1中我们的协议与Damg˚ård、Geisler和Krøigaard( DGK)的两方安全整数比较协议[9,10]进行性能比较。

两种方法的主要区别在于,DGK 在输入整数的位分解的逐元素加密上执行其同态操作,而我们的方案则在单个加密内完成比较,并辅以一次明文相等性测试。这为比较这两种方法提供了一个有趣的机会,因为我们的方案中明文空间的比特数随输入大小线性增长,而 DGK 使用对数级数量的密文且其消息空间为对数级。

首先让我们考虑范围 $0 \leq m < d$ 内的消息,并令 $m = a_k 2^k + \cdots + a_1 k + a_0$表示其二进制分解。DGK安全比较协议由 $k = \lfloor \log_2(d) \rfloor$个加密系数 $a_i$的密文组成

$$
\text{Enc}_{\text{DGK}}(a_i) = g^{a_i} h^r \mod n
$$

其中生成元 g的阶对应于大于 k+ 2的下一个最大素数。我们的方案在其基本形式中包含一个密文,该密文直接加密 m。

$$
\text{Enc}_{fd}(a_i) = g^{b^{a_i}} h^r \mod n
$$

其中生成元 g具有对应于 $b^d$的大阶。如第5.4节所述,我们可以通过固定 $b^d$ 并执行多次实例化,将方案扩展到任意位长度,而无需使模数线性增长 n。

为具体分析起见,我们将设定 $b^d = 2^8 = 256$,然后将涉及8个密文且具有8比特消息空间的DGK协议运行,与涉及单个密文且具有素幂阶256位消息空间(外加一次明文相等性测试)的本协议运行进行比较。通过并发执行2次、 4次、 8次等本协议,并对PET进行第5.4节中所述的修改,可实现更长位长度的消息,例如16、32、64等。

加密与重随机化成本

尽管存在差异,但从性能角度来看,加密操作非常相似。由于明文空间较小,DGK加密的主要时间消耗在于计算随机因子 $h^r \mod n$。我们在两种方案中对这些参数进行了等效设置(h在我们的方案中的阶为 $p_s q_s$,在DGK中为 $v_p v_k$)。在这两种情况下,g和 h的幂可以预先计算,并且在两种方案中计算 h的开销是相当的;然而,在我们的方案中计算 g通常更耗时,因为我们加密的是一个256位的值,而不是8个单比特值。由于我们方案中的消息仅由256个可能值中的一个组成,因此我们可以将 g的这些幂存储在查找表中,以加快加密速度。

由于重随机化被建模为与对0的加密进行同态加法,因此该操作在两个方案中所需时间相同。然而,对明文空间进行盲化则涉及变底指数运算(除非通过加法链实现优化),这种运算不易优化,在我们的方案中耗时更长,原因是其相对更大的消息空间。

解密开销

Damg˚ard et al. [10]指出,他们方案中的解密可以通过短指数模 p的幂运算高效完成(而不是n= pq):

$$
C^{v_p} \mod p = g^{m v_p} h^{v_p} = g^{m v_p}.
$$

在DGK协议中,解密仅用于检查$C^{v_p} \equiv 1 \mod p$是否成立,从而判断 $m = 0$是否成立。从理论上讲,在我们的方案中解密速度几乎一样快。

消息空间仅包含 $m$ 的 $d = 256$ 种可能性。然而,我们的解密方案在解密过程中还必须考虑秘密指数 $p_s$ 在明文空间中的影响,即

$$
C^{p_s} = g^{m p_s} h^{p_s} \equiv g^{m p_s} \mod p.
$$

在第4节的描述中,我们使用因子 $x’$ 来消除 $p_s$在 $g$指数中的项,其中 $x = p_s x’ \equiv 1 \mod b^d$。然而,这要求接收方执行一次 $(|p_s| + |b^d|)$比特的幂运算。通过改为计算 $C^{p_s}$,然后计算离散对数以恢复 $m p_s$,再计算$(m p_s)(p_s)^{-1} \mod b^d$,可以提高效率。对于像 $b = 2$这样较小的底,计算离散对数是高效的。

在我们下面的实现中,通过预计算将子群(阶为$2^{256}$)中取离散对数的开销优化至大约一次256比特固定底幂运算的成本。

通信复杂度

在轮数复杂度方面,DGK是一个两轮协议:每一方进行一次传输。我们的协议涉及密码系统CSfd的两轮以及PET子协议中 CS⊕的两轮。 CSfd 和 CS⊕密文可以通过 P2合并为一次传输,使得整个协议共3轮。

在通信复杂度方面,我们的方案在一个密文中处理8位数字,而DGK则使用8个同等大小的密文。当使用椭圆曲线 CS⊕时,其贡献相对较小。例如,在 128位安全级别下,DGK中每一方每次比较传输24千字节。在我们的方案中, 每一方传输3.1kb,减少了7.7倍,在更高的安全级别下渐近趋势接近8倍。

作为简化假设,我们未计入网络传输的时间开销,尽管由于两种协议之间的总通信开销存在显著差异,这只会对性能产生有利影响。

成本 PET 和 CS⊕

我们的协议使用了一个额外的密码系统 CS⊕来安全地测试明文等价性。 CS⊕的主要要求是它必须是语义安全、加法同态的,并且其消息空间为大素数幂。存在许多此类方案,为我们提供了多种选择。

特别是为了提高性能,我们使用指数型Elgamal,并在快速椭圆曲线上实现群运算,以最小化PETCS⊕子协议相对于在 CSfd 中操作 $\mathbb{Z}_n^*$的成本。

参数化

对于密码学参数,我们遵循当前NIST1关于密钥长度的最低推荐指南,该指南规定了模数和离散对数群的位长度。我们注意到格罗斯[14]曾推测,由于其密码系统的随机化空间的阶是隐藏的,出于性能考虑,可能可以安全地将其参数化为比通常使离散对数问题困难所需的更小尺寸。然而,Coron等人[8]发现了针对此方法的一种攻击,本质上在 $O(\sqrt{p_s})$时间和 $O(\sqrt{p_s})$空间内。尽管 $O(\sqrt{p_s})$的空间需求使得该攻击严格劣于通用的离散对数求解方法(并且实际上构成了显著的现实世界实现挑战),我们认为不建议采用低于离散对数群大小最低推荐值的参数。我们相应地对 $p_s$ 和 $q_s$(以及相应的DGK随机化器空间)的位长度 u进行参数化。在128位安全级别下需要 $|n| = 3072, |p|, |q| = 1536, u = |p_s|, |q_s| = 256$,以及$|p_t|, |q_t| = 1536 −256 − \log_2(2^{256}) = 1024$。192位安全级别需要$|n| = 7680, |u| = 384$,而256位级别需要 $|n| = 15360, |u| = 512$。

对于Enc⊕的实现,我们使用了在椭圆曲线上实现的Elgamal。我们考虑过使用NIST曲线secp256r1,2,但为了性能选择了Edwards曲线Ed255193。对于DGK的实现,我们采用了类似的参数化。采用[10]中的符号表示法,我们设定 $|n| = 3072$、$|p|$、 $|q| = 1536$、随机化空间 $|v_p|$、 $|v_q| = 256$,以及阶为 $u = 11$的消息空间,该值是大于$\log_2(d+ 2)$的下一个素数。

实现

我们实现了DGK协议 [9,10]以及图1中我们的协议,使用 gmpy2包进行优化的基于GMP的整数运算。对于 CS⊕我们使用了 PyNaCl,它是libsodium 4的Python绑定,其中包含Ed25519曲线的优化实现。然而, CS ⊕的实现并不完整,因为基于椭圆曲线的ElGamal需要点加法,而大多数Ed25519的实现都专注于ECDH和ECDSA的应用,并且明确不在此类应用程序编程接口中暴露这种底层曲线操作。在性能方面,与点乘法相比,点加法的贡献较小,而点乘法本身又远小于 CSfd中的操作。在每种情况下,我们都采用了诸如预计算固定底指数以及在mod p而非mod n下运算等优化方法。

性能结果

我们在英特尔至强E5‐2697A @ 2.60GHz上使用每个协议的单线程实例进行了基准测试。我们对每个协议使用随机8位数运行了1000次,并记录了在线计算时间(即不包括构建查找表的时间)。我们在表1中展示了将每项操作的开销均摊到每位的成本后的性能结果,并在表2中显示我们的方案每位比较速度比DGK快最多达5倍。

我们的方案在更高安全级别下变得相对较快的原因可归结为两个因素。其一是RSA环境中的算术运算增长速度超过其椭圆曲线对应运算,从而削弱了明文相等性测试的相对贡献。其二是 g的阶固定为256比特,使得在此子群中的运算(比较、加盲等)相对于在 h中的运算所占总耗时的比例随着安全级别的提升而逐渐减少,而 h的规模会随安全级别逐级增长。

8 结论

即使经过这么多年, $\mathbb{Z}_n^*$中的密码系统仍不断以新的特性给我们带来惊喜。本文提出了一种在素幂阶子群中运行的新密码系统,该系统具有新颖的阈值同态性质。我们利用这一性质设计了一种基于公钥的安全整数比较协议,能够以单个密文完成整个比较过程,比使用按位分解的传统方法更快。


表 1. 各操作的安全整数比较协议每位摊销成本

安全级别(比特) DGK [9,10] 我们提出的协议 第4节
EncP1 CompP2 DecP1 EncP1 CompP2 PETP1 PETP2
128 1.04 1.19 0.46 0.13 0.37 0.26 0.01
192 6.02 6.56 3.08 0.81 1.70 0.95 0.01
256 22.6 23.3 12.8 2.84 5.22 2.88 0.01

表 2。每比特摊销总成本

安全级别 总时间 (毫秒) (毫秒) 加速比
DGK[9,10] 我们的协议
128 2.7 0.8 3.5x
192 15.7 3.5 4.5x
256 58.7 10.9 5.4x
本项目采用C++编程语言结合ROS框架构建了完整的双机械臂控制系统,实现了Gazebo仿真环境下的协同运动模拟,并完成了两台实体UR10工业机器人的联动控制。该毕业设计在答辩环节获得98分的优异成绩,所有程序代码均通过系统性调试验证,保证可直接部署运行。 系统架构包含三个核心模块:基于ROS通信架构的双臂协调控制器、Gazebo物理引擎下的动力学仿真环境、以及真实UR10机器人的硬件接口层。在仿真验证阶段,开发了双臂碰撞检测算法和轨迹规划模块,通过ROS控制包实现了末端执行器的同步轨迹跟踪。硬件集成方面,建立了基于TCP/IP协议的实时通信链路,解决了双机数据同步和运动指令分发等关键技术问题。 本资源适用于自动化、机械电子、人工智能等专业方向的课程实践,可作为高年级课程设计、毕业课题的重要参考案例。系统采用模块化设计理念,控制核心硬件接口分离架构便于功能扩展,具备工程实践能力的学习者可在现有框架基础上进行二次开发,例如集成视觉感知模块或优化运动规划算法。 项目文档详细记录了环境配置流程、参数调试方法和实验验证数据,特别说明了双机协同作业时的时序同步解决方案。所有功能模块均提供完整的API接口说明,便于使用者快速理解系统架构并进行定制化修改。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文围绕基于非支配排序的蜣螂优化算法(NSDBO)在微电网多目标优化调度中的应用展开研究,提出了一种改进的智能优化算法以解决微电网系统中经济性、环保性和能源效率等多重目标之间的权衡问题。通过引入非支配排序机制,NSDBO能够有效处理多目标优化中的帕累托前沿搜索,提升解的多样性和收敛性,并结合Matlab代码实现仿真验证,展示了该算法在微电网调度中的优越性能和实际可行性。研究涵盖了微电网典型结构建模、目标函数构建及约束条件处理,实现了对风、光、储能及传统机组的协同优化调度。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法应用的工程技术人员;熟悉优化算法能源系统调度的高年级本科生亦可参考。; 使用场景及目标:①应用于微电网多目标优化调度问题的研究仿真,如成本最小化、碳排放最低供电可靠性最高之间的平衡;②为新型智能优化算法(如蜣螂优化算法及其改进版本)的设计验证提供实践案例,推动其在能源系统中的推广应用;③服务于学术论文复现、课题研究或毕业设计中的算法对比性能测试。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注NSDBO算法的核心实现步骤微电网模型的构建逻辑,同时可对比其他多目标算法(如NSGA-II、MOPSO)以深入理解其优势局限,进一步开展算法改进或应用场景拓展。
内容概要:本文详细介绍了使用ENVISARscape软件进行DInSAR(差分干涉合成孔径雷达)技术处理的完整流程,涵盖从数据导入、预处理、干涉图生成、相位滤波相干性分析、相位解缠、轨道精炼重去平,到最终相位转形变及结果可视化在内的全部关键步骤。文中以Sentinel-1数据为例,系统阐述了各环节的操作方法参数设置,特别强调了DEM的获取处理、基线估算、自适应滤波算法选择、解缠算法优化及轨道精炼中GCP点的应用,确保最终获得高精度的地表形变信息。同时提供了常见问题的解决方案实用技巧,增强了流程的可操作性和可靠性。; 适合人群:具备遥感GIS基础知识,熟悉ENVI/SARscape软件操作,从事地质灾害监测、地表形变分析等相关领域的科研人员技术人员;适合研究生及以上学历或具有相关项目经验的专业人员; 使用场景及目标:①掌握DInSAR技术全流程处理方法,用于地表沉降、地震形变、滑坡等地质灾害监测;②提升对InSAR数据处理中关键技术环节(如相位解缠、轨道精炼)的理解实操能力;③实现高精度形变图的生成Google Earth可视化表达; 阅读建议:建议结合实际数据边学边练,重点关注各步骤间的逻辑衔接参数设置依据,遇到DEM下载失败等问题时可参照文中提供的多种替代方案(如手动下载SRTM切片),并对关键结果(如相干性图、解缠图)进行质量检查以确保处理精度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值