本文适合有一定的数学基础的人进行阅读,有很多基础概念不会在本文中详细介绍,如多项式的次数、系数、项、一元多项式、多元多项式等特别基础的概念。本文主要讨论一元多项式。多项式有不少核心性质,如运算封闭性、因式分解、插值与近似、求导与积分等。本文主要关注其在密码学中的性质以及应用。接下来直接上干货。
本文适合有一定的数学基础的人进行阅读,有很多基础概念不会在本文中详细介绍,如多项式的次数、系数、项、一元多项式、多元多项式等特别基础的概念。本文主要讨论一元多项式。
多项式有不少核心性质,如运算封闭性、因式分解、插值与近似、求导与积分等。
本文主要关注其在密码学中的性质以及应用。接下来直接上干货。
定义在域$F$上的$n-1$次多项式的系数表示: $$f(x)=a_0+a_1x+a2x^2+...+a{n-1}x^{n-1}$$
假设有$n$个不同的点$(x_1,y_1),(x_2,y_2),...,(x_n,y_n)$,那么根据拉格朗日插值法,该多项式式可以表示为: $$f(x)=y_1\ast h_1(x)+y_2\ast h_2(x)+...+y_n\ast h_n(x)$$
其中: $$ \begin{aligned} h_1(x)&=\frac{(x-x_2)(x-x_3)...(x-x_n)}{(x_1-x_2)(x_1-x_3)...(x_1-x_n)} \ \dots\ h_i(x)&=\frac{(x-x_1)(x-x2)...(x-x{i-1})(x-x_{i+1})...(x-x_n)}{(x_i-x_1)(x_i-x_2)...(xi-x{i-1})(xi-x{i+1})...(x_i-x_n)} \ \dots \ h_n(x)&=\frac{(x-x_1)(x-x2)...(x-x{n-1})}{(x_n-x_1)(x_n-x_2)...(xn-x{n-1})} \end{aligned} $$ 点的表示形式说明如果一个$n-1$次多项式有$n$个不同点,那么该多项式可以通过拉格朗日插值法唯一的表示出来。这种形式比较简单写出,只不过在计算多项式在某个点的值的时候,计算复杂度比较高。
纠错码、信息论编码、同态加密、秘密分享、零知识证明、多方安全计算等。
双线性映射是现代密码学(尤其是椭圆曲线密码学)中的核心工具,其本质是一种同时对两个输入参数满足线性性质的映射。它在密码协议设计(如密钥交换、数字签名、属性基加密、零知识证明等)中具有不可替代的作用。以下从定义、性质、分类、构造及应用等方面展开简单介绍。
接下来直接上干货
$t$ 为阈值,$n$ 为参与者个数,不妨将他们的编号设置为 $1,2,\dots,n$,一般 $t\ge n/2+1$。这里不妨假设 $G_1=G_2$,生成元 $g$ 。
也就是说组内有 $n$ 个参与者,每个人都有自己得公私钥对,都可以对某一个特定的消息进行签名,搜集这些签名,只要是能搜集到至少 $t$ 个签名就能恢复出阈值组签名,且能通过组公钥的验证。这个方案可以应用于带有阈值的场景,也可以应用于可验证的伪随机数生成,可以应用到区块链的共识机制中。
计算各自的公私钥对 \ 比如 $P_1$, 先秘密的接收其他参与方发来的 $f_2(1),\dots,f_n(1)$,并验证是否有效,验证方法:验证 $g^{fi(1)}=A{i0}(A_{i1})^1\dots(A_{i,t-1})^{1^{t-1}}$ 是否成立,于是 $P_1$ 的 $sk_1=f_1(1)+f_2(1)+\dots+f_n(1))$ ,公钥是 $pk_1=g^{sk_1}$ 。\ \ 比如 $P_2$ ,先秘密的接收其他参与方发来的 $f_1(2),\dots,f_n(2)$ ,并验证是否有效,验证方法:验证 $g^{fi(2)}=A{i0}(A{i1})^2\dots(A{i,t-1})^{2^{t-1}}$ 是否成立,于是 $P_2$ 的 $sk_2=f_1(2)+f_2(2)+\dots+f_n(2))$ ,公钥是 $pk_2=g^{sk_2}$。
公钥不用广播了,根据多项式承诺本地就可以去计算出来,计算公式如下:
$$
\begin{aligned}
pk_i &=g^{f_1(i)+f_2(i)+\dots+f_n(i)} \
&=g^{f_1(i)}\ast g^{f_2(i)}\ast \dots\ast g^{fn(i)} \
&=(A{10}\ast \dots\ast A{n0})\ast (A{11}\ast \dots\ast A{n1})^{i^1}\ast \dots\ast (A{1,t-1}\ast \dots\ast A_{n,t- 1})^{i^{t-1}} \
\end{aligned}
$$
对于参与方$P_i$ 计算$\sigma_i=H(m)^{sk_i}$作为签名。并广播出去。
任意参与方都可以去搜集其他参与方的签名分片,一旦搜集到 $t$ 个签名分片,就可以恢复出组签名。比如说搜集到了编号为 $1,2,\dots,t$ 参与者的签名分片 $\sigma_1,\sigma_2,\dots,\sigma_t$。
对应的私钥为 $sk_1,\dots,sk_t$ ,记 $F(x)=f_1(x)+,\dots,+f_n(x)$ ,于是满足 $F(i)=sk_i,i=1,\dots,t$ ,根据拉个朗日插值法有 $F(x)=sk_1h_1(x)+,\dots,+sk_th_t(x)$ ,其中 $h_i(x)$ 是插值多项式,这里不再详细展示。
组签名 $$ \begin{aligned} \sigma&=H(m)^{F(0)}\ &=H(m)^{sk_1h_1(0)+,\dots,+sk_th_t(0)}\ &=\sigma_1^{h_1(0)}\sigma_2^{h_2(0)}\dots,\sigma_t^{ht(t)} \end{aligned} $$ 组公钥 $pk=g^{F(0)}=A{10},\dots,*A_{n0}$ 验证 $e(\sigma,g)==e(H(m),pk)$
以上就是组签名的推导过程。下次准备讲一讲快速傅里叶变换(FTT)。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!