Skip to content

wargames.MYCTF2024

约 346 字大约 1 分钟

crypto

2024-12-29

Rick'S Algorithm

选择明/密文攻击

选择明文,这里需要m为选择结果

m = bytes_to_long(input("Enter message to encrypt: ").encode())
print(f"Encrypted message: {pow(m, e, n)}")

通过如下代码:

from Crypto.Util.number import *
i=0
a=int(input())#底数
while True:
    try:
        print(f'n={a**i},i={i},编码后为|{long_to_bytes(a**i).decode()}|')
    except:
        None
    i+=1
    input()

找到:y,91,Tab键,Q可以分别得到m: 121,14641,9,81,得到n(写远程就不用这样了,当时太菜了😅)

from Crypto.Util.number import *
from gmpy2 import *

neat=[]
for i in [3**2,3**4,11**2,11**4]:
    print(i,long_to_bytes(i).decode())
    ci=input()
    neat.append(int(ci))
n=gcd(neat[0]*neat[0]-neat[1],neat[2]*neat[2]-neat[3])

e = 0x557

c=int(input('输入加密后的flag:'))
def get_M():
    X = getPrime(5)
    Y = (c * (X ** e)) % n
    print(f'Y = {Y}')
    Z = int(input('输入解密后的Y:'))
    d=inverse(X,n)
    M = (Z * d) % n
    print(long_to_bytes(M))
get_M()
#wgmy{ce7a475ff0e122e6ac34c3765449f71d}
from Crypto.Util.number import *
from math import gcd
from pwn import *

remote = remote("127.0.0.1",2703)

data = []
for i in [3**2,3**4,11**2,11**4]:
    exp = long_to_bytes(i).decode()
    remote.sendlineafter(b"Enter option: ", '1'.encode())
    remote.sendlineafter(b"Enter message to encrypt: ", exp.encode())
    data.append(int(remote.recvline().strip().decode().replace('Encrypted message: ', '')))
n=gcd(data[0]*data[0]-data[1],data[2]*data[2]-data[3])

e = 0x557

remote.sendlineafter(b"Enter option: ", '3'.encode())
c = int(remote.recvline().strip().decode().replace('Encrypted flag: ', ''))
X = getPrime(5)
Y = (c * (X ** e)) % n
remote.sendlineafter(b"Enter option: ", '2'.encode())
remote.sendlineafter(b"Enter ciphertext to decrypt: ", str(Y).encode())
Z = int(remote.recvline().strip().decode().replace('Decrypted message: ', ''))

d=inverse(X,n)
M = (Z * d) % n
print(long_to_bytes(M))