BUUCTF 每日打卡 2021-8-25

引言

前几天打了祥云杯,四道Crypto成绩还行,解了三道,最后一道懒得解了。线下应该稳了,但是和数学建模国赛冲突了去不了(
昨天把buu第四页刷完了

[NCTF2019]Reverse

加密代码如下:

import os
import pyDes


flag = "NCTF{******************************************}"
key = os.urandom(8)

d = pyDes.des(key)
cipher = d.encrypt(flag.encode())

with open('cipher', 'wb') as f:
    f.write(cipher)

# Leak: d.Kn[10] == [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]

考察des加密算法
加密代码给出了第十个子密钥
根据加密算法,原64位密钥要经过置换得到56位密钥,再经过置换得到48位密钥,然后分段位移,得到16个子密钥
已知其中一个子密钥,要还原第二轮置换前的密钥,总共有 2 8 2^8 28种情况,而继续还原原密钥,总共有 2 16 2^{16} 216种情况,还可以接受
给出两种解法:一、还原原密钥;二、还原全部子密钥
解法一代码如下:

import pyDes
from Crypto.Util.number import *
from tqdm import tqdm

pc1 = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63,
       55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]
pc2 = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55,
       30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]
step = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
key10 = [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0,
         0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]


def reverse_k(key):
    temp = ['' for _ in range(len(pc1))]
    for i in range(len(pc1)):
        temp[pc1[i] - 1] = key[i]
    return temp


def reverse_cd(key):
    temp = ['' for _ in range(len(pc1))]
    pcd = []  # possible c,d
    for i in range(len(pc2)):
        temp[pc2[i] - 1] = key[i]
    for i in range(2 ** 8):
        t = temp.copy()
        s = bin(i)[2:].zfill(8)
        count = 0
        for k in range(len(t)):
            if t[k] == '':
                t[k] = int(s[count])
                count += 1
        pcd.append((t[:28], t[28:]))
    return pcd


def re_move(s, r):
    t = s[-r:] + s[:-r]
    return t


def re_key(k0):
    temp = ['' for _ in range(64)]
    pk = []  # possible key
    for i in range(len(pc1)):
        temp[pc1[i] - 1] = k0[i]
    for i in range(2 ** 8):
        t = temp.copy()
        s = bin(i)[2:].zfill(8)
        count = 0
        for k in range(len(t)):
            if t[k] == '':
                t[k] = int(s[count])
                count += 1
        pk.append(t)
    return pk


possible_cd = reverse_cd(key10)
for r in range(10, -1, -1):
    for i in range(len(possible_cd)):
        possible_cd[i] = (re_move(possible_cd[i][0], step[r]), re_move(possible_cd[i][1], step[r]))

possible_k = []
for i in range(len(possible_cd)):
    possible_k.append(possible_cd[i][0] + possible_cd[i][1])

possible_k0 = []
for i in range(len(possible_k)):
    tempk = re_key(possible_k[i])
    for k0 in tempk:
        possible_k0.append(k0)

with open("attachment\\cipher", "rb") as f:
    c = f.read()

set_m = set()
for i in tqdm(range(len(possible_k0))):
    key = long_to_bytes(int("".join([str(_) for _ in possible_k0[i]]), 2))
    d = pyDes.des(key)
    m = d.decrypt(c)
    set_m.add(m)
print(set_m)

跑了几分钟,得到结果:
在这里插入图片描述
第二种解法代码如下:

import pyDes

key = '********'
d = pyDes.des(key)

pc1 = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63,
       55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]
pc2 = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55,
       30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]
step = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
key10 = [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0,
         0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]

def reverse_k(key):
    temp = ['' for _ in range(len(pc1))]
    for i in range(len(pc1)):
        temp[pc1[i]-1] = key[i]
    return temp

def reverse_cd(key):
    temp = ['' for _ in range(len(pc1))]
    pcd = [] # possible c,d
    for i in range(len(pc2)):
        temp[pc2[i]-1] = key[i]
    for i in range(2**8):
        t = temp.copy()
        s = bin(i)[2:].zfill(8)
        count = 0
        for k in range(len(t)):
            if t[k] == '':
                t[k] = int(s[count])
                count += 1
        pcd.append((t[:28], t[28:]))
    return pcd

def re_move(s, r):
    t = s[-r:] + s[:-r]
    return t

def get_key(k0):
    list_key = []
    c = k0[:28]
    d = k0[28:]
    for i in range(len(step)):
        c = c[step[i]:] + c[:step[i]]
        d = d[step[i]:] + d[:step[i]]
        tempk = c+d
        temp = ['' for _ in range(len(pc2))]
        for j in range(len(pc2)):
            temp[j] = tempk[pc2[j]-1]
        list_key.append(temp)
    return list_key

possible_cd = reverse_cd(key10)
for r in range(10, -1, -1):
    for i in range(len(possible_cd)):
        possible_cd[i] = (re_move(possible_cd[i][0], step[r]), re_move(possible_cd[i][1], step[r]))

possible_k = []
for i in range(len(possible_cd)):
    possible_k.append(possible_cd[i][0] + possible_cd[i][1])

with open("attachment\\cipher", "rb") as f:
    c = f.read()

for i in range(len(possible_k)):
    list_key = get_key(possible_k[i])
    d.Kn = list_key
    m = str(d.decrypt(c))
    if m.startswith('b\'NCTF'):
        print(m)

参考了大佬的解法,其中key只要是八位字符就行
得到结果:
在这里插入图片描述

[祥云杯 2021]Random_RSA

一道送分题
加密代码如下:

from Crypto.Util.number import *
import random

flag=r'flag{}'

p=getPrime(512)
q=getPrime(512)
e=0x10001
n=p*q
ct=pow(flag,e,n)
print("n="+ n)
print("ct="+ ct)

dp=r''
seeds = []
for i in range(0,len(dp)):
    seeds.append(random.randint(0,10000))

res = [] 
for i in range(0, len(dp)):
    random.seed(seeds[i])
    rands = []
    for j in range(0,4):
        rands.append(random.randint(0,255))

    res.append(ord(dp[i]) ^ rands[i%4])
    del rands[i%4]
    print(str(rands))

print(res) 
print(seeds)

# n=81196282992606113591233615204680597645208562279327854026981376917977843644855180528227037752692498558370026353244981467900057157997462760732019372185955846507977456657760125682125104309241802108853618468491463326268016450119817181368743376919334016359137566652069490881871670703767378496685419790016705210391
# ct=61505256223993349534474550877787675500827332878941621261477860880689799960938202020614342208518869582019307850789493701589309453566095881294166336673487909221860641809622524813959284722285069755310890972255545436989082654705098907006694780949725756312169019688455553997031840488852954588581160550377081811151

# [58, 53, 122] [145, 124, 244] [5, 19, 192] [255, 23, 64] [57, 113, 194] [246, 205, 162] [112, 87, 95] [215, 147, 105] [16, 131, 38] [234, 36, 46] [68, 61, 146] [148, 61, 9] [139, 77, 32] [96, 56, 160] [121, 76, 17] [114, 246, 92] [178, 206, 60] [168, 147, 26] [168, 41, 68] [24, 93, 84] [175, 43, 88] [147, 97, 153] [42, 94, 45] [150, 103, 127] [68, 163, 62] [165, 37, 89] [219, 248, 59] [241, 182, 8] [140, 211, 146] [88, 226, 2] [48, 150, 56] [87, 109, 255] [227, 216, 65] [23, 190, 10] [5, 25, 64] [6, 12, 124] [53, 113, 124] [255, 192, 158] [61, 239, 5] [62, 108, 86] [123, 44, 64] [195, 192, 30] [30, 82, 95] [56, 178, 165] [68, 77, 239] [106, 247, 226] [17, 46, 114] [91, 71, 156] [157, 43, 182] [146, 6, 42] [148, 143, 161] [108, 33, 139] [139, 169, 157] [71, 140, 25] [28, 153, 26] [241, 221, 235] [28, 131, 141] [159, 111, 184] [47, 206, 11] [220, 152, 157] [41, 213, 97] [4, 220, 10] [77, 13, 248] [94, 140, 110] [25, 250, 226] [218, 102, 109] [189, 238, 66] [91, 18, 131] [23, 239, 190] [159, 33, 72] [183, 78, 208] [209, 213, 101] [111, 50, 220] [166, 104, 233] [170, 144, 10] [187, 87, 175] [195, 59, 104] [165, 179, 179] [99, 247, 153] [195, 61, 100] [223, 159, 165] [230, 93, 184] [87, 28, 35] [35, 122, 38] [158, 188, 163] [229, 192, 222] [12, 12, 192] [207, 95, 224] [127, 113, 137] [22, 114, 143] [13, 45, 144] [70, 140, 211] [57, 101, 42] [132, 62, 129] [40, 128, 124] [1, 132, 161] [164, 33, 133] [252, 201, 32] [8, 18, 247] [1, 88, 55] [201, 135, 186] [101, 254, 125] [236, 196, 39] [148, 24, 103] [101, 29, 253] [97, 156, 64] [90, 103, 91] [50, 48, 80] [206, 22, 93] [11, 114, 174] [61, 132, 247] [215, 32, 232] [95, 128, 90] [57, 35, 228] [163, 143, 107] [178, 250, 28] [64, 107, 225] [106, 115, 207] [85, 134, 21] [118, 201, 76] [234, 34, 22] [241, 236, 122] [111, 185, 127] [1, 26, 164] [254, 57, 117] [243, 27, 32] [161, 88, 80] [50, 165, 93] [87, 182, 216] [184, 159, 63] [167, 166, 123] [37, 78, 33] [186, 81, 58] [48, 3, 239] [70, 186, 13] [56, 108, 178] [54, 55, 235] [105, 180, 105] [16, 194, 98] [136, 11, 41] [18, 203, 79] [185, 114, 170] [148, 181, 223] [118, 57, 160] [23, 250, 181] [235, 219, 228] [44, 151, 38] [185, 224, 134] [42, 162, 122] [3, 9, 158] [129, 245, 2] [66, 241, 92] [80, 124, 36]
# [55, 5, 183, 192, 103, 32, 211, 116, 102, 120, 118, 54, 120, 145, 185, 254, 77, 144, 70, 54, 193, 73, 64, 0, 79, 244, 190, 23, 215, 187, 53, 176, 27, 138, 42, 89, 158, 254, 159, 133, 78, 11, 155, 163, 145, 248, 14, 179, 23, 226, 220, 201, 5, 71, 241, 195, 75, 191, 237, 108, 141, 141, 185, 76, 7, 113, 191, 48, 135, 139, 100, 83, 212, 242, 21, 143, 255, 164, 146, 119, 173, 255, 140, 193, 173, 2, 224, 205, 68, 10, 77, 180, 24, 23, 196, 205, 108, 28, 243, 80, 140, 4, 98, 76, 217, 70, 208, 202, 78, 177, 124, 10, 168, 165, 223, 105, 157, 152, 48, 152, 51, 133, 190, 202, 136, 204, 44, 33, 58, 4, 196, 219, 71, 150, 68, 162, 175, 218, 173, 19, 201, 100, 100, 85, 201, 24, 59, 186, 46, 130, 147, 219, 22, 81]
# [4827, 9522, 552, 880, 7467, 7742, 9425, 4803, 6146, 4366, 1126, 4707, 1138, 2367, 1081, 5577, 4592, 5897, 4565, 2012, 2700, 1331, 9638, 7741, 50, 824, 8321, 7411, 6145, 1271, 7637, 5481, 8474, 2085, 2421, 590, 7733, 9427, 3278, 5361, 1284, 2280, 7001, 8573, 5494, 7431, 2765, 827, 102, 1419, 6528, 735, 5653, 109, 4158, 5877, 5975, 1527, 3027, 9776, 5263, 5211, 1293, 5976, 7759, 3268, 1893, 6546, 4684, 419, 8334, 7621, 1649, 6840, 2975, 8605, 5714, 2709, 1109, 358, 2858, 6868, 2442, 8431, 8316, 5446, 9356, 2817, 2941, 3177, 7388, 4149, 4634, 4316, 5377, 4327, 1774, 6613, 5728, 1751, 8478, 3132, 4680, 3308, 9769, 8341, 1627, 3501, 1046, 2609, 7190, 5706, 3627, 8867, 2458, 607, 642, 5436, 6355, 6326, 1481, 9887, 205, 5511, 537, 8576, 6376, 3619, 6609, 8473, 2139, 3889, 1309, 9878, 2182, 8572, 9275, 5235, 6989, 6592, 4618, 7883, 5702, 3999, 925, 2419, 7838, 3073, 488, 21, 3280, 9915, 3672, 579]

由于如果random.seed是一定的,那么生成的随机数就是一定的,题目给出了seed,就可以还原dp,进而进行RSA解密
获取dp不能在python3下运行,需要在python2下得到随机数
代码如下:

# python2
import random

seeds = [4827, 9522, 552, 880, 7467, 7742, 9425, 4803, 6146, 4366, 1126, 4707, 1138, 2367, 1081, 5577, 4592, 5897, 4565, 2012, 2700, 1331, 9638, 7741, 50, 824, 8321, 7411, 6145, 1271, 7637, 5481, 8474, 2085, 2421, 590, 7733, 9427, 3278, 5361, 1284, 2280, 7001, 8573, 5494, 7431, 2765, 827, 102, 1419, 6528, 735, 5653, 109, 4158, 5877, 5975, 1527, 3027, 9776, 5263, 5211, 1293, 5976, 7759, 3268, 1893, 6546, 4684, 419, 8334, 7621, 1649, 6840, 2975, 8605, 5714, 2709, 1109, 358, 2858, 6868, 2442, 8431, 8316, 5446, 9356, 2817, 2941, 3177, 7388, 4149, 4634, 4316, 5377, 4327, 1774, 6613, 5728, 1751, 8478, 3132, 4680, 3308, 9769, 8341, 1627, 3501, 1046, 2609, 7190, 5706, 3627, 8867, 2458, 607, 642, 5436, 6355, 6326, 1481, 9887, 205, 5511, 537, 8576, 6376, 3619, 6609, 8473, 2139, 3889, 1309, 9878, 2182, 8572, 9275, 5235, 6989, 6592, 4618, 7883, 5702, 3999, 925, 2419, 7838, 3073, 488, 21, 3280, 9915, 3672, 579]
res = [55, 5, 183, 192, 103, 32, 211, 116, 102, 120, 118, 54, 120, 145, 185, 254, 77, 144, 70, 54, 193, 73, 64, 0, 79, 244, 190, 23, 215, 187, 53, 176, 27, 138, 42, 89, 158, 254, 159, 133, 78, 11, 155, 163, 145, 248, 14, 179, 23, 226, 220, 201, 5, 71, 241, 195, 75, 191, 237, 108, 141, 141, 185, 76, 7, 113, 191, 48, 135, 139, 100, 83, 212, 242, 21, 143, 255, 164, 146, 119, 173, 255, 140, 193, 173, 2, 224, 205, 68, 10, 77, 180, 24, 23, 196, 205, 108, 28, 243, 80, 140, 4, 98, 76, 217, 70, 208, 202, 78, 177, 124, 10, 168, 165, 223, 105, 157, 152, 48, 152, 51, 133, 190, 202, 136, 204, 44, 33, 58, 4, 196, 219, 71, 150, 68, 162, 175, 218, 173, 19, 201, 100, 100, 85, 201, 24, 59, 186, 46, 130, 147, 219, 22, 81]


def get_rnd(seed, i):
    random.seed(seed)
    for j in range(i%4+1):
        t=0
        t = random.randint(0,255)
    return t

dp_list = []
for i in range(0, len(res)):
    r = get_rnd(seeds[i], i)
    dp_list.append(chr(r ^ res[i]))
dp = ''.join(dp_list)
print(dp)

得到dp后,解密代码如下:

from Crypto.Util.number import *

dp = 5372007426161196154405640504110736659190183194052966723076041266610893158678092845450232508793279585163304918807656946147575280063208168816457346755227057
n = 81196282992606113591233615204680597645208562279327854026981376917977843644855180528227037752692498558370026353244981467900057157997462760732019372185955846507977456657760125682125104309241802108853618468491463326268016450119817181368743376919334016359137566652069490881871670703767378496685419790016705210391
c = 61505256223993349534474550877787675500827332878941621261477860880689799960938202020614342208518869582019307850789493701589309453566095881294166336673487909221860641809622524813959284722285069755310890972255545436989082654705098907006694780949725756312169019688455553997031840488852954588581160550377081811151
e = 0x10001

for k in range(1, e):
    p = (e*dp-1) // k +1
    q = n // p
    if (n - p*q) == 0:
        break
print(p, q)
phi = (p-1) * (q-1)
d = inverse(e, phi)
print(d)
m = pow(c, d, n)
print(long_to_bytes(m))

结果为:
在这里插入图片描述

参考我2021-4-5的博客

[祥云杯 2021]myRSA

加密代码如下:

# myRSA
from Crypto.Util.number import getPrime,bytes_to_long as b2l
from math import gcd
import hashlib
import random
import socketserver


KEYSIZE = 512
alpha = 2.0314159265358979
WELCOME = 'Welcome to use my better RSA!!!!!!So, what do you want now?'
menu = '1. encry \n2. getflag\n3. exit'
String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz'

def proof_of_work():
    STR = ''.join([String[random.randint(0,len(String)-1)] for _ in range(16) ])
    HASH = hashlib.sha256(STR.encode()).hexdigest()
    return STR[:4],STR[4:],HASH

def key_gen():
    while True:
        p,q = getPrime(KEYSIZE),getPrime(KEYSIZE)
        e = 0x10001
        if gcd(e,(p-1)*(q-1)):
            break
    key = [getPrime(int(KEYSIZE*alpha)) for _ in range(128)]
    return (p,q,e),key

# encrypto
def encry(message,key,p,q,e):
    k1,k2 = key[random.randint(0,127)],key[random.randint(0,127)]
    x = p**2 * (p + 3*q - 1 ) + q**2 * (q + 3*p - 1) 
    y = 2*p*q + p + q
    z = k1 + k2 
    c = pow(b2l(message),e,p*q)
    return x * c + y * c + z


# get flag
def getflag(flag,key,p,q,e):
    return encry(flag,key,p,q,e)



class server(socketserver.BaseRequestHandler):
    def _recv(self):
        data = self.request.recv(1024)
        return data.strip()

    def _send(self, msg, newline=True):
        if isinstance(msg , bytes):
            msg += b'\n'
        else:
            msg += '\n'
            msg = msg.encode()
        self.request.sendall(msg)

    def handle(self):
        START,END,HASH = proof_of_work()
        self._send('SHA-256(?+{}) == {}'.format(END,HASH))
        RCV = self._recv().decode()
        if RCV != START:
            return
        self._send("I'm a CryptoRookie,so my Crypto system take time, please wait a minute XD!")
        (p,q,e),key = key_gen()
        flag  = open('flag','rb').read()
        self._send(WELCOME)
        self._send('This is my public key:\nn = {}\ne = {}'.format(str(p*q),str(e)))
        for _ in range(16):
            self._send(menu)
            COI = int(self._recv().decode())
            if COI == 1 :
                self._send('Give me your message')
                message = self._recv()
                self._send('Your encry message:')
                self._send(str(encry(message,key,p,q,e)))
            elif COI == 2:
                self._send('This is your favourite:\n')
                self._send(str(encry(flag,key,p,q,e)))
            elif COI == 3:
                self._send('Bye~')
                break
class ForkedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

if __name__ == "__main__":
    HOST, PORT = '0.0.0.0', 10001
    server = ForkedServer((HOST, PORT), server)
    server.allow_reuse_address = True
    server.serve_forever()

可以发现encry函数返回x * c + y * c + z

因为
{ x = p 2 ( p + 3 ∗ q − 1 ) + q 2 ( q + 3 p − 1 ) y = 2 p q + p + q \begin{cases} x = p^2(p + 3*q - 1 ) + q^2 (q + 3p - 1) \\ y = 2pq + p + q \end{cases} {x=p2(p+3q1)+q2(q+3p1)y=2pq+p+q
所以
x + y = ( p + q ) 3 − ( p + q ) 2 + ( p + q ) + 4 p q x+y = (p+q)^3-(p+q)^2+(p+q)+4pq x+y=(p+q)3(p+q)2+(p+q)+4pq
就是这个z比较烦人
c1 = x * c + y * c + z,若 c > z c>z c>zz//c=0,而c = pow(b2l(message),e,p*q),z的位数大约为1040为,所以是有可能的
c是可以由已知量和输入得到,就可以得到 c 1 / / c = x + y c1//c=x+y c1//c=x+y,又因为 n = p q n=pq n=pq也是已知的,就可以求出p+q
再利用韦达定理,就可以求出p,q
再得到flag的密文记为cipher,显然 x + y > > z x+y>>z x+y>>z,那么 p o w ( b 2 l ( m e s s a g e ) , e , p ∗ q ) = c i p h e r / / ( c 1 / / c ) pow(b2l(message),e,p*q) = cipher //(c1 // c) pow(b2l(message),e,pq)=cipher//(c1//c),由此可以得到flag
代码如下:

import gmpy2
from Crypto.Util.number import *


def solve(b, c):
    delta = gmpy2.iroot(b ** 2 - 4 * c, 2)[0]
    x1 = (-b + delta) // 2
    x2 = (-b - delta) // 2
    return x1, x2


e = 0x10001
n = 86044172594296565005981490357031086393690968005717632558751820099266937712955656104764926148481742006814962008762565224013526727309394165049475391585813691086579318605817150928507356174171863027444609318587174581013257750758489276548382035440033867862584622073414783381728905481406505090538751241875220689543
m = bytes_to_long(b'flag')
c = pow(m, e, n)
# 服务器加密m
c1 = 482672726015229754915613036806716006076642260129806635426051524951305867403098580641236640277874159777058099444654055464682516150229162002580225554124623154306333139528965987023733377568121925639298787524910202698375293647228038401637348840043300494612114592994114826846739418997534533266331053666232463887440882491050228960132919214838580098869414772269859290768664948574038255885199219322038159396613616792996658615404594703509580827327579118956206202918820143950201813032830136816874334265604159328208874650020018339277387996526090453931201217912035821585104208872100366351457196945495377972961425718858461639374372565538834935914141053333815027571751320345461118171096718260678550575667212452943175306977804907151101578730633736097022968611313440971322150852546509142
t = c1 // c - 4 * n
p_q = gmpy2.iroot(t, 3)[0] + 1
p, q = solve(-p_q, n)
d = inverse(e, (p - 1) * (q - 1))
cipher = 242375233721390544711797814056502142588368542125659392493076590269657007395395554615957947047825288839483362496870772277193776263920982806679981868959587379801661146376355877158142671836120781421583090179828808042399544419205956541782691010485212097165346766679928630729724748740459180468956511120462113455891269884329987792572284845519171629437839833233846524162206826676024390947348628420525643731556530458081311951948001405107771837695546091307301739536425644118583018515406239381640342378708089806543279149881425724091698626996019241120891164181419471342534419375868850422083269945235426471044992783910251881811088273191796277258001830959818754668160281867546144177420152891767537956150711291265433465453821155355180602795944827685791804446625750789925002808065454142
cipher //= (c1 // c)
flag = long_to_bytes(pow(cipher, d, n))
print(flag)

结果为:
在这里插入图片描述

[祥云杯 2021]Guess

加密代码如下:

from Crypto.Util.number import (
    bytes_to_long,
    getPrime,
    long_to_bytes,
    getRandomNBitInteger,
)
import random
import hashlib
from math import gcd
import socketserver


KEYSIZE = 512
WELCOME = "welcome to my funny challenge !!! Can you guess right 32 times in a row? "
String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz"

def exgcd(a, b):
    if b == 0:
        return 1, 0, a
    else:
        x, y, q = exgcd(b, a % b)
        x, y = y, (x - (a // b) * y)
        return x, y, q


def invert(a,p):
    x, y, q = exgcd(a,p)
    if q != 1:
        raise Exception("No solution.")
    else:
        return (x + p) % p

def lcm(a,b):
    return a*b // gcd(a,b)

def proof_of_work():
    STR = "".join([String[random.randint(0, len(String) - 1)] for _ in range(16)])
    HASH = hashlib.sha256(STR.encode()).hexdigest()
    return STR[:4], STR[4:], HASH


def keygen():
    # part 1
    p, q = getPrime(KEYSIZE), getPrime(KEYSIZE)
    n = p * q
    g = n + 1
    LAMBDA = lcm(p - 1, q - 1)

    # part 2
    _key = open("key", "r").read()
    key = []
    for i in _key.split("\n"):
        for j in i[1:-1].split(" "):
            if int(j) not in key:
                key.append(int(j))
    assert len(key) == 80
    assert key[0] == 119 and key[1] ==  241 and key[2] ==  718 and key[3] == 647
    return n, g, LAMBDA, key


def enc(n, g, m):
    while 1:
        r = random.randint(2, n - 1)
        if gcd(r, n) == 1:
            break
    c = (pow(g, m, n ** 2) * pow(r, n, n ** 2)) % (n ** 2)
    return c


def dec(n, g, LAMBDA, c):
    L1 = (pow(c, LAMBDA, n ** 2) - 1) // n
    L2 = (pow(g, LAMBDA, n ** 2) - 1) // n
    m = (invert(L2, n) * L1) % n
    return m


class server(socketserver.BaseRequestHandler):
    def _recv(self):
        data = self.request.recv(1024)
        return data.strip()

    def _send(self, msg, newline=True):
        if isinstance(msg, bytes):
            msg += b"\n"
        else:
            msg += "\n"
            msg = msg.encode()
        self.request.sendall(msg)

    def handle(self):
        print("Service start.")
        START, END, HASH = proof_of_work()
        self._send("SHA-256(?+{}) == {}".format(END, HASH))
        RCV = self._recv().decode()
        if RCV != START:
            return
        flag = open("flag", "rb").read()
        self._send(WELCOME)
        # step 1. KeyGen
        for _ in range(32):
            self._send("round " + str(_+1))
            n, g, LAM, KEY = keygen()
            self._send("Step 1 - KeyGen. This is my public key.")
            self._send("n = " + str(n))
            self._send("g = " + str(g))
            # step 2. Phase 1
            self._send(
                "Step 2 - Phase 1. Now, you can give me one ciphertexts,I will return the corresponding plaintext."
            )

            self._send("Please give me one decimal ciphertext.")
            cipher = int(self._recv().decode())
            plaintext = str(dec(n, g, LAM, cipher))
            self._send("This is the corresponding plaintext.")
            self._send(plaintext)

            # step 3. challenge
            self._send(
                "Step 3 - Challenge. Now, you must give me two decimal plaintexts(m0,m1), I will encry them and return a ciphertext randomly"
            )
            self._send("Give me m0.")
            plaintext1 = int(self._recv().decode())
            self._send("Give me m1.")
            plaintext2 = int(self._recv().decode())

            if (
                plaintext1 <= 2
                or plaintext2 <= 2
                or len(bin(plaintext1)) != len(bin(plaintext2))
            ):
                return
            R = 2 * random.randint(0, 39)
            I = random.randint(0, 1)
            cipher1 = enc(n, g, plaintext1 * plaintext2 * KEY[R])
            cipher2 = enc(n, g, plaintext1 * plaintext2 * KEY[R + 1])
            self._send("This is a ciphertext.")
            self._send(str([cipher1, cipher2][I]))

            # step 4. Phase 2

            self._send(
                "Step 4 - Phase 2. Now, you can give me some ciphertexts,I will return the corresponding plaintext.But you can not give me the ciphertext that I give you in step 3."
            )
            self._send("Please give me one decimal ciphertext ")
            cipher = int(self._recv().decode())
            plaintext = str(dec(n, g, LAM, cipher))
            if int(plaintext) == plaintext1 * plaintext2 * KEY[R] or int(plaintext) == plaintext1 * plaintext2 * KEY[R+1]:
                return
            self._send("This is the corresponding plaintext.")
            self._send(plaintext)

            # step.5 Guess
            self._send(
                "Step 5 - Guess. You must tell me which ciphertext was I give you in step 3, 0 or 1(m0 -> c0 , m1 -> c1)?"
            )
            Guess = int(self._recv().decode())

            if Guess == I:
                self._send("Good! You are right")
            else:
                self._send("Sorry!")
                return
        self._send(flag)

class ForkedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass


if __name__ == "__main__":
    HOST, PORT = "0.0.0.0", 10001
    server = ForkedServer((HOST, PORT), server)
    server.allow_reuse_address = True
    server.serve_forever()

题目还给了生成key的sage代码:

from Crypto.Util.number import getRandomNBitInteger

while 1:
    A = []
    key = random_matrix(ZZ, 20, 4, x = 100, y =1000)
    for i in range(20):
        for j in range(4):
            if key[i,j] not in A:   
                A.append(key[i,j])
    if len(A) == 80:
        break
hint = Matrix(key * vector([getRandomNBitInteger(1024) for _ in range(4)]) for _ in range(12))
open('key','w').write(str(key))
open('hint','w').write(str(hint))

还有hint

[269865700520122549144762599745168447135899292447636617756605602545212728167797447445787398106779613741477733230173614340453529478006749280203791219240495545320784253247776438152444000193996715061172344898960798274898870276035746116096626771403981985377907323596813517124099024451197742946526103390328807831246256 351825797459362105605308649037214670594688383340169438930434420259269928275998050547973935801446674821508093953928259345972518243250576886209287947085399150853100589302713875591726622523078239591200598436879752732176246887916248939358959982281252327937943016323841545720179709080112518678442049362350981509034718 263649494857153084116592322640026892708704523757635879704627428861744239824087544706911427923497181418081141799670872495368713195091290104184732226016053955456080069924363050718931449355663612295983210728462521014504883613920516962136372253488247300322354664463901602570541318156197056622985692829393446426824638 453400473599186415430546643705275038528777172686002821040599810743439930425207458033941717472852507386860793929840595207225134962986513734506356764693655438618941180687198445634254053696966577360482969943538482461972582638716434085445938134971492342779462032414137699485112547903822163588315191244265946324218228 221827206659930588955100802225668305862545149941640820857015107405314701820405616518433413575662470655465592803570411353938784340140188287733921352831214120360424367473260917811334848500233701311695438235451684226463170984345521338680563403806364662014170986174411732503648583380588103055128943038500134530643916 262203710827134666754393441371926810666786719624203864995763104952378827035382567436334257544099220873788181813028566666315029478997429146874858602787070177245600709015255267085423481719645325028750498589844959751577586557620102816409584289798347398835894955523264261758402589145048117452982723970755642721185948 449549947180605498384084224904383747663117854129634140960197279513891658001908553899154409208608867208695858453347485738326065752599578853421177093646899183717259826566392731977061092066943083219101516409628761436417329565252863717622046112713719560452994438641997826306366514591051557604666293190256180831457338 427882301208025139610114439882502441914598510240693844044902667415035988021658089285061603431657599603331045335448467272333422417626837392018638001129889364932929941669822436427404546395551452209585894226820734770968204014611476942151983657836762789688274393777314450201198374683092768582274185754609711412304708 206110709892941001547312247977630809641839341262123534620411119329846379553052343003462513763026898611550676850103678046155244343919504874675861711356256906122323272209951451243624891037181757295933079679771758786258823164385868611152404813858000740881052355543339622168479080269444970004478675521293416826708518 376172049695479754397279304655900327678015926783104795566699104261135819399512659621342636669298191140461316867639169744791504345311783942430174703887150776382877123936598986072421903671214609751973940119880560010023509512099294872489902196710299820192154670761462699775769831592820505043876853866377139051584700 354989144495191036439184720296945551786270296981167948019894874956969763278354891643393993638515549874937620037229446883785428867336828993393766325205264827014803398207234817979275257572341689686447010646631351076260136309756747006523828716693825921688154934832911308097472833298941167446737019496978821483004142 247657418221571455680808477138957290356931207729656804527032245580960429841816418251851497488948400261671314674513219816337747752077679968835580384381624054897709324089163678294189901105831869992119099572932762170016838924353956530516871378196167792087986296536436978303095420850688527841398649861755287315252914 267323214115576739778291260842843721623810532694699738318490243647729313782577235628052607303271826513284836885625483822163201361517891012567791817503099871180988597553316105403148790626072424557099203065132199859082058328832860860922184801132168393385984454558438841623269013769064186695669122926428112192958058 380213264649117070874301733758703992957052936843733186492527715942930662173593880870634301175054838023249481317633718679161000064110300930539209764959721575720322049712443403460593162873330727228662863503060615472077497723046998024646756953852274720572607225890476747502455930116669002121964715413052946067842934 299711354673898453867309253202762657296007144693008209662952150647212243688991887703988087318065032988637761345182760379040409182402949915825642302147237357969028446441002244872828954397547768452078685431997252342287035745022966033862847782615826742413561561692110959439029229515697207807688051683325604252733440 365249518697738703288761077464962564211784565489625880111214981001160495801883728584481549266513708874054054791287952319568149514368408201453178732248585813844809011050888061672886805741661833747721896023077257558372204817368398292194245959048942083958342665661675547822068884852334483336260109462386159088016564 234545469963164507706928881332558698102265602045874001492102111685872459757456367592469441102854212705510654825387325257074993658404998100908565444353109631283461873240676108320629040289352814544349197599373184745156814420454658805665114789039742029196643533194690810954176812644128288344876173839305663050924382 403528775485460422299177022688931715589694738265629775672770507924611837945109216220772816017023088114143940075372156298028685445638442326378577113339902407365411497947122572348948969051001772973442806880840187883877046852394584867407634101961472289147829591393511113697557028915654508582063486155060434533238994 257705800389350838171655930137607990615821847049495140599547431163884933722120908882943391518805467092890646138176976972348577478608553204931604995997522105267077845561071320509003102531223852713962266895091989335267822143524572493690679315729733459055455391559009207758735308530559987072982151466476819761020810 294949037304356424643319498923044835942305224417122064436278068994313693511819494043317635677951522630682156447848037907726136749360723795280554225964785571884704746898469546462623102938030066073650709553136937483623297572165996272004599095405260872411154410637266055198871382378758905668626258164495032515036494]
[217534291096450557418605644329012201990988348409906457319287678554915925894947301861717541644670085607409235030173401559150664390021730839885707888404987638847406390129353689271928708526356828238643715318740422146095140701498238775116704950720225577726668847683499154400939600609750127635123433777452322777505227 299985741024239594894449078286932412567756086541003255987190288861977092270282614087578628286408345564778408351869829222184480350244263438562642836143147598451076082486921011240502417579240298068263254931979242127830353349341014204856656884947990874174425313394061542099067174524956545137639257473364416433658881 202798307055619603766849973722145880157913653763022075733739076450676579422515351434937835406954615276624274180127714975408416717925158095809144438515576641919168824386041408539675535153571509996509034452563279153551561613043824473011875804430630058828272859506931119823192349545016541214481806449936957017139624 389310826706777274276911050261903604293890010616195108559326393397696368170474525732224622570706077939217279951515243147950244123347990622569516155887612174310555805572560188840523261084250032644888189570384108432003910826060308095892754475947207739390002921110221318616334502800034305012953814034847609706533077 203750320520032087070282509875347793385534115831337719800765070532648634372576282725518814470184053436812961567099199811932106843102270863860541469755649705183607691967165638623921191767126661879649518715669386777465488292371025020507624829918457270108829202803995162934708154191296070026531568338961996208110048 246003199342064966386401037705588240768208614981963140051279769565414972694797823454998131744842783649451891709418306504304402320537094504325507991601767982926463576218944515469429112620016175469150530949871499197711380790599877680084689037713630817667894785846039010935515297139556217795662789191857699713614906 360983300970873646446073533403501696580355055785364410317501020679519582788611415310963465838597845805664649316851808504517843797749518292830980215171622621205159624652891327948407130214972909780527253992062663110647664308404422758392098321995110552691917342836832205721272403286917597580095098651874548339463609 346478159177074963259437964339822461784513243998314962408004959068444112972399676764212593817525806206696987806792468658850901920767278509883896439165614652876786381976760050222499515051926465406141723351617158818091124821399489777244871029721795642578077427229441141826850529088908985846490867396362927716688286 197680206070014699231490316927331366998086142378440815071078703634573654593834598808270372452579194991910383709516802387381321088452153195316819182813413769785059291457162955350173538937816599111850170441571471496544471904660258742954853421171917854504086402083478772023209931012965852218877947283611271526401198 296631043850009203419659983311930573809629678772341749062787393964359893718109467046442662966026499706086545142255043411998881715087081855677529672395960837029306820222658456378090669061498322702114290385701430783075064487069483669145205939951718863800735708637812976394412302231844870056666133219257739430760968 321543282348107948350055502171575639099268924765096431063152442639503890254386857898365425346040085065342164235914627880959686478644492435471757717113325055833119367639694568802973084926518805729154508673861270707498771559300909198595446912306988975584592344283489868303120334700133625162045848988934620901461993 214090528273468022503375776302079468133087404753811502071599284693445210853001990757698700272812877965356697610518134538252580290612007704077116620605771830925281588116014082867148479841483602922262335863005345547476709431441732010439590493281165124884438233913304562549722668416689677460604919567354748221404912 241666077951781283582896942380640928699605206380583388225154069843486416875463645685615141884324888238571267442168839137738716812282064922917118155079159799172960314190949527320951291443101285486457896072320723881914696200889269442594897784837333018264627709588861917290363567254925451931178339176942948212636593 331850523995675825011323308492275338141722763618064691292454731685667611730544613778991298283594068778593758995718897816765236585031069054849658916057090995272321201320112154704829503887391200648415314722913437246891924069059764056730613895739014825034117009201549557661098644931414323511812539461605865379692343 236042766580184732222601164086098414706808846304687002421555113475494060741427248441203801818487899323318243934592488266037957100672575181087996578752812885684103764241382853949521333940929405218935587731190775960794457147897483182129284579880989985743933591845677123125316322317886170268589725788509218609593244 341763544218428372748254816927796249696395728712218602447558457377380952562503982560225546883279147440590074311597484907080666223477792382995535855123480939311167761645054470862443523464710771074985050799640629285011724074725425018257237732707998162820843655444807571674179160109826392342290622155152526257265227 211607090982758438628935080173138052993338669471937123226084916705798928250527009735674248881190048026583991630958714245540055922845019879821774521306316231739876967123533161088937817738447627945879558419645895780706890780008504738673797440094904764128301197968226753538270778926330396046724466687020073201891134 353468035200784514632038910012415545085659045031011250348642569916845051750155661624535765315386371885057641641219421513561327099984118295635648108899510203857714467400528923387597512643281613982061904225310223869094246373173198490515523480092904333746235819322870526818300828738688985039204673835182927431172587 260339807090378011417857571831489576132261101738739504650256968916784012340260947244000429443283502012231205932924952416091793950739605889052631990460184066349381284668933774868501173041464947967135870247973887882126594777586714134883633276152142276219529499956074760484970897654417303880631112629397993011077281 269154968451127052630262641315485325223979622272464224773851984019253984786425576797413014459788229026167475768642869432142187813136915392188127172722630622350674532909602881148423610943725553222015853217843963747964806936405906965108545866027403692463504426889608795440704447734200108398516766743882127710694803]
[230500872306222307001825875101395641532927440021809513056982563510212416782216053058938283419144048246964827940917148509989045775025890583354803921784661868507728439447831997229956377388029242130414466834079339965592501725398532239961930596571634615842073136023681216821553465626632658844365902345054389313038139 319346637404219736680728003286854336892379991065623561574672500255190656571896337914014867841474437221810317994650064511808905834043624736858152276018069018965342749387344156368355256724949932688360634582111559027251177779775031481353035547492513097485684556097279731089085659030106759027672918474091395168578874 234957631420970441820984646090802556610977901703319448395532916876941066380222140695271048078996963810899891187648525594751146463854168125827195189406794729082962547465178629891493490925251634515054139818052338516373584876651147375811090892169629116851879016868842240486293358556113268007647155607145360557344409 411159806520123046533001645015422004388920814325712411496309073869262703780418414111023027132745627711545340807954152104569382960186903503630242932622809451559370654328711458879487536767627170725696263426877646412076755018238087552160366162020763171921060084671235719184157729375796733229337263074628444849871477 218022932188513061167495981218103095470710772702595412801217669828953834875023349287519621389916294297267211310080353911456027126130140894991555523025581619415957884476931871051777921934261031813240799460046825061579942486274420802041606635038675165682174803265989895433473239328041627604173532502504270118932408 260662424805397985005189891104002572797182747874375200867946211546195982434350940517327133205152494880457722492985582879441227154349179431988225448302417473193286389062825781311331536646927719794660730412983817706793885414283832137471479011539923492363834359680840103834325638455689973259863750543596416390338902 395777966895020452594378072036143782334452650322689849378441443018449964592854134951497008147431095151062086583995389375861707727530311071811384419039852105335962813231767516452724156701764849736010488990406448904696156240056278064928471311302859658447912112615653333999841365194430973112898020075246356322538318 386955932162346587771928618272931448626492050753771840404078415136854443611669701947443563013092902011768448379790009607374010612731087587819302699095270552237258793534679735602231407804420807964442201449903352731720280074556201403511201076563286272663561894571104850363510342362707278510533018131873807704981324 208036780828782987737063274188679595121994982276055014197591900582427740596216128991690117163088804991957874317050675936704015001983633888289029673031460139042623788876695621443105631886649749091546878360347864198963943910413848194749494488931188085504922302699187333663114232736863882347490926106029939205561829 341589894651050479531036917174155733919462609215507347999563225035713382382200692091609499042988983238564772822710808307419825844394136850613004933138939583002433506810158689961631012224226297703338922353105047624463884521053809891117049648442342516317976925011623754683296400246452550638112958345237565074757088 361372629819847226513296671769920664145819443478655564486775439909024250835739475565740387353131648256820156267861669177846191892975439256809339192673526480188944086118138055953538700439271466926654910978678496031375725168911205682705597796616305863110064180722285891255177456256167458499046770704113628211768288 231708784588880631526684852667610873117487444554165664801852237683515457377335450178781727108115629923213878999215079127159007887477542653355654992059772536370228678717490415614576940623400997504422073038065278536222799144348090177878546482203961046921805244124417170911606214521134452087278983328048332479212633 257235139565129234499042727583079214642841214582856189527189873119887066629959079586669035344941646476645030009934845390987766930327957701258179898162908733608073211460576776430056800045897025730880969404634773143876871807586943537331692983873858248723886199402160454905126949738368925348623283312517526591695752 356020430268478880524797818835686286994214915370621922409194366447198224524932467208747517052467318622350623632154333760908665605417010030377788773367908353337247902987225177123395582283364248224939607169694882975658160126668840991035137392122637009849659397532430790961051980885405244154585542485553311974099244 254225250527649628082877884339906179422257819290544067818197505372210151119293014878871748558301685102937530147926809655160495972224167209766662254054187244984430794164489184601099442792388825235100048798375939489261780456340936588813171965717660616088598785157593944806423887132425613418200540810576661959014604 355226420187757326809206768274119387711588033115904032980817599953798687173473510216984941316130152592798434552915218895478016917055717113826113088455414899485371296647249196600565096432746955149339273507771306137301727637257330198023976364348847016715217224842002123311454625951897874150820775871818136216576461 226366538116279752656341822501419807657493291510341585427979495028272788181888145418214988559269538107541089142690476649099623146281902619554418525284090015388915576735365210681623206570071194234608076890305304323568065781623166549612150579143967434653271036993387630008944774771317084201577842144142605257711789 379361101594183194320051157256291695648816154681350290397853223411897749826316506158706132709526031473733220390200149819880421461375942473005208510552966132369930357933817031012133436058108644107820964506786414784437708593945666069399045141034094008701434267605910603695829807537241738316501763751855506523452998 260263026117153931157445602762809787609734805322533947091451577078053683780698380697146037341725217760416441196657984950873089029645750683667988322226901441254574619049916654767502708904384073404538891924059487889141553756629885540154548261331382654816699774700463437719775308170915710209849719868076739559826318 294513137327359822445559900278154162338797334209712381785463830587230365249681570469647502193559837345608592517462180241084136617761056542083595083625828665506425175724190844559447492339624510120098445183252772294710137038798667015176053786088400795588661962971811578424998618320047008511247583866184478578499222]
[258097046649332123822467811465439621220162684890056534228529304115290040200831339183348929061370549814142316561397669245981450300412274825770881758742625277704363429039568923983019117782192796304554268618085789445481491288169398524786358166201091375721917261328722878631393591271974237575746452838503203776340487 323044329288962081980829632151293259293609865523333055981116371298402955680942234093697119616443607423097972127453658771700105670546569673109807415402848091721988037413307976624321782955668826739405107274515385681771058021107412452580877024344446019752645997039306429499591991731212695917832990281690960038942948 240098445413308968101412069891968569616875267465189735403222873142327590701843691134680837368527525762864626633416239430636763277941392259833090579384708617684451758698876562803119900504933306185880589743323787880248299935477107899252190995378319576027245196817150474173651719573944797376151421670288860866316700 438185621960104118443780994842317492398718983830421796973463024141398070871425396389071474882364982973379098549919678338866229964100826477343622850012688029967448100549237392542323001036628177205873005350082304820339985171072985884829515533516115135864089002830755156194331342269343223144025674365035266671914291 206785762586073193761321768271456794671074725748102953054599204948390834388621677816953569526584249667830470249591153643775350429559125647872404086805902717860824131270716051714743975954190316065124751942095154732815677180910550803421796032924099505340944196421073151195879303784317812026753268872178148358172455 266120256610108877981179580856176705554261176883719838019405593344703688032714840472278469506217013515514255683261858262573895530125455960683253594664912334647977098873841550823973260407940114500621844089445391281188475895392877389175977426463697992366891940584588929975856788360155822183744364822541347695242314 427259963688540552946031233846018077241925636891322295620011833667322844416049960740180858265808935556337094551082381559798689081480138214474599763458569997136416997854888351533636232880239722119675871537747971869936591271948585774274666201783876674636664311296679926494394311032029934194184169164148601270209697 402824086108237678600789571227311298208591656327241493019992497022814693193086482004568609409480546097763420215218154211029769119028876172015322831482022025202725797741358704537921526865067418849578287266138070178892637025209029280319597652034944633328928112096082851818084918323151669817526778528343345872240253 216359109709894151187123433929738261712433246932432325771423795270069876567890537017873495572909955925317922167648505968404994034737391241490968103251633930176963999729874644055426385836736199904931071232964046711730646854013982173960754135830558545152658153878836263258778499815509629684545770525184693766653397 359042856151353106297876428356375402899244999841049748959342598693583016655354068756633772485810593555224930878989297328611782104374620377109241843193443024295110057342252039317345677602982735010109047515170320213062476638901193545002992255115272954758342889384905170631966739146922761600254821681971945613571652 352647366747544437245522881062960849861007105374967373729350657901838652975995684474837678690265260186588754102587951432596495149847115792503365676276792660450758602589908819976549316180723470002631581023713861723102665347555778303628223301328509425869118098773014385147114902252009211078458530633236852721771023 212151224937878751258117742924576383722116070991864585226692916651928332250330593822297061766117623986818871868187368783282279546041806876701754726135150388559598395560348153970201576790092629346192204387797861892575323470304894156350866944248072075266286036948548164632270595142222430233760909764492678963036266 254245835604575332550494474245088717561049139474720410153376213694029360324093008280672470948671008718595536375431905996906107430118251917548889158314424828685226896019204868895418121257068962845493030374504019491791890312897849263588879358331259199339040074030343876759738805248961684872422441105072286940115265 406962449668446297768884451519868424326614373259530905779848196180884858864677794015603023934919561435478962673551313676612601797048493405639637112652318647250402371051273940300538208789230914297153512799423147281289939001732354197075966496255570071645473073725275079122946002297693678963485338717153485059513907 266847750871593912385507938486378901122539037964092090019771158728103831352405898844420563290665913341924262469687335683263506141418177239462297192795941708753314163856777358222639931459227106567887629451090366538238262038185483901516813721701290870140719290542177360299904836287545176504552500152589011552531651 398801750428523663427621385364601257620464273066769911128277400538227910787528374934585784832883177626116971588760815870505704597957094250417123357657130183539123160761936234514182409390607100826413188932295994705631899325156115792260020783339330682742529466636690722035513141495339491325217697764488565422354276 224826853007331401805750940205521326524185299741249471405689485010853469307318081139426219104820132496466477199123588627211297280639449445890323110898448038953493455576751196204027094469560506580159876711003417899332679283860069498525047577973153876155617917403857457501195222028610648042186981312644058491993341 380014419199985329419713671928036550119037256534665128488511143546490651258949525878180319619579976709796895824189734091656024491314853459263447377051221983366913675626517565910281369176546192863817557789004670024415291018058626383066358523168644994297051065787392101280217237925018014622886883822233479886620146 281289917201910723000679353084429735856597488902397275243085592808219428618511114686591719496189553681028650781969424060872760927344927363631220555803963845076242043164864973247108042037591961651648551220306954644131005248746826235352769057237547370382708157206335394122112282397753962229519010894276175061702889 309389371359395091097171202994612259221611454427786472867943987777068347390502531059685907277677630785364653871955586064180641888945830772969822776008207346418173724583649079780914874848127352372785354482296253246167328166241676284945672932226277975454387584886542989540451812697689789769404293995340241208937910]
[280024740134670004212292820376348124332053982881133804898565433908611163188412762126649055101144902585459386236806298938487822687193204080177612005843705236432150240762380268143162417176285122546000272164740337630148052559318352679563299853593086159828643126311546039499280101306371850404662401895236209091027255 357585885045952206380452871667426595632765787422158547288421344363971441271025192980619498727755022718500837991560659285221223512096355327072666529272207941296070883401913203579912929482435456764486332296646850042541597047535068875430750743203725929940341511137888017617312226305708977326806672713648751680242138 271047453021740004634754093390980565804069818306305155066415715350963852857843150771744442238561184447593029575568313067588756339470133925870456072872116947279085134000658360007770181549484553046044512106088498872843407890789192405327218192149622062462464433775091661769017758646115735097719763545639378071736792 474383086072681226050413237270694328310982948868507317605571493564280066556390896106637881058002361350015122381827272715995635723575475212112349567943614950936072293719009933430022659586054891898924376653418852075707051862761977791579979231581554480516311247946917584375863629928831489091096422039420317764589408 228662016104316288176091826521052201247669859864847891951698186436064244233720804631843553321936989266243567640395612884267194703501176752843068243381136449620083526135617455232585470496704249069634402309099639021939344821787776628044805621278981862690864864485780508970165440295036139399671411313729900566945464 284079421184732322434037716733526795728951031546499864874451524530635147361390761590874733863468879976759898508839609272072596716291664284315275796361037415324290263021289348764583840156391666437133740953927830103663941881696496327799045932648320504534606395077386071595194158555025503566884862217985193147571175 468555459958317280859929297296176560447247345076160210710681567091010631429008213041564678658263407141604372345526269811336880858199412930287426253009797751430480030617552074358884349733972444611819036504726869618721649801368230838915875667038424755558551679421680219753750697485532117847870119607206581182502178 445731574200512974501474110914379431812913941657269270719004280615168409726027702663388504167816291397711693332379006695885472184295799489848680446555179209243805173882567268637708319401982139155673739040393413480167565713735137666252672951210760069953938211025111086884365007546480915113024551127587793029229623 227835320519961005413932972778768138176707950009955708792075658451970826118029589580981725250641829522400788832125802852958691159607180725721386263058211867141836491371425900935418125338557358493243302186663872039210243551694043573709232190176400032890720771950204859018975358651555226406782429079658457886653944 397552585299433429396678274904730219988432387214151872834999413367461165787747726054535434756370419286241489137977020409345326105541093086389574620429967293375950522032093026959162159272540347087736974360594266428616751479181786330813127277701030848572399010708272792563116738889734998957338054094719843521573031 385053527936378864742881757348466257931007364785817833546268011845947772789738554974810970504451814706701541755139114382632675470617743648226244052073476894843695599812588009547021618777110572331672689952341923152702756592847444762978635028484188723526530112545586523027292529379672825347756797632908839169429162 242984260544455631059208278867010538459785698364205302900843727056276726915892162214228169762347000356682431053520797437168458767384469900741267789167070878282068921514555976861328148815859605662879914855792182177714307726846679640043146039072745876232260377645155453146141849419160073260995236972774340880190355 278248853957324787015540831693114810167864275342164541862002825775945791697751872085403332134547493678975151573680868400761468197575426232179624480553348702385836786620974168258242105135069584080114952448122270429974891337591004926600388914234604652594513513526117223776042209780653268653515871460106454167346871 425698874573254729231279880364408765587716835453670833860555799190874210117012637877134664715078204053110092814202497817477106154080693117668201961841947690110226238438290656184653809729996612268953690205369568070810685977754910219582791113267617232489022187671745190635361065946027284648876615569308924060759347 298896714155972796293718777379600116852061577224369227360579777043844174698157632228606020274355702932734785630575867328218154465007553167430947251023114925089236444974743389860595691535056672977930168876322541753382235540434560394747829955880147984600272035587254572880196882621202960031064851457415396132794493 412092024487041728712375155049158511858543937526462246768950573273230910115291148149891099120465155558591032175754572138837781147831813666565688093454686410096389851535479717346576297763287460079702790955258093376001569384351344234668582883963823133011819115347998941899805879522628669984537742486552268056852412 245593500517416772996683929839547908554315644201320733057384943202957840718550074940461647083237207782560838397614402078915256632216922242987430632090181080046971114944695991173719523549269334282086441901341771596762915347406109067105771749135037206944712692461137164950003296752531375988299522805694139611881274 417819953001341096378228484028719147298102239794372124997252084007875186256067660357694779046983512630361499269532610915398124753242141955773400150142737557695204539689680116596103690336388593485195484267179798826664303232590440911318895840934564463183868996082091782154810313196191572360393516696842248593758430 288593776118040616314766171352332182970917397991708526167873483430646926814369572449138075160876531006670010322754346127162592913390532878110516266780718165401132833183550676292105370645810584714405298038803253947481985465122982906581999540840036459990585623825359327735633867462892913211425824393567032421830570 328484441421970917256772156408377008898814832472624264081640534401357040641562205085658955855030111212409210153800573747215971593149942242637937610673982096571323570013781797984522328017978084674968963884240025718649195662365143511884901590431592571684699150088131358361668415906764288279386570665594476271529949]
[234941405478544537806439902602972109793256140401749807418760066831970902266784804135415855605558499988879943660144800777550252241375636037095595041552441375028547787936573414837033172529784314934826666166985236289941244475642889131486567102498766410483366965976059092283356702767106747093782473323132885864765095 291677502151781697169396805704790537452572236739817342348977408565398480892159044347789350385802650922195045000403538124235427732746451406657973513326525946903495596864917166525269397421847882337806230380881551838477833254258714384141045983126888756811493191481588971746231257100162392160366136492190032977842859 216569660786775015250064116265258102160811424030041666034800110963515922515494438517639728219229483299359989140925260356181713747361917657316667478071947150461405239889431920355244401518095468525999454907970927340166674062072546145973075589076816853159358448741031038118312758449570713709838718916497867239183635 391847464394006542562367709310575821012995508588057806291886133197507008731074962502160330963881230763304548557747685394226579847084277406609930737878569806235535164772734464915147738070524095375238303080739544539286507809953726925806818614599071198937538129853259337589374727067902351171347572319422596065585538 181647270791559884308461018783145677855209469257398612256194191154520961648709449746128767894642800568538851564980773362193176826843636790538652860182573280928136271576661753494016203605706892145621492961651941268505383273442113287868784317068209904092467959555929627053999464860511524624478047410988243993671160 229602043590529214685792361103915277729194233162313438434518448469621755059067514515223847995622626157171199844976111768730559566953264611748216471619431416616141313673911758307565105081355692784522521817054418327335900641986796458079766433053765783739186115397838135266923101553641744894968613070191489109821873 385164843546683846585267636759698947967010299010006672450214283581302184481023065740607519923065905507221930345996078875528895425997897678890419714478019452024782392688574841031639835611632230290987542076476311240955570192529401862936758824302182298614684225788826251404791021458824893027042753042111039981124991 360531311418336609045113951233515733190379507700376677886624697472286289061843162130006068680170713617123987989017895565691060790138614933808460498474110053090591208043213602608191819619733175883238345242242550232927678723368441905268201291886578981064419745146701147209044234505351385366181252144309317957545399 184894110101495577123261042894168255486446677250949566899806753922724978372093795827924135187258861899505856078497177382508628691215168625027950732472584934239402780979310186086034260981159882686430078865861467903663080701714646756086149278953597220289484651062884650555523255800389518825556121587128606486492409 319181497043527414147252445701707080083228636998825169711299385295267468322197487196004126341001328066733975971672308570580638903742793617790504554511341477358910999031097412574804372827385286976774777911276197925723993015061673157469926661516471343052534590228091340786226161671203299799563601725490781868665329 301311328473247169347984463999517510382081352225603630925847318028910115417604878073522635599161104941463115734455606530269195612841454564958819587736230271236178945778072728928697448985291550949664077332183562429073568515133232704943213437359435567088782995180532298964022874470776843767108011479751577546157341 192317094837872650600497967599667693434094097144071766794240577474084025875931836567888880779700085642839571850442431279655926758354965138423145336538092380858025585912675506420811657644207922840507838794124441107186664986163668319998576318868650405348264861967654159749396167945322854624451743349010564730898112 224059958268181081693635305615408576107433752030699992559836166482654674882770082939176331700135990177151006248749819923381516177631509575782129525368586463630836610167988709884977173264122512515454874376842400869278195832555938445526482391763001536056233554083639398337236581706254496889384920624565322036781200 353261945928503194570154720828350386853786352600901034699058776813240687888523747531385649416815561631973609720313335537783653925036634448473773636441144446962975794168516048008638119286920735207768202802305299718303091466411511632260056502947646277658223216019072713781182246447747127418797104297768924423814202 246930295423566502357206924807828391647960834228475446862077406361770140516706973015128062283531583607146507629472512152884420019929919921602994196458833122417564602125105754555592519800276504273484184002517760439050779153082916774730678953472009235590731664672061092646111798232721440868903533261470176860697587 342510721749803522308183274561448212075736303397755439571936575056953281248256151345344421713479320035329916461438735743159935798465245944866424331362543580483468029571884649072949472383694648861724656384811304086214753441328785486024501095422985189406956027022688945117139941604054246476668582196206818845274880 197557168277644910681244382655458880014350776351131459299229511340627341640173620168845939543244771006811766164164899726167454506104108254267851633165134245452333524176339226802054545228418274878271453211179234815753547330515826759597177430045653632763140178194956557396920142781089610484547938756833172449930303 337592856479567432745846196953880480543941174314591351553612721500748735433337069600356474726004254646869420181617057303987378961818708370819199683252535520173442608414076303836521731984251352669567733486886955711717275255750049326569648779877835664947552879104010021498191608353526116107345575213681003376273697 240062854309216908975812999487578709309099550225867237253627148959230503284495114763077522787812628620034245271488098815465696197844412670159346244443623530004141355429450336021354900817696443161378576167418951023809590645143641816815995754321969402789050472734344796838099375347113806626392844870579009848171215 264223532854544506222243514867228543175887221694656905016597603651018159647499125522388150398442571985750444593456208934899882997273496217700045640611080684802992195962470395828274925871895394225934655523828781673809462849991776921806979586417990675368603966821693233422575878620125759667142408984825286787061738]
[267868337426328883888075916801044965399584652571645099528558844185037509408970719987065800961588587254447252991352837535384747745849773084480995534981837572630791932111507785257631468727468232469008280233557540930846008279370386503690296982295878338569034056518790101543621842437025126181246485252569470810317747 335461833309323380937036816131116887260017914352360911897491187523050086172268320909701547327737152435938267519484289011063922933693371791939789611099211400943970562837818922898241848909610839056873028164406551855334862982034686396802011602484434658481699935860020943126723183901671337789670554794899264777892225 250927982745633295638197948301800976195219831472495421454445757253152154038120274295242973259237197414742157518851564465970240716416346255452594282008213966393582662034891180608118004681672557514910830644462832215253152589827038438356845433266726397708601697956940297905889583012145097499687107393251657033568465 452956575843689940549488705167817302379253542950146438400061465615324334922108772421036195764143745343695963162199221693191134106648009626252713648633236160381704053806381936592693961219745747003054158832649208097398493005989562394285146025654381827750006711461908814632628677638652848494919079662265902543511328 213604032063645184492715249076918262387277002247114686389635677914856707160293895295433623621346319851888155831324703563503932589210399432730821082466494535584599560476105460211614418954277167531353569564506834303325102549795041270909043564698699022163131362689377656687196820955168853585665471098063661392140650 272815508734704191088313479965242735162702800151713724726696485173858262504895027190094852522895672448850296988825639666742424480444986970747093768504656185972461596266859053994860289676594289300403822681868119327318378400819038071105397869672527445814299624750891780239183578130336577170677301566532281833286507 443832425845895059804820746231889934717604084483815658116085380335029403552551526752472065809341477704397267476521675161154148355947407929731674128372623781358484518549537409127728983613482951753908308609371042549187869006464499243082386421311989002601155106263531960231192551354455993357840810549214437352677939 418655063255146701483774085511629364175264204889139292649751282555910436713389358030831734004609955748945214861821715792987493285832096676416789840785320499096487683232602981181163384715922173058919722647357921949130661789095510407860276696585651313918951456286309729350679386976461245349315268974096746184191655 221012983838096005851305415714631043914717921870057434256087775580785745898956049964974241524091614679910844905037473779232599859435964737501019845405828410424527354839939402064905687819925712595157224180800922617138652595342384796201689716543616155314074963701750310638484858593032626427241681193036405928144417 373262215483568360111784846962467455649246410286201574375592044375948944635700667559602207106815946833835175999362477832095923364399403375393185982433689486102813415173072525470877467707344331381713380351648688592635796044955824730860724590940542156987482400932902547941186388591267101320632218925926023817522935 362893831966370762701487955958451525129578574669656767184241920974289080262262412739638309011864325908045640541708940578971101511222238655895676524890729265780078903105605093558026066419273233496178563476023512243859605937910106534396636434547295660376307376399585758536885648892470319975607423967286115211726865 221473400005361244441969916371109246276608791410243777580812933511160546827970264663127141442719899173661271398479391235098496338624757181978159001075905787020834384404047025547808527354397676760233605305510944786365109454710087732003476382882849030718627106576481654745376621985538153534484441262158653896764312 262442044246966641743994354396430786706060724399248127689361771936777733534046150324967976082319918797137314321920088258456336976041077571670817265334291254136498888694639657497269942419741122561977070180590164175530809030759951480274904161308095536349786160606456155694241392993432590377504896077179810643939018 417168468787111486443672222900835348041803303696297561873957496037275771776636352305641075205072155019729402342719120571794975905146971199151369053830539605532227403588383725574768878970638920442510118428475319575312394753194339880698956683100671723831534904581966206430223762788696916385633521257292700441482036 279005323179177859795277440704843039979058015803957229921250533452840320735748894297749693664829781790050935378918267615894405029634648758716594363191439618043892239974666831765631076691729729119919500575567350571386857360508093128510512321920973603467348796248178750894102575237750602701766225728387179212032935 406791804461390319046145657757195265623434920215681269201655398348753211152105608728596617105227288800600417723958186792125995279149104491495267050989631565227584369542772942857626890862357230174748250746537885383618341848532105813700154406888518504649373729464394015205058169367742467011656761073380112247987512 231966396443831126895045642437528214115212211959701137840122893076397658095354059924539868678870145091053204727673399257106006224356541605146673060626318481435388317009336236222001290128651519941431669627139066183661345899145379171001400327269450377430050723723515540738718197468025554899789832804105580235656203 393261511414099183285834039884802070528152817324578308637128916323942898773995680585448912873737069524525240521067770666292258512065397786401667780259130387550686708696442090699134059390274939446705912837264609523952572300222741005060856856620793312095716302125952359445967372851077931059844431674803910651701367 285721048699657917830904201021496180537256973660668662426723043224711618976473720515541440241808949511249096228097146346986099738666175896506709816332358956149172697650784335219720798325025050338981644961805005404418401149545587341841047309562263058233343353516615509365848200858967038029009808817416002999535795 316948689344948177041943198715466034541397713616192147684729172848509496735092786744002732126164107653243580685234047063659262268881806289533149117494157457284052619461035465157085705366159574882652811230002542699609073328428362116704167404922820923042349269074496032597693961306481383805547598078029816455094742]
[208925621634500479936368791790733707700049661921370136786621943080290973004934097209128104745710949035599834585576000955924990226531182170863092173754984549081987635002214645712010172666902838390020580057191001156593413583592145417716795486927508928816072492162893264161787883956701788112547698210996712908469812 277881869492592133533584348008592047704408971916300203279724436379641461730012166534379012556942308562480899264800984988727003987029191865562478443130179350252440028908896194338731756431773263395803834785646264977170008497632926714981794795101448868240770431527765434367096501146992714221738021223594792183096896 191392376227816016146742937864506504936009695158966680565768573893259103115783726254455703228891198264225730974296495444547518516492277372599420632677526944101297888604861663811070909668668285847106286671364907431633891133693214718274737966773208910655292536239827749730352122782001689189676250181635661534140662 373056357146783988324001261011290817990983733139928569486822804250969404663287810229094057517151508520325351979643505259566583255784308546671274359187540329810401789064405476120306086731580878687430571886487018022129970161122379763198933193393164082012874769856239153925184773245768999900007526148725685275215398 189151134426148278256409427071366413520188009676016079450677932819587006160588724353758434921769545666226931230267824305351217541812592065542758009713652120459530385929731704136259998404704062061516342696399828331167326571083479876669555943043053168047943740248299653029631568376909789939106248768517090647048144 240512512228719798356070959926466855223811682881052525290127024891651662922391789865967765496804085821110850993939702912837144062186314942968067803643004332795302193396404009082485618635264558073225834097841413081075677673516551306218697757264380114144493009296066239289151433414434039379017646061875649745707726 346912176048540452836334546034032960285022179236803788438251747480644343259868783485803477823211582731043628357050670291197009221306917234214679914252534326891991085563087599411610179740885924667596129961260429165752788601672169193829949202924835130279335075342143742167829496792703096448616636496760693010632952 331130373037972001102953031643382396979515964662489304624052488599160912795125160318234519866642862721633549672188701928861692419781039403840641254068539850798575561274690861739963655892301251695988981187925766294767450652522044825947072128307714211239079822531930197101207969937023517419925930409353825469456226 196704911547760567284050385731420674598076009873937693377568299640915328091276826164288794904728879719838179674854608315870562759589598280794236610105908731802053119302919824057716122846479842474006011859073682756262425348588662373737717717809493704161975650796417793773383864926652328614176077844057491179246910 288744198187345908570426813950261730896271408792096129336472163819416730502152105449025428248211255417197730015467772830248900326002936441227960684688864722516521525191672054152484703319784200271826100588335140247721191783466829259326414039557724063431691211227913699402111511918673142833813709806399089806975546 314160223766452128579861005172671000313971828439735851393262164809908257282848874122242764968523201114287538447091690854508720803096513486245768971488677977869350339315428637361871338292982643086514218979033892662963486391741214111508994566591061182896746561270891596005443031433846504367118107622229239977276052 189314236510821958625445430297109310134459612061711583414604331893732423721978047783341627397557474990718081085631468140162397553785849716100088347097532996712406961145718960009877973385090750342652920674969693743369930774328443450698143101676309961271021142165188231029831485825620637611121566388434213441041096 227639552218697766618035615326387746026843650066567132578875508883597082357592196162419744534440656044550494746125485842331141490201209016484918296246228621704119958599025229284474910953153640550818632543298036010211688361274429640306899078083556482685291746437500121569910687838704588261871609562916512113037410 341621018888240518807088960299048188172191849234245240565461351612311451713088355317382498839718740283303487813712545677438538191672307052718249730232826087575245580972526424458884227978317230336839594003104736635324065238353876804896463305487006586573048513769652818984397716990022803444704505403150568839937138 216123077597152132543630670055269355562199345931984977069037529561514448756215530084689405786635470262971143013769794858355361684212611373725736278526814079560912323372074535977186754304069656065912163601215527606484677744091044035587999329874182822695884930958986741304204631893956526941198447873806112347365238 350298204021132344257659928097604044921237222358378927732052872008584412852634064984624664344363578873080685686411093410611433994933116392788378589446822611880527091025930422852170519748147209094085814437888383833134133192292228128381066537995036728067660581836663906430414686433434109211476345307877724982369566 200569699342686680129903260344190813491599875824275561995415417992992364171175737877630396237878781295169082420288201968428809514772651346528112268662588646610825249833788236333925640063619265380075700566826814005955004973364289204520681989309350580566136586613470414932749986618410222681347403338516521993389274 332478634383163276191514436654984678626644628860495401127847164436988350622884185489705399320379025473215204548604537140222014597979209029412807609351867634340647611957419248676258721833190432147074075941996333693958169415292190320714238628052320125734309181334383282887490511035825947758674019710633863920336336 261481571288761610800515150486239610090331881249174640784108800313694626026841178466448957106989246864194399955219765857389028396266490104690730233453940025110318346160598377268827783341728983604303433320271296118655344082911605622359592868855357966088669746859470179508992926751243414162275611424954419765271272 271526861887128138669968046830048945304754693071589434955478245894201567706163208390117728390086337577629494954350030139407920028158811011700108620515049210346381025264312249863553010933610047283708909822728743415380489856722999944947873038916850860460362112591717191847137387215708856093149926440860889221400378]
[175623149805053197861616427683048878592469524974820452081294531183708188952375657046874812938982110631942350028046267697790338027114302841970500843978963469894314503492642840507622494347676184175962190032164434594555975061352399167713874115936399166570170307250393157272582473779794429786721454357428554055159828 246472611436373388239989661262173930524461618600029181504765699614474301970276617977851330684035970342072431179147767677367241532556896669908885117835754331334843727517471410398500159811450355927016592764707924286251133211055134972060347454783378181405300582327936758880369170633433008223405702509773222249658771 170377117647133131861289078713069922178957692045903085485564629374697887248831319867373965890439419910888947304840558380439836673832114066395431739843608354832983406132258122150538490567648312137683478888589773810236335287424835277153061506075401034916105107183827331687942412766694195145073944164864786465418793 318880184470507855794337241625696100876255739459264701724373627359616961808074072150679547673649825042488879425799140386442963254577946153120439178044973494562563957793474838949737206015100240847360824935865463095332048802516593999858232740720853073685342567934894566050276362805521406320588908095085794437655518 170877188206950702651638691126547231307661997097691500999883172125449255821553387294756734615448405424267054425178987576456044259468078157017008218367575690622832151059934884069768859955396839274914542608568258587793577885498892836078118559208149330317305585424678607528177529820782274439777715575337461380706616 206063782701414601378657104339844733567076877340250596380188623480511149894410345740302523035013420807252174879009909465492848072324709491924842595528733544155095032521446041004004338880847069376043875548470405766831552295017253969018349754977643264961787752465568281070481540959661907998749354350611803463427194 296902855337610822083670637491151564796725031836730507640114579121100759621016835208167001121556790196308667848787977067269971514621628384560398865788176665093040101150549146216915078889519516752791380364048646955401968897448644344227182351887267732056428733969213082815254850806687946171726768790110167709536447 288696280164728236166908851041294126515119598803028148975577739092543353072122368433038776520382101061701416136805797803029422344214691012190791756621766050907284654673202454318182027043589587147268298815665800645728242296352078713078969982360873210164364082622944104383788870742732002742431888753904166580845956 165736203294259897057860224941109788933753304107990451347556498450534345580318965824916311089496822921822336271570417438683256020041657954189552944520698938307096708718845505202544383230308227719320585778589882295006065300598538148699629449664102808980309933467806190864687514019591877476401183225646367359357939 249874714069496977802858983978269755231822334239693578113242758698060987334899957207653349381137467505217559841886198205698656243173634161018849158180165883314829935431977687561072757393068458812258609501850265110222383324683109878654345581064693931403813786926227157909942436884699913315358386420391348425202730 276185091021460126251403464203383531551270101223734429360714029909700118803908402648136835802798332818146339309387084338084778767840523849225812815989953543896488350336682093621179992593388836302388290066064653209415361696422734628833111685768822301310847196850362475040891843431422987423098238410429826347141057 178233425293726887379122401536860120178322308260626893660118992348808245101362815377642430952905493472258494231289246843918056624766587890675725838663192213990655769602268958410473789506042922545222536788380485727577290212477546807445792687920398621489120123019615942748507441603362226862253853822543116545385835 201318770379458483550884351829608639412343961437945452007135216858525000422747657723793875656466500557967284959547330862427397103520071968294206351756171979819157729166406831986566429836134587979891990023336453264404803183826997290507820050176872113724842252709186034367140199197200554850923230098368528091354727 275101003478066982297142226914802638801476022302467989552456610713198223325752945551523797097038370080012893545660861033428714922218051655619133103597797529647489096571635032556150305695917870642826560961039081483737278079868058119617191905211025704037908969151296010716469170979254288869817419337172909965664385 191249958163947446317734469465421081643380085390691894717888542781495296693984620850729830426974507061065442122276760345379784096335904357269709051257814975371286222262605797484327357943942136830524081458036826390915006444835238609374930032884999988873539314866370053141151568231199795915419316787054184559941630 282956767685374732684255505055321721541404064828514007992198656321848213210108304752569039041858075019113865418514589306981230705124516257723815726304348813185430791760354942068520172912031833198724227892758160303874210781537582304401386959233136874198846566732881678510136605198160541154389924372493390566790348 176674189063647946166661855123364607063564837999118994435761167829387950465557500962172651416083632955175717252656085414817120885100783500674404865386260348794097629591012031742941277217851738968060839882480813976573845233225224918480042050569618479847752577956637361266229050642559205888548899935869529919789287 293629454439938675665246149997295229780540641224058348104467608274064565127389468481157539830025313682073189415697778733776823698579272939265657643462398039106586916514045559978839231057880657927816845504452419329255147403629087612138586386196491856547187734111017683784372399627157138963836461318222943418486105 214682330124308024533638289687908875517563936766412556789208137260848655527240791264786452120718235046960492471701781470115047433128288077827315908726921960700779371308425360277049728613242474818106770056751163305492738270320109661267437252899321241565992339289983249509045957363772431428834812448408764831008567 228022702864658988969129022620419283010435522655071062902293956079551522596246345831856235014806281948127943570821740330290263903929956923207512216200564168868549687871485861205457540731003277927306702487900947751779614446042211492488056556189716450536869314181576767095238989836140137514924414849863116384707683]
[263802743125065611854663706068826473561435130056041380581155630159114016161797108738656054337301552361104745501626297744633677998346389065885445645225457392264402685256446732617410915726199518821525714030999876001288222121346036166521447173049410694650991543915554892354947398312698794503377416461200156805394371 320896134423422574520240291349147401639165979146192371278439880236522964304051823480657847175591625518422085492381476122103312288655761052752873859442484769169558817241190828341156841234335477900521098762932369961822782795332987578356546553091129465224263619589247264313390916497174987642177073698938428902840770 230464972367479080091313350804632442414768036789683466924014697404641380950005377670596402791035596590047124322259265099437564010465193833824987830791614121854733402779045590771445706674507821069394743283382958662653151758735070694245428140605405921624590397151426686885032916820611603150033788347481218566745273 421261585084920182446526495116643480392730469743827862006216040691491037160349188404172456435796440269635067480312266243739762324986305046947862269526406642811474224946858743837123817349029135138926502157998094768981502376251415436206392989253122792087156371410523822026858140041260169395691454120077192521149849 185418536811440205699072355965719607122795550862289332526528552739801300951966026705708542480834896336207347778790055231810444767897930754793773163859353636496571221348155463841169805294550379893738848892918721076975081924623189390447191060248314140980281056389234837461879760635375755455911003842191792795699836 222949724559345369515876742376324208474209224401745813603650618654941067496891076969113387600769334247281133503335610185231877298699232167392913882548246585496460081945346996617879304918670432568357795704162111628133186356553020806543056111488324767104871563625990468493103277705324264277570952424392190201115938 417249053603668860398638007724313631665518151980453893200754456866793289926569742846593268065826968812251298412432228047579953515503978207959604779316946038737170598679761205004141075158189151106860397601785647200476690891680045886950663791354463313670237037104139315333948309323177215513136677962596505855724482 380703131258698442484257295705282460138459501506258587963804780147303689301498863853181114417387375260509713819428913085369967503012855131562124116143919603142878461974086212048882400470582722117027508918953850900225592332853448851076539375095239472294957289814520378739330818569447425759157258662686334253355500 174769482355480588345311613010365968105647777227983215629383135386253956970539798754553852061207843036431767577299073223868970306308504095596195583150625655494261586095058072743229891433474993939942398453442773226310901826479117219151788620376072999054073000931518253447386312127143793652689063987632256694644897 327164800502570111999255169062214852289024650041204000955392696812938650601633308356122411433015318582625120285841145363750655096696094085909404926864951469926527492900081602416299690043335910528297439260535586701858449443390263596697025175513931804810020282888341740518192698006322684878974982369786387253681316 276439838719650764488760706539413808941389453025425230737995344354680683748291159898514158071497732848802350556863341028359281838520453819661935776752717598508065174375624156487099823622160156401934005153049531524751416677363022090927104928829311418942258423251999433232422284391368310998233207512721564461566556 212704186544971246222074331123597727663763455268551960984096797016253016572607107738345004231955896971368977347100937140263521419465021517581645826070200344547730659859242952260350574881399238499262239129867333898104370883831229865121085602266005715278431850604432546565292403574347428963378485409396018837106565 231137422991648931025191013127711640031515047110174466235597219684768405973493313199593637448742237427662518543563796364330721637222614008904215424565320301609005142351466971837943478984805812334326839891442190086073513302604672100631364143668945324150473253860772189723193828633877450731413154571181731485383640 346852671310986416620268341370428386760027918834948503130669645512096062908498635870610732389477638337172232861669770690949699384690517861680456761451942282251505556444345558964135302046566863123223076364168217803125255031661692235457299179688870858823807648198125758577241371873680194439823200696888713230902212 287263520323336668880280185765643127589437972686582801399161589015314791815648075056207418545231544009174107068734307569837848323966298363454768482796027048582738173591634259891835449428405948869830133193571961548167133122964174404800246571823699011968363185640067441086555205137097354790780403579717485627270428 329883055861881025727591665236381807383719074549752885591622161226411609685765134394593157735189825832630380022491502237968886970250397907315413692303541068768129070878124619704366859263263954300306812557267687229123228539052606395691784049866558707964342564260464000612180076523125192753373680388269270251292093 201692153923743022227927922047012721514180108981353368638070298812204958616153080716604722976256960296951889299093183379416088095323189536529677512957987101520044081457825018058425104385133680831223186160753040038771182132856411426923327440105070960271874601546071354133543964253783054427578572957912051207772513 354771700675583689488569097633266345033034292834823785723176682704096136540587857424377104859410919264303365927838937302098461729381745740962742266932049996634084571342813380437030001692639691503587914683483656386548814219223701731884065962930763473181936744247429314463543439726422938526232536731130027472637830 230943984818628219775424803943028701981262887753550449093347433635463647762108622471462562507767132209632555402602466878568574695007510860318898140196565498149897379414874244619642393298505525196971748179327488678703246568095898056962050502886150246314565883735935819566751219493409162211248339527899412213120834 244910871291180999540876131038224678232782647136061474463687643873084543167227132404515719210986376277025566516062270578690175262957119201647454438547850156698437789055774160524029594829257639261357142899164701080464003135214505418613322361259961533744317674692792378760082345835178991716760837668321047070430650]
[231102540504208683441278500770895450337994063758279044260909792393698116506583800640851716359612166617240329487078459778841086713848195408744926082983916425830805692662231680741038932462856578954369707740785537756521479763236859696269883824392264522940260726858607980820451940360570848863128174773820966893542712 265743734539653579066835004687831624350083553970235027604869801864636417556415826517642636904826103365256026528700260782452262279883815530182066276024124685278906142213910928844278925366115374824819693956067870537172894170375835301853399595095899259427582434932770426845870293172991775662360978643716901645727620 210349079405696356836538429147292337140360379103893119806144305020385537810464131226110659619069825547042724403301927985448569166987375224344116671622639914313998860456344048567428725234911738633657245695536663944656516106445205837360781053063252827728226509266208429994258965053096885963127408584682983838548084 370092127898495881883221131176739243404828188407936324478335445617644816968311072375693897341700102453800936942469264963561739173638500247105996819894999098733448347624476545606461484793983759760189221130816420100595493771321881846212596470412808302539426346257544008296437757331559126525153939418649272581792003 155843799780863429380712206517786331534603283457507603179350757031764349002066382081296339893951785831207307434330926859216544592273625218287709253187474640563451801142789872369433700787170933202626495936868489194039759368130295796694222122781856473407481019062743764408613678191642331547280835219937956830086253 208685660430718063023134818029600681694016927117366633238131132958445192019428111787150807087651421606387641544353440933789696906455720573039977965313759451536284368188362063603542263229302204204759430462874611474874693438431550965726670551232667004605117637529486443639284542463827061463666813013146069774596623 376495416003518639674417499958175701281929854694917681678531789462561603655488327795424699227219006166599077979577816057057415815525993272616746606687608525956800712326556097990469731933725132735734038748976627488163875926676975364618802603834953770499093436489566086645238136752039949240162647636828987179834579 346799239413999488110498971912233459911177299861483583332921749052093930592747061842509813134949357072475802378493682633518872240913782965807261631327544141893983294043896670884763376696794350429609524179289465879806052942382457120210869053530047151528132036231308034634997696854219478164213710400852077248821120 169705981594055626191526129703854602873762809855971515772741441032501696121273578085381028584987027704846182419400909557263824386366943105526662769950004781705890276127517431544466618726548271127228276365582823372401537605732731021620104320190337969973584939402421466369627565469352767040352557329922040477005195 314939568863760290384540118082752153809732004758279668349154520117091144948135424245524366340063324424008929024207003162245020293740471292239566910120785826581236198268357366087675220099414793533202441187685322391483201816424704819088053895597092471373867194127053233302646141670296885753306292240050902882067193 274501944416882995735758799555202391039362923348719225643877708282924068365040664503209219610043149528435249078029298305750485892232308481502453379425972726421550496575359608190796610287241500978967423412598029333421297963696957974765793580684264457336896386351474306901474091451058371162815205889658547288756613 162042852002525722516821528383186018278575449206566435454250047908141061435368036746325933601126615024491314927660133760096281320705776102244655820780663122601103393383949947351281931199892199251850719799714623843639554360811771032929325708611802494168688704327872997885604422684877382926752998081879550922673159 199186847050874310663711759065373319818497267251671468587770424206352468442476247991295451181041636866403183712299615853839562933931317404502686066913393985793556698127304344410066576991382378189507028571235204890091478641432426168888625939898268292807620365706172657484050320408998105779117927886741609753059306 354256837940358751229028023821326933124473022943665368069235748497806815006951251158634725639701700571512263598986222866058897650192202830132245087410002342397999093293483377281475490558826621520353888584868610041332064027926228150805277127860712298027363127401797551506511822135023888887056550951578462666401168 234330939937018332512234165522950453367160881291461134878469921151439507789729630447378709490321610875562768524667352209340414557186328790809853587586777294529691020063694501014064937325044229606219932489176634851086737384369314067274741216128951324322584695745812899005951037076673803633700002116900191518343104 332082029558565597759771105851214333635988265232527004414362567577413617394351558271692150498317158739732745705862594401942142069495962667568131355700265663419672348704206572928190457355848914210638948420335608466079295180163933469063321924973352389720524124550782071251683357371242157306460292201842796159597718 176986136483895554690418327829140706363382659137667608820689582879245220579777187328490743894561014022554001750978511533817549261532456394670700292294046329085693852890349308569443762100181849446497355153201880907487440309844376681147420667541370307460264411327087925505905262620386071002765983602129410981524825 306033578065708181892360605636488380307220653372422877388073952287817583833546967101487424935952427752988503478955261900401084739761751200955335173846876897288478246027251747140227411624609094450221789960283358822393959292926844401039921802250862735005064118599109755577207049891717698360790293581097903491018814 219314874918300986481829428174736339804584038904721479645481695499805419784152647017619171604955608496067000760324205776683331070846048793475354613648011507848178533546104483200182624615627611831889147775959481609079024343665913206339506497470471534463297926880205982018469713052772296925382623211807447844984467 251411658980176426424599861269457962905360409027060289781517026051694351718496780577508779445417678245301909030308343439327126522122700289297564268748528240372257642080980189466101294410540270453169210457925553360431225739589139247809993207475957612679571134629233136065652272322414452523211844945796568973495999]
[241061899028073988798790037741230393483942234086601336070745000327245876506533109773029357915901349628815872451441889563829064856413873527725718859869880048269099752637807588068089888054068969364294640041411106036524096059153691012518740485034056356062246082921852430278113420285101114711615424549249139277257522 324649731643599086115112993009519699452138031914097657036589002455757996538628271536312086027891113179012194983336641812429479724987783015151964019081755404469480800754838022457743380789954890634612176691117396518047463228921056260150822618165077435901312097677295072882034763535523532942532204433934684610043981 235254970787462219840404579655013559873788828426903153698865648656984467361490822488648895501016091744753460386479405178156171138845774327715705113786912265599410014203748341886209366676022693408156368163002599405494601590496989401198973552929276456687898371994794916975190041122391592774191440696356717294231885 425740880045791532523198846621983282509953016391567213186903868019913918759794287097305752661999887010700707627995323212438864509866508575502091321511540826163355631924563516051145246887413009375239895267200500759550085778323118221354084194236896509274319680974593889376664049241305285099994139673137299475989239 218691513540400821804549224498219066538131669904044585243726742849147890707633382757651080960290835528290337948081051248880519870334888312880595453864524810424852223683875213593288669664284711136053455521502919177926558970455107382642271908290895517253209256467433830518046957366395690737578182144983590102038485 268302619218865130271719033545009753399779053711844155079138523469992700794733191273489783510080694015540326749356237471601952640624690574647332040161941087090977941149395995577883320516589414044570632833251347023576508268184788428567463591494267298109046818940098510550915355847388894041086742208584657569920241 407336383942338740798174626239389115510448736801033328217610646742146225826124003788716755725647121531842265937484525828476656038527198785623700663154028773955096919034338929692107410713949725783634901653340966038961119651080922944892272587766538064084646021325484724541568127313549775873739584827773006445753640 393134681808112694975913596160448244240482981723630973356146031804916532236941181457510899673572218259277651984203628914738756762221755837644731654303750753476197281608744739922590010615338565608869292496306096877052448883659921270645325450515812730222672889593367986446631364900471069472193722736474834255002036 215985610462350960536839616461780541805901325846759115271248048215287698136361487020004528283989079601628886641948076104288189678081611169093333207280398109804824624795771554170650549004098320777411071055885304220606333844107189337640129908960147941269202033000097270450548214871844613318043993706884193566592242 346257259037055528063958283678684887823288869097971263870223136112022875717777736826173871208586562198755058112840232705464980999720904563887473827824133419842768406438046339340339959582840029978504197963610308123410599725432433522242213697754185538704211639401044451536292208819236994660059970571914124114271599 363246746808596148737210992794327846617357056818891810187521430179806831944113701788410216011602199287600811660665546421846554242509136889853836816039021455766143689619674758256794863013934396056281068369903404163406671974420976176790079516456790272028047801640717669827329331072466985218901215709420185800516476 228359797357492684759272370677578475406914608085297270343294942217355808434075355292324467198813215227688688362769136317178109975711230089700653102174151262564835348723399701993261280133408455332578461475024635686745323218522248731512202235490816229580164661361372292890652140155335039766689335306017058323699870 261073525188914242692884720274275113790550147800012726232648813501113485629042787747610119742164958912877580849092420435073309574603834046313181794097664949615030331077619160759088825143525257977326603290777510448929918569695246869201664075528458430758464117802684751708437328671301437881253087978552349557929227 377423095994193204578922189550375597310060100452415257679145216869152987932295320012532627260082665449818987730073474556374560322751066241641707700730565368688246016131410970218689748683166415305887428221617894893227940635682372402200646522705710629106816809097492815206152579668106759027411978172342124297112303 259137995605024246569067807228464978520111212301361385815260982586344554863475368048854803571456089002898762700215696227544178787894944543608617271366117854871387117184290022561543196044929075487901413409938350861993081883369167887211440599019001236665896078599620016292614112682026683285287944667378349567596682 377895600401386832627207473591231966722427474471978045257286932968025516883841438396371773330379400989122373108094619359580992354022500428350148393367120309907862372401833632609379756774123183371656856319067036230164053711297648196590505716602911948600987377951831975851533902097405199596765482628047101483695180 229923888278321507619955308253814201187825646322202404258155581951646311813859740021687863337140515937531198397962741508305877398164540330415865591188990653875351703558714013038074531074780496846384342682480155793583956273003471876034817892417654830968846443801102524499001760690758196360143326941316313005428764 385146020849542828762376295678872983417037260032909849077585933133727150028194380453576167080843313823221853494336578094737485648365841025909075506522610021346056261722697685735150058706447775324473174749709672319355587113103471390302308032073417731526776326495675395951587591860727897765554614275689077980788425 276479395595285600707058522756048895783507186318454062608303747878078415416637508566237782329945122675299190201507390456469318457913011040396520935462671813934491352484079874838580577796640954416628460793482556447364053471884684684531093453142733820253696024739578833329629972259929828470255438392962899864298928 304113742334779824637859934428402926505401880740389378433569048603311596599826036448865299394425292925430829973661203201761633383418875016143497844450341141334585646363757368824123351511948673572982552037453552797655001298458947196811495751443435574229011561264850603574487599877204387001096835704274170180520128]

看到key_genenc部分容易联想到Paillier cryptosystem
在这里插入图片描述
再看handle函数部分
前面用于验证用户的部分可以用哈希碰撞解决
Step1给出公钥n和g
Step2加密一个输入的数,输出密文
Step3输入两个数,分别加密,但只输出其中一个
Step4解密一个输入的数
Step5猜Step3中输出的是哪个数的密文
猜对32次得到flag
在这里插入图片描述
从这里可以发现,cipher1对应偶数位的key,cipher2对应奇数位的key,所以问题的关键在于还原key
但是尽管知道了key的前四位,用题目给的hint和key的生成代码怎么都无法还原key
由于Paillier cryptosystem还有如下性质:
在这里插入图片描述
m 1 = p l a i n t e x t 1 ∗ p l a i n t e x t 2 ∗ K E Y m_1 = plaintext1 * plaintext2 * KEY m1=plaintext1plaintext2KEY m 2 = ( p l a i n t e x t 1 ∗ p l a i n t e x t 2 ) − 1   m o d   n m_2 = (plaintext1 * plaintext2)^{-1}\space mod\space n m2=(plaintext1plaintext2)1 mod n,就可以利用Step4解密 E ( m 1 , r 1 ) m 2   m o d   n 2 E(m_1, r_1)^{m_2}\space mod\space n^2 E(m1,r1)m2 mod n2,得到 D ( E ( m 1 , r 1 ) m 2   m o d   n 2 ) ≡ m 1 m 2   m o d   n ≡ K E Y   m o d   n D(E(m_1, r_1)^{m_2}\space mod\space n^2) \equiv m_1m_2\space mod\space n \equiv KEY\space mod\space n D(E(m1,r1)m2 mod n2)m1m2 mod nKEY mod n,求出KEY[R]或KEY[R+1],
再利用Step5验证求出的是奇数位还是偶数位
重复直到还原key
代码如下:

from pwn import *
from Crypto.Util.number import *
import hashlib
from math import gcd
import random

host = "47.104.85.225"
port = 57811

String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz"

key1 = {241, 647}
key2 = {119, 718}


def enc(n, g, m):
    while 1:
        r = random.randint(2, n - 1)
        if gcd(r, n) == 1:
            break
    c = (pow(g, m, n ** 2) * pow(r, n, n ** 2)) % (n ** 2)
    return c


def login(tn):
    s = tn.recvline().decode().strip()
    end = s[10:22]
    hash = s[27:]
    for i1 in range(len(String)):
        for i2 in range(len(String)):
            for i3 in range(len(String)):
                for i4 in range(len(String)):
                    t = String[i1] + String[i2] + String[i3] + String[i4]
                    HASH = hashlib.sha256((t + end).encode()).hexdigest()
                    if HASH == hash:
                        result = t
                        print(t)
    tn.sendline(result.encode())


def judge(tn):
    tn.recvuntil(b"This is my public key.")
    print("Step 1")
    tn.recvuntil(b"n = ")
    n = int(tn.recvline().strip().decode())
    tn.recvuntilb("g = ")
    g = n + 1
    tn.recvuntil(b"Please give me one decimal ciphertext.\n")
    print("Step 2")
    tn.sendline(str(g).encode())
    tn.sendlineafter(b"Give me m0.", b"5")
    tn.sendlineafter(b"Give me m1.", b"6")
    print("Step 3")
    tn.recvuntil(b"This is a ciphertext.\n")
    c = int(tn.recvline().decode().strip())
    inv = inverse(30, n)
    key = pow(c, inv, n ** 2)
    tn.sendlineafter(b"Please give me one decimal ciphertext \n", str(key).encode())
    print("Step 4")
    tn.recvuntil(b"This is the corresponding plaintext.\n")
    result = int(tn.recvline().decode().strip())
    assert 100 <= result < 1000
    choice = b"0"
    if result in key2:
        choice = b"0"
    elif result in key1:
        choice = b"1"
    elif len(key2) == 40:
        choice = b"1"
    tn.sendlineafter(b"0 or 1(m0 -> c0 , m1 -> c1)?\n", choice)
    print("Step 5")
    ans = tn.recvline()
    if choice == b"0":
        if b"Good!" in ans:
            key2.add(result)
            return True
        else:
            key1.add(result)
            return False
    else:
        return True


def collect():
    while len(key1) < 40 and len(key2) < 40:
        tn = remote(host, port)
        login(tn)
        for _ in range(32):
            print("round" + str(_ + 1))
            if judge(tn):
                if _ == 31:
                    tn.interactive()
                    return key1, key2
                else:
                    continue
            else:
                tn.close()
                break
        print(key1, key2)
    print(key1, key2)
    return key1, key2


def finish():
    tn = remote(host, port)
    login(tn)
    for _ in range(32):
        print("round" + str(_ + 1))
        judge(tn)
    tn.interactive()


collect()
finish()
# {128, 129, 641, 646, 647, 780, 653, 526, 396, 918, 281, 158, 286, 542, 548, 936, 810, 430, 944, 309, 186, 201, 333, 461, 977, 727, 216, 860, 613, 232, 745, 877, 237, 241, 113, 244, 888, 121, 123}
# {130, 899, 903, 521, 142, 783, 271, 530, 148, 288, 550, 939, 427, 685, 942, 558, 299, 307, 566, 184, 313, 577, 585, 718, 983, 349, 995, 355, 614, 746, 498, 114, 885, 119, 637, 639}

结果为:
在这里插入图片描述

结语

希望继续坚持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值