[网安实践II] 实验2. 密码学实验

[网安实践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,q3(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} {cx2 (mod p),cx2(mod q),分别求得x(mod p)和x(mod q)的值.
当x是模p/q的二次剩余且 p ≡ 3 ( m o d   4 ) p\equiv 3(mod\ 4) p3(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)2y2p+1y2p1yy (mod p/q), 由二次剩余有 y p − 1 2 ≡ 1 ( m o d   p / q ) y^\frac{p-1}{2}\equiv 1(mod\ p/q) y2p11(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个解, 取其中有含义的一个.

代码

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} {c1m2(mod N1)c2m2(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.inithreads选项来修改线程数. 然后使用控制台打开程序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

求解过程

  1. 计算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×logg1(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

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值