2022DASTF十月赛
Crypto
RSA
1 |
|
解m1
要先求出n_1
,n_1
的加密为低指数加密,爆破可以得出n_1
,yafu分解然后解密c_1
。
m2
部分根据代码有公式
$$
\begin{cases}
m_2 = m + t*k\\
c_3 = m^{e_2}\mod n_3
\end{cases}
==>c_3=(m_2-t*k)^{e_2}\mod n_3
$$
于是在模$n_3$的域上构造$f = (m_2-t*k)^{e_2} - c_3$ ,解出$t=0$,即$m_2=m$。
$m_1$,$m_2$解出来的有重叠部分,需去除。
1 |
|
Proof_Yourself
1 |
|
MProof类中的verify()部分
1
2k == enc.decipher(cs[0])
m2 = enc.decipher(cs[i - 1])说明 $k(m_1)$ 与 $c_1(cs[0])$是一组明密文,$m_2$ 与 $c_2(cs[i-1])$是一组明密文。
1
proof.pre_work_verify()
说明$c_4,m_4,r_4$是一组,$c_5,m_2*m_4$是一组。
Proof类中的verify()部分
就是一堆公式然后不断化简。
首先我们要明确verify返回的值必须是True,也就是从最后一个return返回,所以以下两个等式成立
1
2① pow(c1, d, n_2q) * c4 % n_2q == enc.encipher(d * m1 + m4)
② pow(c2, e, n_2q) * gy.invert(b2, n_2q) % n_2q == enc.encipher(0)根据代码有以下公式
$$
\begin{cases}
\quad e = d*m_1+m_4\\
\quad a_1 = r_1^d*r_4 \% n^2\\
\quad b_1 = r_5*r_3^d \% n^2\\
\quad a_2 = r_2^e*b_1^{-1} \% n^2\\
\quad b_2 = c_3^d*c_5 \% n^2\\
\quad r = r_1^d*r_4 \% n^2(在①中)\\
\quad r = r_2^e*b_1^{-1} \% n^2(在②中)
\end{cases}
$$
对①进行化简,有
$$
\begin{align}
c_1^d*c_4 &≡ g^{d*m_1+m_4}*r^n \mod n^2\\
c_1^d*c_4 &≡ g^{d*m_1}*g^{m_4}*r_1^{d*n}*r_4^n \mod n^2\\
c_1^d &≡ g^{d*m_1}*r_1^{d*n} \mod n^2\\
c_1 &≡ g^{m_1}*r_1^n \mod n^2\
\end{align}
$$
因为不可能从这里返回False,所以$c_1,m_1,r_1$是一组。对②进行化简,有
$$
\begin{align}
c_2^e*b_2^{-1}&≡r^n \mod n^2\\
c_2^e*b_2^{-1} &≡ r_2^{e*n}*b_1^{-n} \mod n^2\\
c_2^{e}*b_1^n&≡r_2^{e*n}*b_2 \mod n^2\\
c_2^{e}*r_5^n*r_3^{d*n}&≡r_2^{e*n}*c_3^d*c_5 \mod n^2\\
c_2^e*(g^{m_2*m_4}*r_5^n)*r_3^{d*n} &≡ r_2^{e*n}*c_3^d*c_5*g^{m_2*m_4} \mod n^2\\
c_2^e*r_3^{d*n} &≡ r_2^{e*n}*c_3^d*g^{m_2*m_4} \mod n^2\\
g^{e*m_2}*(c_2^e)*(g^{m_3*d}*r_3^{d*n})&≡(g^{e*m_2}*r_2^{e*n})*(c_3^d)*g^{m_3*d}*g^{m_2*m_4} \mod n^2\\
g^{e*m_2}*(c_2^e)*(g^{m_3}*r_3^n)^d&≡(g^{m_2}*r_2^n)^e*(c_3^d)*g^{m_3*d+m_2*m_4}\mod n^2
\end{align}
$$
因为是Paillier同态加密,要使得②成立,极有可能是$m_2,c_2,r_2$和$m_3,c_3,r_3$分别为一组。故
$$
\begin{align}
g^{e*m_2}&≡g^{m_3*d+m_2*m_4}\mod n^2\\
e*m_2 &≡ m_3*d+m_2*m_4\mod φ(n^2)\\
m_1*m_2&≡m_3\mod φ(n^2)
\end{align}
$$
因为我们要求$c_i(即cs[i])$,所以将上述等式转换为
$$
\begin{align}
m_1*m_2&≡m_3\mod φ(n^2)\\
g^{m_1*m_2} &≡ g^{m_3} \mod n^2\\
c_3 &≡ g^{m_1*m_2}*r_3^n \mod n^2\\
cs_i &≡ g^{m_0*m_{i-1}}*r_i^n \mod n^2 \quad,i∈[1,t-1](转换成跟cs_i对应的下标)
\end{align}
$$
前面的等式①的推导已经得到了$cs_0$的加密公式为
$$
cs_0 ≡ g^{m_0}*r_0^n\mod n^2
$$
然后根据MProof.verify()中的for循环,有
$$
\begin{align}
i=1时,有m_1&=m_0*m_0=k^2\\
i=2时,有m_2&=m_0*m_1=k^3\\…
\end{align}
$$
而$m_0 = k$,故$m_i = k^{(i+1)}$,$i∈[0,t-1]$。故求$cs_i和cs_0$的公式可合并为
$$
cs_i ≡ g^{k^{(i+1)}}*r_i^n \mod n^2 \quad,i∈[0,t-1]
$$
1 |
|
Recover_Secret
1 |
|
类Encryptor是Paillier同态加密,类Commit貌似是Benaloh加密。
重点在X、Y的生成以及shuffle混淆,先看X、Y的生成,他们的生成公式类似,为
$$
xs_i = E(i^0,r_0)^{cr_0}*E(i^1,r_1)^{cr_1}*…*E(i^5,r_5)^{cr_5}\mod n_i^2 \tag{1}
$$
$$
ys_i = E(i^0,r_0)^{s_0}*E(i^1,r_1)^{s_1}*…*E(i^5,r_5)^{s_5}\mod n_i^2 \tag{2}
$$
(这里的$cr$指$cr$中的$r$。)
根据Paillier同态加密的特点,有
$$
D(E(m_1,r_1),E(m_2,r_2)\mod n^2) = m_1+m_2\mod n
$$
$$
D(E(m_1,r_1)^k\mod n^2)=k*m\mod n
$$
于是公式(1)(2)的解密公式为
$$
D(xs_i) = cr_0*i^0+…+cr_5*i^5 \mod n_i
$$
$$
D(ys_i) = s_0*i^0+…+s_5*i^5 \mod n_i
$$
因为$xs,ys$都有6个,而系数已知,所以可以构建矩阵方程解出$cr_i,s_i$。
但是$X,Y$被打乱了顺序。
根据commit()函数,有
$$
c_i = g^{s_i}*h^{cr_i}
$$
进行如下转换
$$
c_0 = g^{s_0}*h^{cr_0},c_1^i = g^{s_1*i}*h^{cr_1*i},c_2^{i^2} = g^{s_2*i^2}*h^{cr_2*i^2},…\
$$
于是有
$$
\begin{align}
c_0*c_1^i*c_2^{i^2}*…*c_5^{i^5}
&= g^{s_0+s_1*i+s_2*i^2+…+s_5*i^5}*h^{cr_0+c_r1*i+cr_2*i^2+…+cr_5*i^5}\\
&=g^{D(ys_i)}*h^{D(xs_i)}\mod q
\end{align}
$$
因此通过此等式可得到正确的$X,Y$。
求出$Y$后,因为有六个未知数和六个方程,所以建个矩阵求解
$$
{\left[
\matrix{
s_0 & s_1 & … & s_5
}
\right]}
*
\left[
\matrix{
1^0 & 2^0 & … & 5^0\\
1^1 & 2^1 & … & 5^1\\
…\\
1^6 & 2^6 & … & 5^6
}
\right]
=\left[
\matrix{
dec\_y_0 & dec\_y_1 & … & dec\_y_5
}
\right]
$$
1 |
|
参考: