ElGamal
概述
ElGamal算法的安全性是基于求解离散对数问题的困难性,于1984年提出,也是一种双钥密码体制,既可以用于加密又可用于数字签名。
如果我们假设p是至少是160位的十进制素数,并且p-1有大素因子,此外g是 $Z_p^$ 的生成元,并且 $y \in Z_p^$ 。那么如何找到一个唯一的整数x($0\leq x \leq p-2$) ,满足$g^x \equiv y \bmod p$ 在算法上是困难的,这里将x记为$x=log_gy$ 。
基本原理
这里我们假设A要给B发送消息m。
密钥生成
基本步骤如下
选取一个足够大的素数p,以便于在$Z_p$ 上求解离散对数问题是困难的。
选取$Z_p^*$ 的生成元g。
随机选取整数k,$0\leq k \leq p-2$ ,并计算$g^k \equiv y \bmod p$ 。
其中私钥为{k},公钥为{p,g,y} 。
加密
A选取随机数$r \in Z_{p-1}$ ,对明文加密$E_k(m,r)=(y_1,y_2)$ 。其中$y_1 \equiv g^r \bmod p$ ,$y_2 \equiv my^r \bmod p$ 。
解密
$D_k(y_1,y_2)=y_2(y_1^k)^{-1} \bmod p \equiv m(g^k)^r(g^{rk})^{-1} \equiv m \bmod p$ 。
难点
虽然我们知道了y1,但是我们却没有办法知道其对应的r。
2015 MMA CTF Alicegame
这里我们以2015年 MMA-CTF-2015 中的 Alicegame 为例进行介绍。这题最初在没有给出源码的时候却是比较难做,因为这个给一个 m,给一个 r 就得到加密结果,,这太难想。
我们来简单分析一下源码,首先程序最初生成了 pk 与 sk
其中genkey函数如下
p为k位的素数,g为(2,p)范围内的书,x在(1,p-1)范围内。并且计算了$h \equiv g^x \bmod p$ 。看到这里,差不多就知道,这应该是一个数域上的ElGamal加密了。其中pk为公钥,sk为私钥。
接下来 程序输出了10次m和r。并且,利用如下函数加密
其加密方法确实是ElGamal方式的加密。
最后程序对flag进行了加密。此时的r是由程序自己random的。
分析一下,这里我们在十轮循环中可以控制m和r,并且
$c_1 \equiv g^r \bmod p$
$c_2 \equiv m * h^{r} \bmod p$
如果我们设置
r=1,m=1,那么我们就可以获得$c_1=g,c_2=h$ 。
r=1,m=-1,那么我们就可以获得$c_1=g, c_2 = p-h$ 。进而我们就可以得到素数p。
我们得到素数p有什么用呢?p的位数在201位左右,很大啊。
但是啊,它生成素数p之后,没有进行检查啊。我们在之前说过p-1必须有大素因子,如果有小的素因子的话,那我们就可以攻击了。其攻击主要是使用到了baby step-giant step 与 Pohlig-Hellman algorithm 算法,有兴趣的可以看看,这里sage本身自带的计算离散对数的函数已经可以处理这样的情况了,参见discrete_log 。
具体代码如下,需要注意的是,,这个消耗内存比较大,,不要随便拿虚拟机跑。。。还有就是这尼玛交互让我头疼啊,,,
最后迫于计算机内存不够,,没计算出来,,,有时候会崩,多运行几次。。
2018 Code Blue lagalem
题目描述如下
可以看出,该算法就是一个 ElGamal 加密,给了同一个明文两组加密后的结果,其特点在于使用的随机数 r 是通过线性同余生成器生成的,则我们知道
$c2 \equiv m * h^{r} \bmod p$
$c2_ \equiv mh^{(Ar+B) \bmod q} \equiv mh^{Ar+B}\bmod p$
则
$c2^A*h^B/c2_ \equiv m^{A-1}\bmod p$
其中,c2,c2_,A,B,h 均知道。则我们知道
$m^{A-1} \equiv t \bmod p$
我们假设已知 p 的一个原根 g,则我们可以假设
$g^x \equiv t$
$g^y \equiv m$
则
$g^{y(A-1)}\equiv g^x \bmod p$
则
$y(A-1) \equiv x \bmod p-1$
进而我们知道
$y(A-1)-k(p-1)=x$
这里我们知道 A,p,x,则我们可以利用扩展欧几里得定理求得
$s(A-1)+w(p-1)=gcd(A-1,p-1)$
如果gcd(A-1,p-1)=d,则我们直接计算
$t^s \equiv m^{s(A-1)} \equiv m^d \bmod p$
如果 d=1,则直接知道 m。
如果 d 不为1,则就有点麻烦了。。
这里这道题目中恰好 d=1,因此可以很容易进行求解。
flag
参考
https://www.math.auckland.ac.nz/~sgal018/crypto-book/solns.pdf,20.4.1
Last updated