NepCTF2023 Crypto wp


NepCTF2023 Crypto wp

random_RSA

先通过类似boneh and durfee attack获得p,q,d,后面爆破一下p,q的位置,然后随机数预测就行

boneh and durfee attack

二元cop解一下就行

后面常规的随机数预测

enigma

两个enigma其实挺简单的。

crib:

https://www.101computing.net/enigma-crib-analysis/

逐位对齐,然后判断加密结果是不是明文本身。

Rejewski:

就用题目上这个人的攻击思路就ok。

遍历密钥空间,然后判断环是否与给定的加密结果的环相同。

ABCABC

当然这里注意,要判断ABC每个数生成的环的数量,长度相等,可以筛选掉大部分值

recover

这个没注意到P和的线性无关条件,复杂度没降下来,也是稍微改了下原代码就出了

粘一下exp

from Crypto.Util.number import *
from string import ascii_lowercase
from itertools import product
import hashlib
from itertools import product
import hashlib
P = 
M=Matrix(GF(2),64,64)
for i in range(64):
    for p in P[i]:
        M[i,p]=1
mm=#明文二进制列表
cc=#密文二进制列表
P3=M^3
P2=M^2
P1=M^1
P0=identity_matrix(GF(2),64)
t0=vector(GF(2),cc[0])-P3*vector(GF(2),mm[0])
#t1=vector(GF(2),cc[1])-P3*vector(GF(2),mm[1])
# assert t0==t1

Res=[]
for _ in range(0,8):
    PP=P2[_*8:_*8+8,_*8:_*8+8].augment(P1[_*8:_*8+8,_*8:_*8+8], subdivide=True)
    PP=PP.augment(P0[_*8:_*8+8,_*8:_*8+8], subdivide=True)
    PP
    TT=[int(i) for i in t0[_*8:_*8+8]]
    for i in range(0,3*8,8):
        TT.extend([0,1,1])
        for j in range(3):
            tt=Matrix(GF(2),1,24)
            tt[0,i+j]=1
            PP=block_matrix([[PP], [tt]])
    TT=vector(GF(2),TT)
    res=PP.solve_right(TT)
    print(res)
    RR=[]
    Ker=PP.right_kernel()
    r=Ker.dimension()
    print("Kernel dimension=",r)
    for i in range(0,1<<r):
        tmp=res+Ker[i]
        flag=blist2dec(list(tmp.change_ring(ZZ))).decode()
        if all(i in ascii_lowercase+'{}' for i in flag):
            RR.append(flag)
    Res.append(RR)
    
    
#flag{}头尾筛选,这里代码写的烂,不想改了
R1=[]
for index,i in enumerate(Res[:5]):
    temp=[]
    for j in i:
        if index==0 and j[0]=='f':
            temp.append(j)
        if index==1 and j[0]=='l':
            temp.append(j)
        if index==2 and j[0]=='a':
            temp.append(j)
        if index==3 and j[0]=='g':
            temp.append(j)
        if index==4 and j[0]=='{':
            temp.append(j)
    R1.append(temp)
temp=[]
for i in Res[-1]:
    if i[2]=='}':
        temp.append(i)
Res=R1+Res[5:-1]+[temp]

print(Res)

for i in product(*Res):
    flag=[0]*24
    for index,j in enumerate(i):
        flag[index]=ord(j[0])
        flag[index+8]=ord(j[1])
        flag[index+16]=ord(j[2])
    if hashlib.md5(bytes(flag)).hexdigest().startswith('3fe04'):
        print(bytes(flag))
        

SecureAgg

稍微看一下源代码就发现漏洞点吧???

simple_des

没做,看起来恢复一下轮密钥就出了,解的人挺多


random_rsa和enigma需要exp的话,评论区dd我


  目录