MoeCTF 2023 CRYPTO 部分wp

MoeCTF 2023 CRYPTO 部分wp

  • 前言
    • MoeCTF 2023 CRYPTO方向的部分赛题
  • 0x01、baby_e
    • 知识点:低加密指数攻击
  • 0x02、bad_E
    • 知识点: e和phi不互素
  • 0x03: bad_random
    • 知识点:线性同余算法生成伪随机数
  • 0x04.|p-q|
    • 知识点:p和q很接近直接爆破
  • 0x05.minipack
    • 知识点:背包密码,贪心算法
  • 总结


前言

作者通过写文章记录自己的CTF经历,有不对的地方还请各位师傅斧正

MoeCTF 2023 CRYPTO方向的部分赛题

0x01、baby_e

知识点:低加密指数攻击

低加密指数攻击原理:简单来说:密文等于明文的e次方%n 当e很小的时候 明文的e次方小于n
可以构造函数让明文等于密文的e次方根
也就是说 c=m^e%n 当m^e

题目给了一个py文件,源码如下(因为代码很短,所以直接在代码里面分析了):

from Crypto.Util.number import getPrime,bytes_to_long

p,q = getPrime(2048),getPrime(2048)
#p,q是2048位的素数
e = 7
#e很小,猜测是低加密指数攻击
n = p*q
m = bytes_to_long(open('flag.txt','rb').read().strip())
c = pow(m,e,n)
#pow函数,意思是 m的e次方%n,构造密文
print("c = ",c)
print("n = ",n)

# c =  147693154873835354725007152781732424355869776162377337823960431913672366269917723916891506269449726723757821517328874729037838600793748824028829185409932536014732765063216715033843955453706710187792772702199448156372644163429786386035008302836467605094954587157232829525150652611067567669525072625329634860065850520051628272535479197120008981979404760445193750864902244921407742155742716289495581989134730376783828846663464819337418977287363028738701414486788851136608957124505485242331701209645216580641917007780811842757125048746184068597664780265422321550909392419865169775282217442331295071069272774722564587602419768461231775480847018941840911357926330143045826277813722919121117172763493242590521245640828462665947672485094793188432098216701511715232654611338293295459889814699850788048985878279440740712956248569068077253790198036918598519191892836075254345518967666166925163908185663991353344555402397055977817370082929420443034626201745027965444069777059760865359310439815816749939498993014457995041394803598825093836045546578310632172636478575946653375857640993393714607308326474003446154152048840071034349831168612740218034679021240949747357214453636633636662650940968576792518622437627529244515229173
# n =  553409369582823237678532685244026647155180191225879439432235077135813123637186465008813830373646133388592395760175777499266561095087891764348044063111935877931069321764391883899483374576303169645488542398590564148654412004383012178107972880058460460806768779452529433458826925606225797078653905380530651390617109384086518728626571028089036812787671647095695947167204428442727185744172445701874820612799168887428075695751162763647868386879374037826876671079326544820609721731078985096813307183878793033824330869698508952853770794414757655681370862323768018291030331209143189638496644361618184164228294031490537429556439588954274708598530042700988138862000054458742762198052079867259365645914383561162796796952346445529346145323567650621600171442575319262718389389870407629339714751583360252884338116164466349449862781112019462555743429653595045695696967783338371470032332852204294900011651434678829104876529439166176589508898757122660322523937330848536715937381297551894198974459004139082562228022412335520195652419375915216074658463954339332593244483927157329404652516225481116614815221154229491846087288087715884363786672244655901308480290011237244562251084095684531716327141154558809471185132979704992609461470501119328696999713829

不用怀疑,e这么小肯定是低加密指数攻击

直接上脚本

import gmpy2

e = 7
n = 553409369582823237678532685244026647155180191225879439432235077135813123637186465008813830373646133388592395760175777499266561095087891764348044063111935877931069321764391883899483374576303169645488542398590564148654412004383012178107972880058460460806768779452529433458826925606225797078653905380530651390617109384086518728626571028089036812787671647095695947167204428442727185744172445701874820612799168887428075695751162763647868386879374037826876671079326544820609721731078985096813307183878793033824330869698508952853770794414757655681370862323768018291030331209143189638496644361618184164228294031490537429556439588954274708598530042700988138862000054458742762198052079867259365645914383561162796796952346445529346145323567650621600171442575319262718389389870407629339714751583360252884338116164466349449862781112019462555743429653595045695696967783338371470032332852204294900011651434678829104876529439166176589508898757122660322523937330848536715937381297551894198974459004139082562228022412335520195652419375915216074658463954339332593244483927157329404652516225481116614815221154229491846087288087715884363786672244655901308480290011237244562251084095684531716327141154558809471185132979704992609461470501119328696999713829
c = 147693154873835354725007152781732424355869776162377337823960431913672366269917723916891506269449726723757821517328874729037838600793748824028829185409932536014732765063216715033843955453706710187792772702199448156372644163429786386035008302836467605094954587157232829525150652611067567669525072625329634860065850520051628272535479197120008981979404760445193750864902244921407742155742716289495581989134730376783828846663464819337418977287363028738701414486788851136608957124505485242331701209645216580641917007780811842757125048746184068597664780265422321550909392419865169775282217442331295071069272774722564587602419768461231775480847018941840911357926330143045826277813722919121117172763493242590521245640828462665947672485094793188432098216701511715232654611338293295459889814699850788048985878279440740712956248569068077253790198036918598519191892836075254345518967666166925163908185663991353344555402397055977817370082929420443034626201745027965444069777059760865359310439815816749939498993014457995041394803598825093836045546578310632172636478575946653375857640993393714607308326474003446154152048840071034349831168612740218034679021240949747357214453636633636662650940968576792518622437627529244515229173

k = 0
while True:
    res = gmpy2.iroot(c + k * n, e)
    #gmpy2.iroot 函数用于计算整数的 e 次方根,返回一个元组,第一个元素是方根的整数部分(就是明文),第二个元素是一个布尔值,表示是否存在精确的 e 次方根
    if res[1] == True:
        print(bytes.fromhex(hex(res[0])[2:]))
        #明文转化为16进制,把前面的0x去掉然后转化成字符
        break

这里可能会有人有疑问为什么不直接给c开e次方根,然后看是否有返回结果。
因为在 RSA 算法中,加密公式为 c=m^e%n,其中 m是明文,e是公钥指数,n是模数,c是密文。这意味着c肯定是能被n整除的,也就是存在一个整数k,使得 c=m^e+k∗n。

运行结果:b'moectf{SMaLL_3xPon3nt_Mak3_rSa_w3ak!_!lP0iYlJf!M3rux9G9Vf!JoxiMl903lllA}'

0x02、bad_E

知识点: e和phi不互素

在RSA加解密算法中
1.随机选取两个大素数p和q ,计算n = p*q
2.计算欧拉函数φ(n) = (p-1)(q-1)
3.选取一个与欧拉函数互素的e作为公钥指数
4.计算 e 模 φ(n)的乘法逆元 d,即满足 e * d ≡ 1 (mod φ(n)) 的整数 d
加密过程:c = m^e mod n,其中 m 是明文,c 是密文。
解密过程:m = c^d mod n。

这里我们直接测试,结果很明显就是e与n(欧拉函数不互素)

import libnum
from Crypto.Util.number import long_to_bytes, bytes_to_long

e = 65537
p = 6853495238262155391975011057929314523706159020478084061020122347902601182448091015650787022962180599741651597328364289413042032923330906135304995252477571
q = 11727544912613560398705401423145382428897876620077115390278679983274961030035884083100580422155496261311510530671232666801444557695190734596546855494472819
c = 63388263723813143290256836284084914544524440253054612802424934400854921660916379284754467427040180660945667733359330988361620691457570947823206385692232584893511398038141442606303536260023122774682805630913037113541880875125504376791939861734613177272270414287306054553288162010873808058776206524782351475805
# 正确计算 (p - 1) 和 (q - 1) 的乘积
n = (p - 1) * (q - 1)

try:
    # 计算 e 模 n 的乘法逆元
    d = libnum.invmod(e, n)
    # 进行解密操作
    m = pow(c, d, p * q)
    # 将解密结果转换为字节串
    flag = long_to_bytes(m)
    print(m)
    print(flag)  # 转字节
except ValueError:
    print("无法计算 e 模 n 的乘法逆元,因为e 和 n 不互素。")


#无法计算 e 模 n 的乘法逆元,因为e 和 n 不互素。

解题思路:现在就是要找一个数字让它和e互素,因为q-1和e互素,所以我们把(p-1)*(q-1) 变成 q-1

脚本:

from Crypto.Util.number import *
import libnum

p = 6853495238262155391975011057929314523706159020478084061020122347902601182448091015650787022962180599741651597328364289413042032923330906135304995252477571
q = 11727544912613560398705401423145382428897876620077115390278679983274961030035884083100580422155496261311510530671232666801444557695190734596546855494472819
c = 63388263723813143290256836284084914544524440253054612802424934400854921660916379284754467427040180660945667733359330988361620691457570947823206385692232584893511398038141442606303536260023122774682805630913037113541880875125504376791939861734613177272270414287306054553288162010873808058776206524782351475805
e = 65537
n = q-1
d = libnum.invmod(e, n)
m = pow(c, d, q)
#这里注意当(p-1)(q-1)的时候  
#m = c^d % n  n=q
print(long_to_bytes(m))

