[网安实践II] 实验2. 密码学实验
- 工具: hashcat, SageMath
1. SHA1破译
- 注: 使用hashcat破解具有不确定性, 两题可能需要较长的时间才能成功解密
1.1
题干:
破译如下8位小写字母加数字的口令(SHA1(passwd))
bdba993c7b4b1f5f407f9e24483a407ed85cbc3a
使用指令:
./hashcat64.exe -m 100 bdba993c7b4b1f5f407f9e24483a407ed85cbc3a -a 3 ?h?h?h?h?h?h?h?h --force
## -m表示密码选项,100为SHA1 -a表示攻击模式,3为暴力破解,?h表示小写字母和数字,8个?h为口令模式
运行输出:
题解:qsqq1wz9
1.2
题干
破译如下,6位小写字母加数字的口令+3位数字salt(SHA1(passwd+salt))
259e5b4e950426bced362febc991805f2d841523
使用指令
./hashcat64.exe -m 100 259e5b4e950426bced362febc991805f2d841523 -a 3 ?h?h?h?h?h?h?d?d?d --force
题解
fvz8zy330
2. Rabin暴力
- Rabin密码体制: 设 n = p q n=pq n=pq,其中 p p p和 q q q是素数,且 p , q ≡ 3 ( m o d 4 ) , p ≠ q p,q\equiv 3(mod\ 4), p\not=q p,q≡3(mod 4),p=q,设 P = C = Z n ⋆ P=C=Z^⋆_n P=C=Zn⋆,且定义 K = { ( n , p , q ) } K=\{(n,p,q)\} K={(n,p,q)}, 对 k = ( n , p , q ) k=(n, p,q) k=(n,p,q)定义 e k ( x ) = x 2 ( m o d n ) e_k(x)=x^2(mod\ n) ek(x)=x2(mod n) 和 d k = y ( m o d n ) d_k=\sqrt y\ (mod\ n) dk=y (mod n). 其中, n n n为公钥, p p p和 q q q为私钥.
题干
若Rabin加密的模为N=2366232284015146849567653630179316337954424149957532872696957
,密文为C=2201511869153782262472575998400169193386320547565331752410091
, 试解密出明文.
思路
N较小的时候可以通过分解N=pq, 变成模素数的同余式组
{
c
≡
x
2
(
m
o
d
p
)
,
c
≡
x
2
(
m
o
d
q
)
\begin{cases}c\equiv x^2\ (mod\ p),\\ c\equiv x^2 (mod\ q)\end{cases}
{c≡x2 (mod p),c≡x2(mod q),分别求得x(mod p)和x(mod q)的值.
当x是模p/q的二次剩余且
p
≡
3
(
m
o
d
4
)
p\equiv 3(mod\ 4)
p≡3(mod 4)时, 有
(
±
y
p
+
1
4
)
2
≡
y
p
+
1
2
≡
y
p
−
1
2
y
≡
y
(
m
o
d
p
/
q
)
(\pm y^\frac{p+1}{4})^2\equiv y^\frac{p+1}{2}\equiv y^\frac{p-1}{2}y\equiv y\ (mod\ p/q)
(±y4p+1)2≡y2p+1≡y2p−1y≡y (mod p/q), 由二次剩余有
y
p
−
1
2
≡
1
(
m
o
d
p
/
q
)
y^\frac{p-1}{2}\equiv 1(mod\ p/q)
y2p−1≡1(mod p/q). 因此, y模p或q的两个平方根为
±
y
p
+
1
4
(
m
o
d
p
/
q
)
\pm y^\frac{p+1}{4}(mod\ p/q)
±y4p+1(mod p/q)
再用中国剩余定理得到x(mod N), 共有4个解, 取其中有含义的一个.
- 参考: Rabin密码体制和语义安全性
代码
N = 2366232284015146849567653630179316337954424149957532872696957
C = 2201511869153782262472575998400169193386320547565331752410091
p, q = prime_divisors(N) # 分解N得到因数p,q
if legendre_symbol(C,p) ==1 and legendre_symbol(C,q) == 1 and C % 4 ==3:
x1 = power_mod(C, (p + 1)//4, p) # C^(p+1//4) (mod p)的正根
x2 = p - x1 # 负根
x3 = power_mod(C, (q + 1)//4, q)
x4 = q - x3
# 中国剩余定理
print(CRT(x1 ,x3, p, q))
print(CRT(x1, x4, p, q))
print(CRT(x2, x3, p, q))
print(CRT(x2, x4, p, q))
运行输出
题解
1111111111111111111122222222222222222222
3. Rabin误用
题干
A利用Rabin加密,将明文m同时向两个人加密发送,已知N1=121028590369755784739110550699305598499609862755803939162324470112632116830848070452567682577092156035673157938109144584692626381544335983440381785961
, C1=78496919434910677387779975822700104965437164122745273424790552462260853325528024262924662934465932682672971426938888247361408697646908281977551821059
, N2=12759131933205116377405981097827069263819153794779240501221023570979700501187300338412516869108097329524926001140008565784935251215375305274181234160090023961
, C2=4263038225336941948066565627557476097176286456850657462432536533051891228040904417243178649321357621222457951953853009181274195003060942076837203983376005537
.
试解密出明文m.
思路
同一个明文发送给不同的人 { c 1 ≡ m 2 ( 𝑚 𝑜 𝑑 N 1 ) c 2 ≡ m 2 ( m o d N 2 ) \begin{cases} c_1\equiv m^2(𝑚𝑜𝑑\ N_1)\\c_2\equiv m^2(mod\ N_2)\end{cases} {c1≡m2(mod N1)c2≡m2(mod N2), 可利用中国剩余定理直接求出 m 2 m^2 m2, 再开平方即可获取明文.
代码
N1 = 121028590369755784739110550699305598499609862755803939162324470112632116830848070452567682577092156035673157938109144584692626381544335983440381785961
C1 = 78496919434910677387779975822700104965437164122745273424790552462260853325528024262924662934465932682672971426938888247361408697646908281977551821059
N2 = 12759131933205116377405981097827069263819153794779240501221023570979700501187300338412516869108097329524926001140008565784935251215375305274181234160090023961
C2 = 4263038225336941948066565627557476097176286456850657462432536533051891228040904417243178649321357621222457951953853009181274195003060942076837203983376005537
print(sqrt(CRT(C1, C2, N1, N2)))
运行输出/题解
123456789123456789123456789123456789000000000111111111222222222333333333444444444555555555666666666777777777888888888999999999
4. DH密钥交换
- DH算法:
*
公开: p, q, X, Y 保密: x, y, k 双方共享密钥: g x y ( m o d p ) g^{xy}(mod\ p) gxy(mod p)
题干
已知攻击者窃听到一个DH密钥交换协议中的参数如下:
p=32981287412437309453348598344324631
, g=11
g
x
(
m
o
d
p
)
=
39887537110
,
g
y
(
m
o
d
p
)
=
19544783592271451593898938692622821
g^x(mod\ p)=39887537110, g^y(mod\ p)= 19544783592271451593898938692622821
gx(mod p)=39887537110,gy(mod p)=19544783592271451593898938692622821,
试求出两个通信者之间协商的密钥
g
x
y
(
m
o
d
p
)
g^{xy} (mod\ p)
gxy(mod p).
思路
g x y ≡ ( g x ) y ( m o d p ) g^{xy}\equiv (g^x)^y (mod\ p) gxy≡(gx)y(mod p), 只需知道x或y的值即可求得共享密钥. 以求x为例, x即为39887537110以g为底的离散对数.
代码
p = 32981287412437309453348598344324631
g = 11
gx_modp = 39887537110
gy_modp = 19544783592271451593898938692622821
K = GF(p) # 定义K为元素个数为 p 的有限域
g_exp_x = K(gx_modp) # 有限域K中的 g^x
x = g_exp_x.log(g) # x 是以 g为底, g^x 的离散对数
g_exp_y = K(gy_modp) # 有限域K中的 g^y
g_exp_xy = pow(g_exp_y, x)
print(g_exp_xy)
运行输出/题解
12345678987654321
5. 分解大整数
题干
试利用cado分解大整数:
38301809830494750383980450939724290334140596797057281274787569248823570924531107
,求出其最小的素因子.
思路
- 工具: yafu yafu1.34下载链接
此处使用专门用于分解大整数的工具"yafu"来分解题目中大整数. 下载后可在配置文件yafu.ini
中threads
选项来修改线程数. 然后使用控制台打开程序yafu-x64.exe
, 输入以下指令进行大整数分解:
factor(38301809830494750383980450939724290334140596797057281274787569248823570924531107)
8线程情况下可以很快得到结果.
- 注: 此处也可使用cado进行大整数分解, cado安装见#6, 使用以下指令即可进行整数分解
./cado-nfs.py 38301809830494750383980450939724290334140596797057281274787569248823570924531107
运行输出
yafu运行输出:
cado运行输出:
SageMath结果验证:
题解
3894598248523498759843759843759874385907
求离散对数
题干
已知: p=223456789012345678301234567890123456789012345678901234568071
, g=3848943759843751
,
试求最小的正整数x,满足
g
x
=
96923627534022705088072561757348500176924595917500139436572
(
m
o
d
p
)
g^x=96923627534022705088072561757348500176924595917500139436572(mod\ p)
gx=96923627534022705088072561757348500176924595917500139436572(mod p)
工具使用
- 工具: cado-nfs cado-nfs主页
此处使用专门用于离散对数分解的工具cado, 需要在Linux系统中安装运行.
使用git命令下载库:
git clone https://gitlab.inria.fr/cado-nfs/cado-nfs.git
安装
make
求解过程
- 计算log(h)
p=223456789012345678301234567890123456789012345678901234568071
ell=p-1=2*5*22345678901234567830123456789012345678901234567890123456807
g=3848943759843751
g^x=96923627534022705088072561757348500176924595917500139436572(mod p)
注意: 这个时候的基不是我们所选的g, 是算法运算过程中的另外一个基
执行命令:
./cado-nfs.py -dlp -ell 22345678901234567830123456789012345678901234567890123456807 target=96923627534022705088072561757348500176924595917500139436572 223456789012345678301234567890123456789012345678901234568071
运行结果:
即: log(h) = 4368386482704819471650061017590540457423952850991217799177(mod ell)
2. 计算log(g)
根据提示, 执行命令:
./cado-nfs.py /tmp/cado.8qsj90m5/p60.parameters_snapshot.0 target=3848943759843751
运行结果:
即: log(g)=15663092916285883940906699752303506170066158627760298403785(mod ell)
3. 计算
x
=
l
o
g
g
h
x=log_gh
x=loggh
使用换底公式
l
o
g
h
×
l
o
g
g
−
1
(
m
o
d
e
l
l
)
logh\times logg^{-1}(mod\ ell)
logh×logg−1(mod ell)计算, 并验算
p = 223456789012345678301234567890123456789012345678901234568071
R = GF(p)
g = R(3848943759843751)
gx = R(96923627534022705088072561757348500176924595917500139436572)
ell = 22345678901234567830123456789012345678901234567890123456807
log_h = 4368386482704819471650061017590540457423952850991217799177
log_g = 15663092916285883940906699752303506170066158627760298403785
temp = log_h * inverse_mod(log_g, ell) % ell
print(temp)
print(g^temp)
print(gx)
运行结果:
得到: x=123456789123456789
题解
123456789123456789