第八届强网杯青少年专项赛crypto_wp
Classics 已经给出了加密方法和密文,倒着来就行 AliceAES 简单的aes,给出了key,iv和明文,直接加密 1234567891011121314151617from Crypto.Cipher import AESfrom Crypto.Util.Padding import padfrom Crypto.Util.number import bytes_to_long# 密钥和初始化向量key = b'daa0d6e430afc6af' iv = b'2aa3541f0ef26393'message = 'Hello, Bob!' # 这里特别坑,最前面有个空格# 创建 AES 加密器执行加密cipher = AES.new(key, AES.MODE_CBC, iv)encrypted_data = cipher.encrypt(pad(message.encode(), AES.block_size))#...
d (p) 泄露
前置知识 欧拉降幂 m1≡m≡(cdmod n)mod pm_1 \equiv m \equiv (c^d \mod n) \mod p \\ m1≡m≡(cdmodn)modp 由模运算的性质,大模和小模在一起时,取外面的小模 ∴m1≡cdmod p\therefore m_1 \equiv c^d \mod p ∴m1≡cdmodp 由欧拉定理可知,当c与p互素时, 有 cϕ(p)=cp−1≡1mod pc^{\phi(p)} = c^{p-1} \equiv 1 \mod p cϕ(p)=cp−1≡1modp 令 d=k(p−1)+rd = k(p-1) + rd=k(p−1)+r 则 r=dmod p−1r = d \mod {p-1}r=dmodp−1 (p-1) 是为了使用欧拉定理, 因为 r 没有任何限制, 所以总会存在 r 使得满足d=k(p−1)+rd = k(p-1) +...
共模攻击
共模攻击 条件 模数相同 加密对象相同 每组的 e 互素 nss 源码: 1234567891011121314151617181920212223242526272829from Crypto.Util.number import *flag = b'NSSCTF{******}'p = getPrime(512)q = getPrime(512)n = p*qe1 = getPrime(16)e2 = getPrime(16)m = bytes_to_long(flag)c1 = pow(m, e1, n)c2 = pow(m, e2, n)print(f'n = {n}')print(f'e1 = {e1}')print(f'e2 = {e2}')print(f'c1 = {c1}')print(f'c2 =...
RSA-低加密指数广播攻击
nss 本题为交互题目,nc连接后发现每次交互时需要我们输入1,然后程序会生成一组公钥来加密同一个明文,并且这些公钥中的e都相同, 输入输出形式决定了后续对数据处理的操作 则我们有 ci≡memod nic_i \equiv m^e \mod n_i ci≡memodni 并且我们可以无限次交互获得足够多的数据,那么我们是否能够恢复m呢? 将 m^e 看成一个整体, 那么问题则变成了给定一个数取模不同数的余数,问原数几何? 显然是中国剩余定理 则我们可以通过CRT得到 m^e 的值,再通过开e次方即可得到m的值。 考虑到交互问题,我们需要再kali下使用pwntools这个库 我比较喜欢本地编写代码后直接到kali上运行 exp 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960from Crypto.Util.number import *from gmpy2 import *from...
BaseCTF2024_crypto wp
你会算md5吗 分析 将flag逐字md5加密,得到output 单字符md5,可以理解为单字节加密,没有行列转换混淆的话,一般都可以直接爆破,得到每个原字符 (如果答案不对一般就是字符集的问题,整数32-126就是可见字符范围) exp 123456789101112131415import hashliboutput = ['9d5ed678fe57bcca610140957afab571', '0cc175b9c0f1b6a831c399e269772661', '03c7c0ace395d80182db07ae2c30f034', 'e1671797c52e15f763380b45e841ec32', '0d61f8370cad1d412f80b84d143e1257', 'b9ece18c950afbfa6b0fdbfa4ff731d3', '800618943025315f869e4e1f09471012',...
模二项式
结论 对二项式取模时 c=(a⋅p+b⋅q)emod Nc = (a \cdot p + b \cdot q)^e \mod N c=(a⋅p+b⋅q)emodN 可以转换为 c=(a⋅p)e+(b⋅q)emod Nc = (a \cdot p)^e + (b \cdot q)^e \mod N c=(a⋅p)e+(b⋅q)emodN 思路: 先转换 c1, c2 的二项式 使 c1 , c2 幂数相同 乘个啥玩意儿消去一项 剩下的部分分别模p, 模q, 看包含 N 中的哪个因子 gcd(剩下的部分, N) = 包含的那个因子 证明 例如 c1=(3⋅p+7⋅q)emod Nc2=(2⋅p+5⋅q)emod Nc_1 = (3\cdot p + 7\cdot q)^e \mod N \\ c_2 = (2\cdot p + 5\cdot q)^e \mod N \\ c1=(3⋅p+7⋅q)emodNc2=(2⋅p+5⋅q)emodN 对于 c=(a⋅p+b⋅q)emod Nc = (a\cdot p + b\cdot q) ^ e \mod...
moectf2024 crypto方向wp
Signin 源码: 123456789101112131415161718192021222324252627from Crypto.Util.number import*from secret import flagm = bytes_to_long(flag)p = getPrime(1024)q = getPrime(1024)n = p*qe = 65537c = pow(m,e,n)pq = (p-1)*(q-2)qp = (q-1)*(p-2)p_q = p + qprint(f"{c = }")print(f"{pq = }")print(f"{qp = }")print(f"{n = }")print(f"{p_q = }")'''c =...
光滑攻击
光滑数 前置知识 当一个数的最大素因子组不大于B时,称其为B-光滑数 6 = 2 * 3, 可以称其为 3- 光滑数。 12 = 2^2 * 4, 称其为 4- 光滑数(因为 2^2 是最大的素因子组) 5 = 1 * 5, 称其为 5- 光滑数 简单来讲,就是一堆小素数的乘积 素因子 又称素因数、素因式,指能整除给定正整数的素数, 不包括1。 p-1光滑 源码: 1234567891011121314151617181920212223242526272829303132from Crypto.Util.number import *from random import choiceflag = b'NSSCTF{******}'def getMyPrime(nbits): while True: p = 1 while p.bit_length() <= nbits: p *= choice(sieve_base) ...
连分数展开
连分数展开 连分数 逼近分数 初始条件 我们从分数 en\frac{e}{n}ne 开始。连分数展开的目标是把它写成如下的形式: 其中a0,a1,a2....a_0,a_1,a_2....a0,a1,a2....是一系列的整数 计算逼近分数 固定值: p−1=1,p0=0,q−1=0,q0=1p_{-1} = 1 , p_0 = 0 , q_{-1} = 0 , q_0 = 1p−1=1,p0=0,q−1=0,q0=1 计算公式: pn=an⋅pn−1+pn−2qn=an⋅qn−1+qn−2p_n = a_n \cdot p_{n-1} + p_{n-2} \\ q_n = a_n \cdot q_{n-1} + q_{n-2} pn=an⋅pn−1+pn−2qn=an⋅qn−1+qn−2 exp 1234567891011121314151617181920212223242526272829class ContinuedFraction(): def __init__(self, numerator,...
离散对数
CRYPTOHACK_Adrien’s Signs 加密算法和输出: 1234567891011121314151617181920212223from random import randinta = 288260533169915p = 1007621497415251FLAG = b'crypto{????????????????????}'def encrypt_flag(flag): ciphertext = [] plaintext = ''.join([bin(i)[2:].zfill(8) for i in flag]) for b in plaintext: e = randint(1, p) n = pow(a, e, p) if b == '1': ciphertext.append(n) else: n = -n % p ...