# b'moectf{N0w_Y0U_hAve_kN0w_h0w_rsA_w0rks!_f!lP0iYlJf!M3ru}'

0x03: bad_random

知识点:线性同余算法生成伪随机数

因为本人上大学上密码学也刚好学到这个生成随机数的算法,只要是通过数学公式生成的随机数,都不是真随机数,而是伪随机数,而本题用到的线性同余算法是目前为止使用最广泛的随机数生产技术

本题需要用到一些数论的知识,因为大学不教这玩意,所以都是作者自己学的,有不对的地方还请各位谅解
拿到题目先看源代码

import random

with open("flag.txt", "r") as f:
    flag = f.read().strip()


class LCG:
    def set_params(self):
        self.m = random.randint(10000, 20000)
        #模位于10000到20000之间
        self.a = random.randint(10000, 20000)
        #乘数位于10000到20000之间
        self.c = random.randint(1, self.a-1)
        #增量位于1到self.a-1之间
        self.x = random.randint(0, self.m-1)
        #初始种子值位于0到self.m-1之间
    def get_all_output(self):
        x0 = self.x
        #x0是初始种子值
        s = set()
        #创建一个元组
        while (t := self()) not in s:
            s.add(t)
            #这里的 self() 调用了 LCG 类的实例作为可调用对象(假设类中定义了 __call__ 方法,使得实例可以像函数一样被调用,从而生成下一个随机数)
            #意思就是生成的随机数如果不在s元组,就把它加进去
        self.x = x0
        
        return s
        #返回集合 s,其中包含了 LCG 在产生循环之前所生成的所有不同输出值
    def __init__(self):
        self.set_params()
        while len(self.get_all_output()) < 10:
            self.set_params()
       #生成的随机数要大于10个的意思
    def __call__(self):
        self.x = (self.a * self.x + self.c) % self.m
        return self.x
     
from typing import Callable

def chall(input:Callable[[str],None], print:Callable[[str],None]):
    from hashlib import md5
    from string import ascii_letters
    s = "".join(random.choices(ascii_letters, k=16))
    #随机生成一个长度为16的字符串
    h = md5(s.encode()).hexdigest()
    #md5加密
    print(f" md5(XXXXXXXX+{s[8:]}) == {h}")
    #h = md5(XXXXXXXX+S的后面8位)
    i = input("Give me XXXXXXXX: ")
    if md5((i + s[8:]).encode()).hexdigest() != h:
        print(" ACCESS DENIED ")
        return
    inst = LCG()
    print("Let's play a simple game! If you can guess the right number, I will give your the flag! You have 10 tries")
    for tries in range(10):
        i = input(f"Give me a number, you have failed for {tries} times: ")
        if int(i) == (right := inst()):
            print(f"Congurations! You win the game! Your flag is here: {flag}")
        else:
            print(f"Oh, you are wrong! The right number is {right}")
     #猜随机数

源码大概的意思就是用LCG(线性同余算法)生成了十个以上的随机数,然后题目的意思就是让我们猜,猜对了就有flag

这里参考了官方大大wp的脚本

https://github.com/XDSEC/MoeCTF_2023/blob/main/WriteUps/Orac1e/Crypto_Writeup.md
from pwn import *
from hashlib import md5
from Crypto.Util.number import *
from string import ascii_letters
import random

HOST, PORT = '127.0.0.1', 39301
sh = remote('127.0.0.1', 39301)

table = string.ascii_letters


def proof_of_work(s, tsha):
    for i in table:
        for j in table:
            for k in table:
                for l in table:
                    proof = i + j + k + l + s
                    if (md5(proof.encode()).hexdigest() == tsha):
                        sh.sendline((i + j + k + l).encode())
                        return
#暴力破解前四位字符加上服务器给的固定s,如果组合字符串md5加密后的数据能和服务器给定的md5值相等,的就返回字符串给服务器

pres = sh.recvuntil(b'md5(XXXX+', drop=True)
s = sh.recvuntil(b') == ', drop=True).decode()
#接收服务器给的字符串s,这个要转换成字节,因为服务器只接收字节
print(s)
tsha = sh.recvuntil(b'\n', drop=True).decode()
#接收服务器给定的md5值
print(tsha)
proof_of_work(s, tsha)

S = []

for _ in range(8):
    guess = str(random.randint(0, 20000))
    sh.sendline(guess)
    #给服务器发送8次猜测的数据
    clean = sh.recvuntil(b'is ', drop=True)
    response = sh.recvuntil(b'\n', drop=True)
    #接收返回的数据
    S.append(int(response))
    #返回数据添加到列表里面,方便后续破解模数m1
    print(S)

T1 = S[1] - S[0]
T2 = S[3] - S[2]
T3 = S[5] - S[4]
T4 = S[7] - S[6]
A1 = T1 * T3 - T2 ** 2
A2 = T2 * T4 - T3 ** 2
m1 = GCD(A1, A2)
#取模,原理在下面
a = ((S[2] - S[1]) * inverse((S[1] - S[0]), m1)) % m1
b = (S[1] - a * S[0]) % m1
#算a和b
assert ((a * S[6] + b) % m1) == S[7]
#验证参数是否正确
sh.sendline(str((a * S[7] + b) % m1))
#发送正确数据给服务器
sh.interactive()

这里作者本人也是似懂非懂,但是起码理解了模数m是可以试出来的
原理我直接手写了
MoeCTF 2023 CRYPTO 部分wp_第1张图片
T1 = S[1] - S[0]
T2 = S[3] - S[2]
T3 = S[5] - S[4]
T4 = S[7] - S[6]
A1 = T1 * T3 - T2 ** 2
A2 = T2 * T4 - T3 ** 2
m1 = GCD(A1, A2)

根据最大公约数的性质,如果有多个数 m1​,m2​,⋯,mn​ 都是 m 的倍数,那么它们的最大公约数 gcd(m1​,m2​,⋯,mn​) 大概率是 m 本身。这是因为不同的 mi​ 虽然是 m 乘以不同的整数 ki​ 得到的,但在没有其他额外公因数的情况下,它们的最大公约数就是 m
这就是为什么说m是可以被试出来的

You win the game! Your flag is here: moectf{u5e_5ingle_lcg_a5_a_RanDoM_nuMbeR_geneRaToR_i5_noT_a_gooD_iDea!_}

0x04.|p-q|

知识点:p和q很接近直接爆破

源码:大概的意思就是q是p的下一个素数,所以p和q是很接近的,这也是为什么题目叫|p-q|

with open("flag.txt","rb") as fs:
    flag = fs.read().strip()
assert len(flag) == 72

m = int.from_bytes(flag,"big")

from Crypto.Util.number import getPrime, isPrime

def next_prime(p):
    while True:
        p += 2
        if isPrime(p):
            return p

p = getPrime(2048)
q = next_prime(p)
n = p * q
e = 65537
c = pow(m,e,n)
print("n =",n)
print("c =",c)

# n = 329960318345010350458589325571454799968957932130539403944044204698872359769449414256378111233592533561892402020955736786563103586897940757198920737583107357264433730515123570697570757034221232010688796344257587359198400915567115397034901247038275403825404094129637119512164953012131445747740645183682571690806238508035172474685818036517880994658466362305677430221344381425792427288500814551334928982040579744048907401043058567486871621293983772331951723963911377839286050368715384227640638031857101612517441295926821712605955984000617738833973829140899288164786111118033301974794123637285172303688427806450817155786233788027512244397952849209700013205803489334055814513866650854230478124920442832221946442593769555237909177172933634236392800414176981780444770542047378630756636857018730168151824307814244094763132088236333995807013617801783919113541391133267230410179444855465611792191833319172887852945902960736744468250550722314565805440432977225703650102517531531476188269635151281661081058374242768608270563131619806585194608795817118466680430500830137335634289617464844004904410907221482919453859885955054140320857757297655475489972268282336250384384926216818756762307686391740965586168590784252524275489515352125321398406426217
# c = 307746143297103281117512771170735061509547958991947416701685589829711285274762039205145422734327595082350457374530975854337055433998982493020603245187129916580627539476324521854057990929173492940833073106540441902619425074887573232779899379436737429823569006431370954961865581168635086246592539153824456681688944066925973182272443586463636373955966146029489121226571408532284480270826510961605206483011204059402338926815599691009406841471142048842308786000059979977645988396524814553253493672729395573658564825709547262230219183672493306100392069182994445509803952976016630731417479238769736432223194249245020320183199001774879893442186017555682902409661647546547835345461056900610391514595370600575845979413984555709077635397717741521573798309855584473259503981955303774208127361309229536010653615696850725905168242705387575720694946072789441481191449772933265705810128547553027708513478130258801233619669699177901566688737559102165508239876805822898509541232565766265491283807922473440397456701500524925191214292669986798631732639221198138026031561329502985577205314190565609214349344303324429408234237832110076900414483795318189628198913032900272406887003325858236057373096880675754802725017537119549989304878960436575670784578550

做题思路:因为n = p*q 当p和q非常接近的时候, n近似于p的平方或者q的平方,这时我们就可以取n的平方根,在一定的范围内进行爆破即可得到p或者q的值

脚本

from Crypto.Util.number import *
from math import *
import gmpy2
import libnum
from Crypto.Util.number import long_to_bytes, bytes_to_long
n = 329960318345010350458589325571454799968957932130539403944044204698872359769449414256378111233592533561892402020955736786563103586897940757198920737583107357264433730515123570697570757034221232010688796344257587359198400915567115397034901247038275403825404094129637119512164953012131445747740645183682571690806238508035172474685818036517880994658466362305677430221344381425792427288500814551334928982040579744048907401043058567486871621293983772331951723963911377839286050368715384227640638031857101612517441295926821712605955984000617738833973829140899288164786111118033301974794123637285172303688427806450817155786233788027512244397952849209700013205803489334055814513866650854230478124920442832221946442593769555237909177172933634236392800414176981780444770542047378630756636857018730168151824307814244094763132088236333995807013617801783919113541391133267230410179444855465611792191833319172887852945902960736744468250550722314565805440432977225703650102517531531476188269635151281661081058374242768608270563131619806585194608795817118466680430500830137335634289617464844004904410907221482919453859885955054140320857757297655475489972268282336250384384926216818756762307686391740965586168590784252524275489515352125321398406426217
result = gmpy2.iroot(n, 2)[0]
for i in range(result-10000, result+10000):
    if GCD(i,n) > 1:
        if isPrime(i):
            p = i
            q = n//p
            break

print(p)
print(q)
p = 18164809890142267890219276206773099235072154806950582020347085518282960761937147879570277730919110196557742226232054602784278585009762036923951358612733074768279344311938292845187804144458991947979616574535662033512236959010688698879953460760771547964758688700129994322153904156260452550830932232536673055480604083903327472696393017478985867846428177588049472509968031143243583420309569129756696755744088888618703553769561648077215188783123207031628505020478500655602448720006243614258852026797076054766680755124052134730998085155245587457870148748357237005392662882609410088994421984160941612734270140092780661012811
q = 18164809890142267890219276206773099235072154806950582020347085518282960761937147879570277730919110196557742226232054602784278585009762036923951358612733074768279344311938292845187804144458991947979616574535662033512236959010688698879953460760771547964758688700129994322153904156260452550830932232536673055480604083903327472696393017478985867846428177588049472509968031143243583420309569129756696755744088888618703553769561648077215188783123207031628505020478500655602448720006243614258852026797076054766680755124052134730998085155245587457870148748357237005392662882609410088994421984160941612734270140092780661013147
e = 65537
c = 307746143297103281117512771170735061509547958991947416701685589829711285274762039205145422734327595082350457374530975854337055433998982493020603245187129916580627539476324521854057990929173492940833073106540441902619425074887573232779899379436737429823569006431370954961865581168635086246592539153824456681688944066925973182272443586463636373955966146029489121226571408532284480270826510961605206483011204059402338926815599691009406841471142048842308786000059979977645988396524814553253493672729395573658564825709547262230219183672493306100392069182994445509803952976016630731417479238769736432223194249245020320183199001774879893442186017555682902409661647546547835345461056900610391514595370600575845979413984555709077635397717741521573798309855584473259503981955303774208127361309229536010653615696850725905168242705387575720694946072789441481191449772933265705810128547553027708513478130258801233619669699177901566688737559102165508239876805822898509541232565766265491283807922473440397456701500524925191214292669986798631732639221198138026031561329502985577205314190565609214349344303324429408234237832110076900414483795318189628198913032900272406887003325858236057373096880675754802725017537119549989304878960436575670784578550
n = 329960318345010350458589325571454799968957932130539403944044204698872359769449414256378111233592533561892402020955736786563103586897940757198920737583107357264433730515123570697570757034221232010688796344257587359198400915567115397034901247038275403825404094129637119512164953012131445747740645183682571690806238508035172474685818036517880994658466362305677430221344381425792427288500814551334928982040579744048907401043058567486871621293983772331951723963911377839286050368715384227640638031857101612517441295926821712605955984000617738833973829140899288164786111118033301974794123637285172303688427806450817155786233788027512244397952849209700013205803489334055814513866650854230478124920442832221946442593769555237909177172933634236392800414176981780444770542047378630756636857018730168151824307814244094763132088236333995807013617801783919113541391133267230410179444855465611792191833319172887852945902960736744468250550722314565805440432977225703650102517531531476188269635151281661081058374242768608270563131619806585194608795817118466680430500830137335634289617464844004904410907221482919453859885955054140320857757297655475489972268282336250384384926216818756762307686391740965586168590784252524275489515352125321398406426217
# 计算 e 模 n 的乘法逆元
d = libnum.invmod(e, (p-1)*(q-1))
# 进行解密操作
m = gmpy2.powmod(c, d, n)
# 将解密结果转换为字节串
flag = long_to_bytes(m)
print(m)
print(flag)

flag

moectf{it_iS_vUlnErablE_iF_p_iS_aboUt_thE_SaME_SiZE_aS_Q_MVoAYArrlG3uco}

0x05.minipack

知识点:背包密码,贪心算法

背包密码最大的特点就是它的新密钥是前面所有密钥的和加上一个随机数,这也是它的突破口

源码如下:

import random

with open("flag.txt", "rb") as fs:
    flag = fs.read().strip()

assert len(flag) == 72
m = int.from_bytes(b"\xff" + flag + b"\xff", "big")


def long2bits(long):
    bits = []
    while long > 0:
        bits.append(long & 1)
        long >>= 1
    return list(reversed(bits))
#把密文转化为二进制

def genkey(len):
    sum = 0
    out = []
    for i in range(len):
        delta = random.randint(1, 10000)
        x = sum + delta
        out.append(x)
        sum += x
    return out
#生成密钥,密钥是逐渐递增的

key = genkey(74 * 8)
#生成密钥列表
with open("key.txt", "w") as fs:
    fs.write(str(key))


def encrypt(m, keys):
    data = long2bits(m)
    assert len(data) == len(keys)
    return sum((k if (p == 1) else 1) for p, k in zip(data, keys))
#意思就是密钥和二进制密文一一对应,当二进制是1的时候把密钥加上,当二进制是0的时候,加1

with open("ciphertext.txt", "w") as fs:
    fs.write(str(encrypt(m, key)))

大致的意思就是密钥和二进制密文一一对应,当二进制是1的时候把密钥加上,当二进制是0的时候,加1
这里我们只要把二进制密文给恢复出来就可以得到flag了

算法的思路就是对比密文的大小和key的大小(从最后一个开始key开始对比),如果密文大于密钥,那么该位置的二进制就是1,反之就是0,这里很有趣的一个点就是,当密文大于该处密钥时,该处明文位置的密钥肯定没有加上去,所以明文的该位置的二进制绝对为0,因为新密钥是前面所有密钥的累加和,但是密文只是其中的一部分密钥的累加和。

脚本如下:

from Crypto.Util.number import*
key = [2693, 3129, 9373, 22156, 43583, 89183, 174151, 347012, 698545, 1395575, 2786872, 5578597, 11154664, 22307983, 44615460, 89235177, 178469017, 356933794, 713870726, 1427747231, 2855491182, 5710979547, 11421958953, 22843921686, 45687844709, 91375686927, 182751371083, 365502739098, 731005483915, 1462010966805, 2924021937796, 5848043870163, 11696087737035, 23392175483728, 46784350967037, 93568701933588, 187137403860696, 374274807720402, 748549615439655, 1497099230888814, 2994198461769632, 5988396923541849, 11976793847087165, 23953587694168619, 47907175388342433, 95814350776684858, 191628701553372159, 383257403106741479, 766514806213475941, 1533029612426953830, 3066059224853913754, 6132118449707825722, 12264236899415648612, 24528473798831299848, 49056947597662597793, 98113895195325191857, 196227790390650390734, 392455580781300780322, 784911161562601561708, 1569822323125203118275, 3139644646250406237314, 6279289292500812473474, 12558578585001624946984, 25117157170003249898713, 50234314340006499792208, 100468628680012999584251, 200937257360025999176988, 401874514720051998349258, 803749029440103996702992, 1607498058880207993405766, 3214996117760415986803588, 6429992235520831973615515, 12859984471041663947228283, 25719968942083327894453929, 51439937884166655788909694, 102879875768333311577817496, 205759751536666623155637628, 411519503073333246311276262, 823039006146666492622547720, 1646078012293332985245100339, 3292156024586665970490196441, 6584312049173331940980390030, 13168624098346663881960779914, 26337248196693327763921564405, 52674496393386655527843129573, 105348992786773311055686261694, 210697985573546622111372516705, 421395971147093244222745038995, 842791942294186488445490075794, 1685583884588372976890980151520, 3371167769176745953781960304028, 6742335538353491907563920611092, 13484671076706983815127841218048, 26969342153413967630255682438466, 53938684306827935260511364872362, 107877368613655870521022729741837, 215754737227311741042045459490735, 431509474454623482084090918981645, 863018948909246964168181837960572, 1726037897818493928336363675917488, 3452075795636987856672727351835314, 6904151591273975713345454703676815, 13808303182547951426690909407355281, 27616606365095902853381818814710732, 55233212730191805706763637629413375, 110466425460383611413527275258828829, 220932850920767222827054550517654934, 441865701841534445654109101035312314, 883731403683068891308218202070622791, 1767462807366137782616436404141247421, 3534925614732275565232872808282498036, 7069851229464551130465745616564994086, 14139702458929102260931491233129993376, 28279404917858204521862982466259977875, 56558809835716409043725964932519963476, 113117619671432818087451929865039927736, 226235239342865636174903859730079848937, 452470478685731272349807719460159701253, 904940957371462544699615438920319404132, 1809881914742925089399230877840638803648, 3619763829485850178798461755681277608906, 7239527658971700357596923511362555216384, 14479055317943400715193847022725110437269, 28958110635886801430387694045450220873388, 57916221271773602860775388090900441743961, 115832442543547205721550776181800883493491, 231664885087094411443101552363601766978092, 463329770174188822886203104727203533959016, 926659540348377645772406209454407067922681, 1853319080696755291544812418908814135842029, 3706638161393510583089624837817628271683504, 7413276322787021166179249675635256543371108, 14826552645574042332358499351270513086737138, 29653105291148084664716998702541026173480549, 59306210582296169329433997405082052346955789, 118612421164592338658867994810164104693913670, 237224842329184677317735989620328209387829648, 474449684658369354635471979240656418775658476, 948899369316738709270943958481312837551313872, 1897798738633477418541887916962625675102629783, 3795597477266954837083775833925251350205258624, 7591194954533909674167551667850502700410512494, 15182389909067819348335103335701005400821027999, 30364779818135638696670206671402010801642054271, 60729559636271277393340413342804021603284112312, 121459119272542554786680826685608043206568225773, 242918238545085109573361653371216086413136448746, 485836477090170219146723306742432172826272896217, 971672954180340438293446613484864345652545794822, 1943345908360680876586893226969728691305091589413, 3886691816721361753173786453939457382610183182718, 7773383633442723506347572907878914765220366364454, 15546767266885447012695145815757829530440732727695, 31093534533770894025390291631515659060881465457658, 62187069067541788050780583263031318121762930907479, 124374138135083576101561166526062636243525861817119, 248748276270167152203122333052125272487051723631106, 497496552540334304406244666104250544974103447264240, 994993105080668608812489332208501089948206894526529, 1989986210161337217624978664417002179896413789059484, 3979972420322674435249957328834004359792827578113448, 7959944840645348870499914657668008719585655156233199, 15919889681290697740999829315336017439171310312463356, 31839779362581395481999658630672034878342620624925288, 63679558725162790963999317261344069756685241249850642, 127359117450325581927998634522688139513370482499705859, 254718234900651163855997269045376279026740964999409899, 509436469801302327711994538090752558053481929998814281, 1018872939602604655423989076181505116106963859997634021, 2037745879205209310847978152363010232213927719995270188, 4075491758410418621695956304726020464427855439990536271, 8150983516820837243391912609452040928855710879981077319, 16301967033641674486783825218904081857711421759962149484, 32603934067283348973567650437808163715422843519924301349, 65207868134566697947135300875616327430845687039848598133, 130415736269133395894270601751232654861691374079697202189, 260831472538266791788541203502465309723382748159394400978, 521662945076533583577082407004930619446765496318788800585, 1043325890153067167154164814009861238893530992637577604691, 2086651780306134334308329628019722477787061985275155204363, 4173303560612268668616659256039444955574123970550310413912, 8346607121224537337233318512078889911148247941100620827531, 16693214242449074674466637024157779822296495882201241654976, 33386428484898149348933274048315559644592991764402483304443, 66772856969796298697866548096631119289185983528804966608947, 133545713939592597395733096193262238578371967057609933226768, 267091427879185194791466192386524477156743934115219866451703, 534182855758370389582932384773048954313487868230439732899048, 1068365711516740779165864769546097908626975736460879465805158, 2136731423033481558331729539092195817253951472921758931605964, 4273462846066963116663459078184391634507902945843517863213090, 8546925692133926233326918156368783269015805891687035726427407, 17093851384267852466653836312737566538031611783374071452855743, 34187702768535704933307672625475133076063223566748142905706417, 68375405537071409866615345250950266152126447133496285811413942, 136750811074142819733230690501900532304252894266992571622830668, 273501622148285639466461381003801064608505788533985143245654171, 547003244296571278932922762007602129217011577067970286491314833, 1094006488593142557865845524015204258434023154135940572982630461, 2188012977186285115731691048030408516868046308271881145965260169, 4376025954372570231463382096060817033736092616543762291930513447, 8752051908745140462926764192121634067472185233087524583861032396, 17504103817490280925853528384243268134944370466175049167722066549, 35008207634980561851707056768486536269888740932350098335444133297, 70016415269961123703414113536973072539777481864700196670888268459, 140032830539922247406828227073946145079554963729400393341776529399, 280065661079844494813656454147892290159109927458800786683553060795, 560131322159688989627312908295784580318219854917601573367106122530, 1120262644319377979254625816591569160636439709835203146734212242212, 2240525288638755958509251633183138321272879419670406293468424484709, 4481050577277511917018503266366276642545758839340812586936848968648, 8962101154555023834037006532732553285091517678681625173873697942182, 17924202309110047668074013065465106570183035357363250347747395878509, 35848404618220095336148026130930213140366070714726500695494791759952, 71696809236440190672296052261860426280732141429453001390989583522712, 143393618472880381344592104523720852561464282858906002781979167044412, 286787236945760762689184209047441705122928565717812005563958334090260, 573574473891521525378368418094883410245857131435624011127916668182358, 1147148947783043050756736836189766820491714262871248022255833336361781, 2294297895566086101513473672379533640983428525742496044511666672726088, 4588595791132172203026947344759067281966857051484992089023333345451208, 9177191582264344406053894689518134563933714102969984178046666690898273, 18354383164528688812107789379036269127867428205939968356093333381796027, 36708766329057377624215578758072538255734856411879936712186666763593164, 73417532658114755248431157516145076511469712823759873424373333527183983, 146835065316229510496862315032290153022939425647519746848746667054375799, 293670130632459020993724630064580306045878851295039493697493334108746318, 587340261264918041987449260129160612091757702590078987394986668217495646, 1174680522529836083974898520258321224183515405180157974789973336434988379, 2349361045059672167949797040516642448367030810360315949579946672869974126, 4698722090119344335899594081033284896734061620720631899159893345739947146, 9397444180238688671799188162066569793468123241441263798319786691479898849, 18794888360477377343598376324133139586936246482882527596639573382959797876, 37589776720954754687196752648266279173872492965765055193279146765919596200, 75179553441909509374393505296532558347744985931530110386558293531839189730, 150359106883819018748787010593065116695489971863060220773116587063678378241, 300718213767638037497574021186130233390979943726120441546233174127356757995, 601436427535276074995148042372260466781959887452240883092466348254713517275, 1202872855070552149990296084744520933563919774904481766184932696509427033546, 2405745710141104299980592169489041867127839549808963532369865393018854064228, 4811491420282208599961184338978083734255679099617927064739730786037708133129, 9622982840564417199922368677956167468511358199235854129479461572075416268017, 19245965681128834399844737355912334937022716398471708258958923144150832536680, 38491931362257668799689474711824669874045432796943416517917846288301665069964, 76983862724515337599378949423649339748090865593886833035835692576603330140364, 153967725449030675198757898847298679496181731187773666071671385153206660282848, 307935450898061350397515797694597358992363462375547332143342770306413320565073, 615870901796122700795031595389194717984726924751094664286685540612826641131213, 1231741803592245401590063190778389435969453849502189328573371081225653282256932, 2463483607184490803180126381556778871938907699004378657146742162451306564516268, 4926967214368981606360252763113557743877815398008757314293484324902613129035495, 9853934428737963212720505526227115487755630796017514628586968649805226258069061, 19707868857475926425441011052454230975511261592035029257173937299610452516139767, 39415737714951852850882022104908461951022523184070058514347874599220905032278195, 78831475429903705701764044209816923902045046368140117028695749198441810064558268, 157662950859807411403528088419633847804090092736280234057391498396883620129116746, 315325901719614822807056176839267695608180185472560468114782996793767240258227363, 630651803439229645614112353678535391216360370945120936229565993587534480516455680, 1261303606878459291228224707357070782432720741890241872459131987175068961032911148, 2522607213756918582456449414714141564865441483780483744918263974350137922065828411, 5045214427513837164912898829428283129730882967560967489836527948700275844131651955, 10090428855027674329825797658856566259461765935121934979673055897400551688263305219, 20180857710055348659651595317713132518923531870243869959346111794801103376526609990, 40361715420110697319303190635426265037847063740487739918692223589602206753053223625, 80723430840221394638606381270852530075694127480975479837384447179204413506106444595, 161446861680442789277212762541705060151388254961950959674768894358408827012212891353, 322893723360885578554425525083410120302776509923901919349537788716817654024425782825, 645787446721771157108851050166820240605553019847803838699075577433635308048851566446, 1291574893443542314217702100333640481211106039695607677398151154867270616097703126505, 2583149786887084628435404200667280962422212079391215354796302309734541232195406251199, 5166299573774169256870808401334561924844424158782430709592604619469082464390812511780, 10332599147548338513741616802669123849688848317564861419185209238938164928781625020231, 20665198295096677027483233605338247699377696635129722838370418477876329857563250035474, 41330396590193354054966467210676495398755393270259445676740836955752659715126500075065, 82660793180386708109932934421352990797510786540518891353481673911505319430253000145600, 165321586360773416219865868842705981595021573081037782706963347823010638860506000292082, 330643172721546832439731737685411963190043146162075565413926695646021277721012000584241, 661286345443093664879463475370823926380086292324151130827853391292042555442024001168874, 1322572690886187329758926950741647852760172584648302261655706782584085110884048002343488, 2645145381772374659517853901483295705520345169296604523311413565168170221768096004683934, 5290290763544749319035707802966591411040690338593209046622827130336340443536192009366966, 10580581527089498638071415605933182822081380677186418093245654260672680887072384018734469, 21161163054178997276142831211866365644162761354372836186491308521345361774144768037473226, 42322326108357994552285662423732731288325522708745672372982617042690723548289536074945369, 84644652216715989104571324847465462576651045417491344745965234085381447096579072149883821, 169289304433431978209142649694930925153302090834982689491930468170762894193158144299768842, 338578608866863956418285299389861850306604181669965378983860936341525788386316288599542292, 677157217733727912836570598779723700613208363339930757967721872683051576772632577199078267, 1354314435467455825673141197559447401226416726679861515935443745366103153545265154398156381, 2708628870934911651346282395118894802452833453359723031870887490732206307090530308796316119, 5417257741869823302692564790237789604905666906719446063741774981464412614181060617592638228, 10834515483739646605385129580475579209811333813438892127483549962928825228362121235185271752, 21669030967479293210770259160951158419622667626877784254967099925857650456724242470370543084, 43338061934958586421540518321902316839245335253755568509934199851715300913448484940741087606, 86676123869917172843081036643804633678490670507511137019868399703430601826896969881482176035, 173352247739834345686162073287609267356981341015022274039736799406861203653793939762964345646, 346704495479668691372324146575218534713962682030044548079473598813722407307587879525928700807, 693408990959337382744648293150437069427925364060089096158947197627444814615175759051857398883, 1386817981918674765489296586300874138855850728120178192317894395254889629230351518103714795488, 2773635963837349530978593172601748277711701456240356384635788790509779258460703036207429589351, 5547271927674699061957186345203496555423402912480712769271577581019558516921406072414859180875, 11094543855349398123914372690406993110846805824961425538543155162039117033842812144829718361089, 22189087710698796247828745380813986221693611649922851077086310324078234067685624289659436726909, 44378175421397592495657490761627972443387223299845702154172620648156468135371248579318873452943, 88756350842795184991314981523255944886774446599691404308345241296312936270742497158637746902810, 177512701685590369982629963046511889773548893199382808616690482592625872541484994317275493804054, 355025403371180739965259926093023779547097786398765617233380965185251745082969988634550987606290, 710050806742361479930519852186047559094195572797531234466761930370503490165939977269101975220435, 1420101613484722959861039704372095118188391145595062468933523860741006980331879954538203950432661, 2840203226969445919722079408744190236376782291190124937867047721482013960663759909076407900865744, 5680406453938891839444158817488380472753564582380249875734095442964027921327519818152815801730515, 11360812907877783678888317634976760945507129164760499751468190885928055842655039636305631603469583, 22721625815755567357776635269953521891014258329520999502936381771856111685310079272611263206935942, 45443251631511134715553270539907043782028516659041999005872763543712223370620158545222526413873319, 90886503263022269431106541079814087564057033318083998011745527087424446741240317090445052827740394, 181773006526044538862213082159628175128114066636167996023491054174848893482480634180890105655483306, 363546013052089077724426164319256350256228133272335992046982108349697786964961268361780211310968368, 727092026104178155448852328638512700512456266544671984093964216699395573929922536723560422621935911, 1454184052208356310897704657277025401024912533089343968187928433398791147859845073447120845243875442, 2908368104416712621795409314554050802049825066178687936375856866797582295719690146894241690487746952, 5816736208833425243590818629108101604099650132357375872751713733595164591439380293788483380975493555, 11633472417666850487181637258216203208199300264714751745503427467190329182878760587576966761950991019, 23266944835333700974363274516432406416398600529429503491006854934380658365757521175153933523901976220, 46533889670667401948726549032864812832797201058859006982013709868761316731515042350307867047803950148, 93067779341334803897453098065729625665594402117718013964027419737522633463030084700615734095607905818, 186135558682669607794906196131459251331188804235436027928054839475045266926060169401231468191215809063, 372271117365339215589812392262918502662377608470872055856109678950090533852120338802462936382431615733, 744542234730678431179624784525837005324755216941744111712219357900181067704240677604925872764863236253, 1489084469461356862359249569051674010649510433883488223424438715800362135408481355209851745529726476026, 2978168938922713724718499138103348021299020867766976446848877431600724270816962710419703491059452946197, 5956337877845427449436998276206696042598041735533952893697754863201448541633925420839406982118905892350, 11912675755690854898873996552413392085196083471067905787395509726402897083267850841678813964237811785497, 23825351511381709797747993104826784170392166942135811574791019452805794166535701683357627928475623569859, 47650703022763419595495986209653568340784333884271623149582038905611588333071403366715255856951247142815, 95301406045526839190991972419307136681568667768543246299164077811223176666142806733430511713902494289017, 190602812091053678381983944838614273363137335537086492598328155622446353332285613466861023427804988575304, 381205624182107356763967889677228546726274671074172985196656311244892706664571226933722046855609977153913, 762411248364214713527935779354457093452549342148345970393312622489785413329142453867444093711219954307246, 1524822496728429427055871558708914186905098684296691940786625244979570826658284907734888187422439908610292, 3049644993456858854111743117417828373810197368593383881573250489959141653316569815469776374844879817221693, 6099289986913717708223486234835656747620394737186767763146500979918283306633139630939552749689759634443103, 12198579973827435416446972469671313495240789474373535526293001959836566613266279261879105499379519268886923, 24397159947654870832893944939342626990481578948747071052586003919673133226532558523758210998759038537772529, 48794319895309741665787889878685253980963157897494142105172007839346266453065117047516421997518077075548624, 97588639790619483331575779757370507961926315794988284210344015678692532906130234095032843995036154151097151, 195177279581238966663151559514741015923852631589976568420688031357385065812260468190065687990072308302186814, 390354559162477933326303119029482031847705263179953136841376062714770131624520936380131375980144616604381572, 780709118324955866652606238058964063695410526359906273682752125429540263249041872760262751960289233208754214, 1561418236649911733305212476117928127390821052719812547365504250859080526498083745520525503920578466417509918, 3122836473299823466610424952235856254781642105439625094731008501718161052996167491041051007841156932835024155, 6245672946599646933220849904471712509563284210879250189462017003436322105992334982082102015682313865670044392, 12491345893199293866441699808943425019126568421758500378924034006872644211984669964164204031364627731340095424, 24982691786398587732883399617886850038253136843517000757848068013745288423969339928328408062729255462680191070, 49965383572797175465766799235773700076506273687034001515696136027490576847938679856656816125458510925360382327, 99930767145594350931533598471547400153012547374068003031392272054981153695877359713313632250917021850720761806, 199861534291188701863067196943094800306025094748136006062784544109962307391754719426627264501834043701441520260, 399723068582377403726134393886189600612050189496272012125569088219924614783509438853254529003668087402883045044, 799446137164754807452268787772379201224100378992544024251138176439849229567018877706509058007336174805766089826, 1598892274329509614904537575544758402448200757985088048502276352879698459134037755413018116014672349611532180180, 3197784548659019229809075151089516804896401515970176097004552705759396918268075510826036232029344699223064362412, 6395569097318038459618150302179033609792803031940352194009105411518793836536151021652072464058689398446128717728, 12791138194636076919236300604358067219585606063880704388018210823037587673072302043304144928117378796892257433818, 25582276389272153838472601208716134439171212127761408776036421646075175346144604086608289856234757593784514875961, 51164552778544307676945202417432268878342424255522817552072843292150350692289208173216579712469515187569029751338, 102329105557088615353890404834864537756684848511045635104145686584300701384578416346433159424939030375138059496648, 204658211114177230707780809669729075513369697022091270208291373168601402769156832692866318849878060750276118991256, 409316422228354461415561619339458151026739394044182540416582746337202805538313665385732637699756121500552237987942, 818632844456708922831123238678916302053478788088365080833165492674405611076627330771465275399512243001104475978454, 1637265688913417845662246477357832604106957576176730161666330985348811222153254661542930550799024486002208951953280, 3274531377826835691324492954715665208213915152353460323332661970697622444306509323085861101598048972004417903909969, 6549062755653671382648985909431330416427830304706920646665323941395244888613018646171722203196097944008835807817952, 13098125511307342765297971818862660832855660609413841293330647882790489777226037292343444406392195888017671615632180, 26196251022614685530595943637725321665711321218827682586661295765580979554452074584686888812784391776035343231269303, 52392502045229371061191887275450643331422642437655365173322591531161959108904149169373777625568783552070686462530818, 104785004090458742122383774550901286662845284875310730346645183062323918217808298338747555251137567104141372925064843, 209570008180917484244767549101802573325690569750621460693290366124647836435616596677495110502275134208282745850133904, 419140016361834968489535098203605146651381139501242921386580732249295672871233193354990221004550268416565491700264856, 838280032723669936979070196407210293302762279002485842773161464498591345742466386709980442009100536833130983400530861, 1676560065447339873958140392814420586605524558004971685546322928997182691484932773419960884018201073666261966801064932, 3353120130894679747916280785628841173211049116009943371092645857994365382969865546839921768036402147332523933602121444, 6706240261789359495832561571257682346422098232019886742185291715988730765939731093679843536072804294665047867204249768, 13412480523578718991665123142515364692844196464039773484370583431977461531879462187359687072145608589330095734408499517, 26824961047157437983330246285030729385688392928079546968741166863954923063758924374719374144291217178660191468816995207, 53649922094314875966660492570061458771376785856159093937482333727909846127517848749438748288582434357320382937633996903, 107299844188629751933320985140122917542753571712318187874964667455819692255035697498877496577164868714640765875267991946, 214599688377259503866641970280245835085507143424636375749929334911639384510071394997754993154329737429281531750535985128, 429199376754519007733283940560491670171014286849272751499858669823278769020142789995509986308659474858563063501071964164, 858398753509038015466567881120983340342028573698545502999717339646557538040285579991019972617318949717126127002143930167, 1716797507018076030933135762241966680684057147397091005999434679293115076080571159982039945234637899434252254004287856853, 3433595014036152061866271524483933361368114294794182011998869358586230152161142319964079890469275798868504508008575720751, 6867190028072304123732543048967866722736228589588364023997738717172460304322284639928159780938551597737009016017151436066, 13734380056144608247465086097935733445472457179176728047995477434344920608644569279856319561877103195474018032034302875060, 27468760112289216494930172195871466890944914358353456095990954868689841217289138559712639123754206390948036064068605744212, 54937520224578432989860344391742933781889828716706912191981909737379682434578277119425278247508412781896072128137211491365, 109875040449156865979720688783485867563779657433413824383963819474759364869156554238850556495016825563792144256274422985379, 219750080898313731959441377566971735127559314866827648767927638949518729738313108477701112990033651127584288512548845971772, 439500161796627463918882755133943470255118629733655297535855277899037459476626216955402225980067302255168577025097691937072, 879000323593254927837765510267886940510237259467310595071710555798074918953252433910804451960134604510337154050195383881617, 1758000647186509855675531020535773881020474518934621190143421111596149837906504867821608903920269209020674308100390767759190, 3516001294373019711351062041071547762040949037869242380286842223192299675813009735643217807840538418041348616200781535520102, 7032002588746039422702124082143095524081898075738484760573684446384599351626019471286435615681076836082697232401563071034910, 14064005177492078845404248164286191048163796151476969521147368892769198703252038942572871231362153672165394464803126142075530, 28128010354984157690808496328572382096327592302953939042294737785538397406504077885145742462724307344330788929606252284154822, 56256020709968315381616992657144764192655184605907878084589475571076794813008155770291484925448614688661577859212504568308156, 112512041419936630763233985314289528385310369211815756169178951142153589626016311540582969850897229377323155718425009136613670, 225024082839873261526467970628579056770620738423631512338357902284307179252032623081165939701794458754646311436850018273224359, 450048165679746523052935941257158113541241476847263024676715804568614358504065246162331879403588917509292622873700036546456004, 900096331359493046105871882514316227082482953694526049353431609137228717008130492324663758807177835018585245747400073092910896, 1800192662718986092211743765028632454164965907389052098706863218274457434016260984649327517614355670037170491494800146185821939, 3600385325437972184423487530057264908329931814778104197413726436548914868032521969298655035228711340074340982989600292371639422, 7200770650875944368846975060114529816659863629556208394827452873097829736065043938597310070457422680148681965979200584743275381, 14401541301751888737693950120229059633319727259112416789654905746195659472130087877194620140914845360297363931958401169486552955, 28803082603503777475387900240458119266639454518224833579309811492391318944260175754389240281829690720594727863916802338973106032, 57606165207007554950775800480916238533278909036449667158619622984782637888520351508778480563659381441189455727833604677946211009, 115212330414015109901551600961832477066557818072899334317239245969565275777040703017556961127318762882378911455667209355892423943, 230424660828030219803103201923664954133115636145798668634478491939130551554081406035113922254637525764757822911334418711784851710, 460849321656060439606206403847329908266231272291597337268956983878261103108162812070227844509275051529515645822668837423569695549, 921698643312120879212412807694659816532462544583194674537913967756522206216325624140455689018550103059031291645337674847139391619, 1843397286624241758424825615389319633064925089166389349075827935513044412432651248280911378037100206118062583290675349694278788947, 3686794573248483516849651230778639266129850178332778698151655871026088824865302496561822756074200412236125166581350699388557576116, 7373589146496967033699302461557278532259700356665557396303311742052177649730604993123645512148400824472250333162701398777115148534, 14747178292993934067398604923114557064519400713331114792606623484104355299461209986247291024296801648944500666325402797554230303950, 29494356585987868134797209846229114129038801426662229585213246968208710598922419972494582048593603297889001332650805595108460601959, 58988713171975736269594419692458228258077602853324459170426493936417421197844839944989164097187206595778002665301611190216921205040, 117977426343951472539188839384916456516155205706648918340852987872834842395689679889978328194374413191556005330603222380433842413587, 235954852687902945078377678769832913032310411413297836681705975745669684791379359779956656388748826383112010661206444760867684820853, 471909705375805890156755357539665826064620822826595673363411951491339369582758719559913312777497652766224021322412889521735369647846, 943819410751611780313510715079331652129241645653191346726823902982678739165517439119826625554995305532448042644825779043470739295803, 1887638821503223560627021430158663304258483291306382693453647805965357478331034878239653251109990611064896085289651558086941478591367, 3775277643006447121254042860317326608516966582612765386907295611930714956662069756479306502219981222129792170579303116173882957181442, 7550555286012894242508085720634653217033933165225530773814591223861429913324139512958613004439962444259584341158606232347765914362560, 15101110572025788485016171441269306434067866330451061547629182447722859826648279025917226008879924888519168682317212464695531828727954, 30202221144051576970032342882538612868135732660902123095258364895445719653296558051834452017759849777038337364634424929391063657457170, 60404442288103153940064685765077225736271465321804246190516729790891439306593116103668904035519699554076674729268849858782127314909479, 120808884576206307880129371530154451472542930643608492381033459581782878613186232207337808071039399108153349458537699717564254629824468, 241617769152412615760258743060308902945085861287216984762066919163565757226372464414675616142078798216306698917075399435128509259648891, 483235538304825231520517486120617805890171722574433969524133838327131514452744928829351232284157596432613397834150798870257018519292350, 966471076609650463041034972241235611780343445148867939048267676654263028905489857658702464568315192865226795668301597740514037038581218, 1932942153219300926082069944482471223560686890297735878096535353308526057810979715317404929136630385730453591336603195481028074077162163, 3865884306438601852164139888964942447121373780595471756193070706617052115621959430634809858273260771460907182673206390962056148154333146, 7731768612877203704328279777929884894242747561190943512386141413234104231243918861269619716546521542921814365346412781924112296308665528, 15463537225754407408656559555859769788485495122381887024772282826468208462487837722539239433093043085843628730692825563848224592617332540, 30927074451508814817313119111719539576970990244763774049544565652936416924975675445078478866186086171687257461385651127696449185234659170, 61854148903017629634626238223439079153941980489527548099089131305872833849951350890156957732372172343374514922771302255392898370469315726, 123708297806035259269252476446878158307883960979055096198178262611745667699902701780313915464744344686749029845542604510785796740938630496, 247416595612070518538504952893756316615767921958110192396356525223491335399805403560627830929488689373498059691085209021571593481877261461, 494833191224141037077009905787512633231535843916220384792713050446982670799610807121255661858977378746996119382170418043143186963754523203, 989666382448282074154019811575025266463071687832440769585426100893965341599221614242511323717954757493992238764340836086286373927509045673, 1979332764896564148308039623150050532926143375664881539170852201787930683198443228485022647435909514987984477528681672172572747855018091832, 3958665529793128296616079246300101065852286751329763078341704403575861366396886456970045294871819029975968955057363344345145495710036185586, 7917331059586256593232158492600202131704573502659526156683408807151722732793772913940090589743638059951937910114726688690290991420072372224, 15834662119172513186464316985200404263409147005319052313366817614303445465587545827880181179487276119903875820229453377380581982840144745529, 31669324238345026372928633970400808526818294010638104626733635228606890931175091655760362358974552239807751640458906754761163965680289491585, 63338648476690052745857267940801617053636588021276209253467270457213781862350183311520724717949104479615503280917813509522327931360578979276, 126677296953380105491714535881603234107273176042552418506934540914427563724700366623041449435898208959231006561835627019044655862721157961390, 253354593906760210983429071763206468214546352085104837013869081828855127449400733246082898871796417918462013123671254038089311725442315928550, 506709187813520421966858143526412936429092704170209674027738163657710254898801466492165797743592835836924026247342508076178623450884631848971, 1013418375627040843933716287052825872858185408340419348055476327315420509797602932984331595487185671673848052494685016152357246901769263697042, 2026836751254081687867432574105651745716370816680838696110952654630841019595205865968663190974371343347696104989370032304714493803538527398761, 4053673502508163375734865148211303491432741633361677392221905309261682039190411731937326381948742686695392209978740064609428987607077054800108, 8107347005016326751469730296422606982865483266723354784443810618523364078380823463874652763897485373390784419957480129218857975214154109593482, 16214694010032653502939460592845213965730966533446709568887621237046728156761646927749305527794970746781568839914960258437715950428308219189801, 32429388020065307005878921185690427931461933066893419137775242474093456313523293855498611055589941493563137679829920516875431900856616438375804, 64858776040130614011757842371380855862923866133786838275550484948186912627046587710997222111179882987126275359659841033750863801713232876754892, 129717552080261228023515684742761711725847732267573676551100969896373825254093175421994444222359765974252550719319682067501727603426465753512768, 259435104160522456047031369485523423451695464535147353102201939792747650508186350843988888444719531948505101438639364135003455206852931507025982, 518870208321044912094062738971046846903390929070294706204403879585495301016372701687977776889439063897010202877278728270006910413705863014045530, 1037740416642089824188125477942093693806781858140589412408807759170990602032745403375955553778878127794020405754557456540013820827411726028098177, 2075480833284179648376250955884187387613563716281178824817615518341981204065490806751911107557756255588040811509114913080027641654823452056190388, 4150961666568359296752501911768374775227127432562357649635231036683962408130981613503822215115512511176081623018229826160055283309646904112385943, 8301923333136718593505003823536749550454254865124715299270462073367924816261963227007644430231025022352163246036459652320110566619293808224771778, 16603846666273437187010007647073499100908509730249430598540924146735849632523926454015288860462050044704326492072919304640221133238587616449538858, 33207693332546874374020015294146998201817019460498861197081848293471699265047852908030577720924100089408652984145838609280442266477175232899078092, 66415386665093748748040030588293996403634038920997722394163696586943398530095705816061155441848200178817305968291677218560884532954350465798155534, 132830773330187497496080061176587992807268077841995444788327393173886797060191411632122310883696400357634611936583354437121769065908700931596309337, 265661546660374994992160122353175985614536155683990889576654786347773594120382823264244621767392800715269223873166708874243538131817401863192618660, 531323093320749989984320244706351971229072311367981779153309572695547188240765646528489243534785601430538447746333417748487076263634803726385238279, 1062646186641499979968640489412703942458144622735963558306619145391094376481531293056978487069571202861076895492666835496974152527269607452770481475, 2125292373282999959937280978825407884916289245471927116613238290782188752963062586113956974139142405722153790985333670993948305054539214905540960129, 4250584746565999919874561957650815769832578490943854233226476581564377505926125172227913948278284811444307581970667341987896610109078429811081922999, 8501169493131999839749123915301631539665156981887708466452953163128755011852250344455827896556569622888615163941334683975793220218156859622163847794, 17002338986263999679498247830603263079330313963775416932905906326257510023704500688911655793113139245777230327882669367951586440436313719244327693836, 34004677972527999358996495661206526158660627927550833865811812652515020047409001377823311586226278491554460655765338735903172880872627438488655382471, 68009355945055998717992991322413052317321255855101667731623625305030040094818002755646623172452556983108921311530677471806345761745254876977310768264, 136018711890111997435985982644826104634642511710203335463247250610060080189636005511293246344905113966217842623061354943612691523490509753954621539469, 272037423780223994871971965289652209269285023420406670926494501220120160379272011022586492689810227932435685246122709887225383046981019507909243077488, 544074847560447989743943930579304418538570046840813341852989002440240320758544022045172985379620455864871370492245419774450766093962039015818486158443, 1088149695120895979487887861158608837077140093681626683705978004880480641517088044090345970759240911729742740984490839548901532187924078031636972316691, 2176299390241791958975775722317217674154280187363253367411956009760961283034176088180691941518481823459485481968981679097803064375848156063273944625793, 4352598780483583917951551444634435348308560374726506734823912019521922566068352176361383883036963646918970963937963358195606128751696312126547889258181, 8705197560967167835903102889268870696617120749453013469647824039043845132136704352722767766073927293837941927875926716391212257503392624253095778517242, 17410395121934335671806205778537741393234241498906026939295648078087690264273408705445535532147854587675883855751853432782424515006785248506191557028092, 34820790243868671343612411557075482786468482997812053878591296156175380528546817410891071064295709175351767711503706865564849030013570497012383114053874, 69641580487737342687224823114150965572936965995624107757182592312350761057093634821782142128591418350703535423007413731129698060027140994024766228109686, 139283160975474685374449646228301931145873931991248215514365184624701522114187269643564284257182836701407070846014827462259396120054281988049532456225789, 278566321950949370748899292456603862291747863982496431028730369249403044228374539287128568514365673402814141692029654924518792240108563976099064912449974, 557132643901898741497798584913207724583495727964992862057460738498806088456749078574257137028731346805628283384059309849037584480217127952198129824894002, 1114265287803797482995597169826415449166991455929985724114921476997612176913498157148514274057462693611256566768118619698075168960434255904396259649789654, 2228530575607594965991194339652830898333982911859971448229842953995224353826996314297028548114925387222513133536237239396150337920868511808792519299584469, 4457061151215189931982388679305661796667965823719942896459685907990448707653992628594057096229850774445026267072474478792300675841737023617585038599166397, 8914122302430379863964777358611323593335931647439885792919371815980897415307985257188114192459701548890052534144948957584601351683474047235170077198331769, 17828244604860759727929554717222647186671863294879771585838743631961794830615970514376228384919403097780105068289897915169202703366948094470340154396667615, 35656489209721519455859109434445294373343726589759543171677487263923589661231941028752456769838806195560210136579795830338405406733896188940680308793334197, 71312978419443038911718218868890588746687453179519086343354974527847179322463882057504913539677612391120420273159591660676810813467792377881360617586661703, 142625956838886077823436437737781177493374906359038172686709949055694358644927764115009827079355224782240840546319183321353621626935584755762721235173329370, 285251913677772155646872875475562354986749812718076345373419898111388717289855528230019654158710449564481681092638366642707243253871169511525442470346657515, 570503827355544311293745750951124709973499625436152690746839796222777434579711056460039308317420899128963362185276733285414486507742339023050884940693312295, 1141007654711088622587491501902249419946999250872305381493679592445554869159422112920078616634841798257926724370553466570828973015484678046101769881386631195, 2282015309422177245174983003804498839893998501744610762987359184891109738318844225840157233269683596515853448741106933141657946030969356092203539762773261773, 4564030618844354490349966007608997679787997003489221525974718369782219476637688451680314466539367193031706897482213866283315892061938712184407079525546521304, 9128061237688708980699932015217995359575994006978443051949436739564438953275376903360628933078734386063413794964427732566631784123877424368814159051093038428, 18256122475377417961399864030435990719151988013956886103898873479128877906550753806721257866157468772126827589928855465133263568247754848737628318102186075775, 36512244950754835922799728060871981438303976027913772207797746958257755813101507613442515732314937544253655179857710930266527136495509697475256636204372157632, 73024489901509671845599456121743962876607952055827544415595493916515511626203015226885031464629875088507310359715421860533054272991019394950513272408744309875, 146048979803019343691198912243487925753215904111655088831190987833031023252406030453770062929259750177014620719430843721066108545982038789901026544817488623124, 292097959606038687382397824486975851506431808223310177662381975666062046504812060907540125858519500354029241438861687442132217091964077579802053089634977249751, 584195919212077374764795648973951703012863616446620355324763951332124093009624121815080251717039000708058482877723374884264434183928155159604106179269954491984, 1168391838424154749529591297947903406025727232893240710649527902664248186019248243630160503434078001416116965755446749768528868367856310319208212358539908990682, 2336783676848309499059182595895806812051454465786481421299055805328496372038496487260321006868156002832233931510893499537057736735712620638416424717079817980733, 4673567353696618998118365191791613624102908931572962842598111610656992744076992974520642013736312005664467863021786999074115473471425241276832849434159635960153, 9347134707393237996236730383583227248205817863145925685196223221313985488153985949041284027472624011328935726043573998148230946942850482553665698868319271914523, 18694269414786475992473460767166454496411635726291851370392446442627970976307971898082568054945248022657871452087147996296461893885700965107331397736638543833203, 37388538829572951984946921534332908992823271452583702740784892885255941952615943796165136109890496045315742904174295992592923787771401930214662795473277087664071, 74777077659145903969893843068665817985646542905167405481569785770511883905231887592330272219780992090631485808348591985185847575542803860429325590946554175334890, 149554155318291807939787686137331635971293085810334810963139571541023767810463775184660544439561984181262971616697183970371695151085607720858651181893108350668586, 299108310636583615879575372274663271942586171620669621926279143082047535620927550369321088879123968362525943233394367940743390302171215441717302363786216701334554, 598216621273167231759150744549326543885172343241339243852558286164095071241855100738642177758247936725051886466788735881486780604342430883434604727572433402666903, 1196433242546334463518301489098653087770344686482678487705116572328190142483710201477284355516495873450103772933577471762973561208684861766869209455144866805338800, 2392866485092668927036602978197306175540689372965356975410233144656380284967420402954568711032991746900207545867154943525947122417369723533738418910289733610671990, 4785732970185337854073205956394612351081378745930713950820466289312760569934840805909137422065983493800415091734309887051894244834739447067476837820579467221343528, 9571465940370675708146411912789224702162757491861427901640932578625521139869681611818274844131966987600830183468619774103788489669478894134953675641158934442691999, 19142931880741351416292823825578449404325514983722855803281865157251042279739363223636549688263933975201660366937239548207576979338957788269907351282317868885378950, 38285863761482702832585647651156898808651029967445711606563730314502084559478726447273099376527867950403320733874479096415153958677915576539814702564635737770756536, 76571727522965405665171295302313797617302059934891423213127460629004169118957452894546198753055735900806641467748958192830307917355831153079629405129271475541516726, 153143455045930811330342590604627595234604119869782846426254921258008338237914905789092397506111471801613282935497916385660615834711662306159258810258542951083029904, 306286910091861622660685181209255190469208239739565692852509842516016676475829811578184795012222943603226565870995832771321231669423324612318517620517085902166068777, 612573820183723245321370362418510380938416479479131385705019685032033352951659623156369590024445887206453131741991665542642463338846649224637035241034171804332136245, 1225147640367446490642740724837020761876832958958262771410039370064066705903319246312739180048891774412906263483983331085284926677693298449274070482068343608664269481, 2450295280734892981285481449674041523753665917916525542820078740128133411806638492625478360097783548825812526967966662170569853355386596898548140964136687217328537122, 4900590561469785962570962899348083047507331835833051085640157480256266823613276985250956720195567097651625053935933324341139706710773193797096281928273374434657077273, 9801181122939571925141925798696166095014663671666102171280314960512533647226553970501913440391134195303250107871866648682279413421546387594192563856546748869314150214, 19602362245879143850283851597392332190029327343332204342560629921025067294453107941003826880782268390606500215743733297364558826843092775188385127713093497738628304741, 39204724491758287700567703194784664380058654686664408685121259842050134588906215882007653761564536781213000431487466594729117653686185550376770255426186995477256608445, 78409448983516575401135406389569328760117309373328817370242519684100269177812431764015307523129073562426000862974933189458235307372371100753540510852373990954513220245, 156818897967033150802270812779138657520234618746657634740485039368200538355624863528030615046258147124852001725949866378916470614744742201507081021704747981909026433590, 313637795934066301604541625558277315040469237493315269480970078736401076711249727056061230092516294249704003451899732757832941229489484403014162043409495963818052871664, 627275591868132603209083251116554630080938474986630538961940157472802153422499454112122460185032588499408006903799465515665882458978968806028324086818991927636105740679, 1254551183736265206418166502233109260161876949973261077923880314945604306844998908224244920370065176998816013807598931031331764917957937612056648173637983855272211484509, 2509102367472530412836333004466218520323753899946522155847760629891208613689997816448489840740130353997632027615197862062663529835915875224113296347275967710544422962711, 5018204734945060825672666008932437040647507799893044311695521259782417227379995632896979681480260707995264055230395724125327059671831750448226592694551935421088845926154, 10036409469890121651345332017864874081295015599786088623391042519564834454759991265793959362960521415990528110460791448250654119343663500896453185389103870842177691854353, 20072818939780243302690664035729748162590031199572177246782085039129668909519982531587918725921042831981056220921582896501308238687327001792906370778207741684355383706399, 40145637879560486605381328071459496325180062399144354493564170078259337819039965063175837451842085663962112441843165793002616477374654003585812741556415483368710767417574, 80291275759120973210762656142918992650360124798288708987128340156518675638079930126351674903684171327924224883686331586005232954749308007171625483112830966737421534837407, 160582551518241946421525312285837985300720249596577417974256680313037351276159860252703349807368342655848449767372663172010465909498616014343250966225661933474843069670361, 321165103036483892843050624571675970601440499193154835948513360626074702552319720505406699614736685311696899534745326344020931818997232028686501932451323866949686139337997, 642330206072967785686101249143351941202880998386309671897026721252149405104639441010813399229473370623393799069490652688041863637994464057373003864902647733899372278679420, 1284660412145935571372202498286703882405761996772619343794053442504298810209278882021626798458946741246787598138981305376083727275988928114746007729805295467798744557356440, 2569320824291871142744404996573407764811523993545238687588106885008597620418557764043253596917893482493575196277962610752167454551977856229492015459610590935597489114719145, 5138641648583742285488809993146815529623047987090477375176213770017195240837115528086507193835786964987150392555925221504334909103955712458984030919221181871194978229437916, 10277283297167484570977619986293631059246095974180954750352427540034390481674231056173014387671573929974300785111850443008669818207911424917968061838442363742389956458876455, 20554566594334969141955239972587262118492191948361909500704855080068780963348462112346028775343147859948601570223700886017339636415822849835936123676884727484779912917746362, 41109133188669938283910479945174524236984383896723819001409710160137561926696924224692057550686295719897203140447401772034679272831645699671872247353769454969559825835495661, 82218266377339876567820959890349048473968767793447638002819420320275123853393848449384115101372591439794406280894803544069358545663291399343744494707538909939119651670991448, 164436532754679753135641919780698096947937535586895276005638840640550247706787696898768230202745182879588812561789607088138717091326582798687488989415077819878239303341985982, 328873065509359506271283839561396193895875071173790552011277681281100495413575393797536460405490365759177625123579214176277434182653165597374977978830155639756478606683974320, 657746131018719012542567679122792387791750142347581104022555362562200990827150787595072920810980731518355250247158428352554868365306331194749955957660311279512957213367948041, 1315492262037438025085135358245584775583500284695162208045110725124401981654301575190145841621961463036710500494316856705109736730612662389499911915320622559025914426735887781, 2630984524074876050170270716491169551167000569390324416090221450248803963308603150380291683243922926073421000988633713410219473461225324778999823830641245118051828853471782658, 5261969048149752100340541432982339102334001138780648832180442900497607926617206300760583366487845852146842001977267426820438946922450649557999647661282490236103657706943564233, 10523938096299504200681082865964678204668002277561297664360885800995215853234412601521166732975691704293684003954534853640877893844901299115999295322564980472207315413887123435, 21047876192599008401362165731929356409336004555122595328721771601990431706468825203042333465951383408587368007909069707281755787689802598231998590645129960944414630827774248641, 42095752385198016802724331463858712818672009110245190657443543203980863412937650406084666931902766817174736015818139414563511575379605196463997181290259921888829261655548502880, 84191504770396033605448662927717425637344018220490381314887086407961726825875300812169333863805533634349472031636278829127023150759210392927994362580519843777658523311097004582, 168383009540792067210897325855434851274688036440980762629774172815923453651750601624338667727611067268698944063272557658254046301518420785855988725161039687555317046622194001952, 336766019081584134421794651710869702549376072881961525259548345631846907303501203248677335455222134537397888126545115316508092603036841571711977450322079375110634093244388004392, 673532038163168268843589303421739405098752145763923050519096691263693814607002406497354670910444269074795776253090230633016185206073683143423954900644158750221268186488776011727, 1347064076326336537687178606843478810197504291527846101038193382527387629214004812994709341820888538149591552506180461266032370412147366286847909801288317500442536372977552028338, 2694128152652673075374357213686957620395008583055692202076386765054775258428009625989418683641777076299183105012360922532064740824294732573695819602576635000885072745955104051960, 5388256305305346150748714427373915240790017166111384404152773530109550516856019251978837367283554152598366210024721845064129481648589465147391639205153270001770145491910208103816, 10776512610610692301497428854747830481580034332222768808305547060219101033712038503957674734567108305196732420049443690128258963297178930294783278410306540003540290983820416211401, 21553025221221384602994857709495660963160068664445537616611094120438202067424077007915349469134216610393464840098887380256517926594357860589566556820613080007080581967640832416256, 43106050442442769205989715418991321926320137328891075233222188240876404134848154015830698938268433220786929680197774760513035853188715721179133113641226160014161163935281664840221, 86212100884885538411979430837982643852640274657782150466444376481752808269696308031661397876536866441573859360395549521026071706377431442358266227282452320028322327870563329673380, 172424201769771076823958861675965287705280549315564300932888752963505616539392616063322795753073732883147718720791099042052143412754862884716532454564904640056644655741126659349727, 344848403539542153647917723351930575410561098631128601865777505927011233078785232126645591506147465766295437441582198084104286825509725769433064909129809280113289311482253318702327, 689696807079084307295835446703861150821122197262257203731555011854022466157570464253291183012294931532590874883164396168208573651019451538866129818259618560226578622964506637402244, 1379393614158168614591670893407722301642244394524514407463110023708044932315140928506582366024589863065181749766328792336417147302038903077732259636519237120453157245929013274799944, 2758787228316337229183341786815444603284488789049028814926220047416089864630281857013164732049179726130363499532657584672834294604077806155464519273038474240906314491858026549599246, 5517574456632674458366683573630889206568977578098057629852440094832179729260563714026329464098359452260726999065315169345668589208155612310929038546076948481812628983716053099203131, 11035148913265348916733367147261778413137955156196115259704880189664359458521127428052658928196718904521453998130630338691337178416311224621858077092153896963625257967432106198407774, 22070297826530697833466734294523556826275910312392230519409760379328718917042254856105317856393437809042907996261260677382674356832622449243716154184307793927250515934864212396817580]
cipher = 44096612931024003148407895164090667174657344536623354666642108463093659898867859567157728084018394988840266329206836985537987081415020571845239234014695335928717091578810470705259929
t = len(key)

m = [0]*t
#创建一个长度为t的列表,并全部赋值为0
for i in range(1,t+1):
    if cipher > key[t-i]:
        #如果密文大于对应的密钥
        m[t-i] = 1
        #那么该处的二进制数据应该就是1
        cipher = cipher-key[t-i]
    else:
        m[t-1] = 0
        #如果密文小于密钥,那对应的二进制数据就是0
sum = 0
for i in range(1,t+1):
    if m[t-i] == 1:
        sum = sum  + 1*2**(i-1)
    elif m[i] == 0:
        sum = sum + 0
print(sum)
print(long_to_bytes(sum))

#16172795245477466085189061399220923365173135204957806877982821387906942981250069540419198526239270219243391047670417063507522802352245462201338930673058019313943367274884563303934
#b'\xffmoectf{superiNcreasiNg_sequeNce_is_useful_tO_cONstruct_a_KNapsacK_MAxSM}\xfe'

总结

密码往深处走就是在学数学(真的好难…)
不要当脚本小子,理解加密原理还是很有意思的

你可能感兴趣的:(网络)