window.onload=function(){ /*页面加载完成之后生成博客目录*/ BlogDirectory.createBlogDirectory("cnblogs_post_body","h2","h3",20); }

ctfshow通关笔记 Crypto(已完结)

签到题

密码学签到

密文是:

}wohs.ftc{galf

倒序一下

flag{ctf.show}

crypto系列

crypto0

gmbh{ifmmp_dug}

考点:凯撒密码

凯撒解密

flag{hello_ctf}

crypto2

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()(([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(![]+[+[]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([][[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[!+[]+!+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[+[]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[+[]]]+[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+([][(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()+[])[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]]((+((+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+[+[]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+!+[]]])+[])[!+[]+!+[]]+[+!+[]])+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+([+[]]+![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[+[]]])

考点:jsfuck

控制台直接跑

flag{3e858ccd79287cfe8509f15a71b4c45d}

crypto3

考点:颜文字 aaencode解密

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

浏览器直接打开文件乱七八糟,需要稍微操作一下,右键保存当前界面到txt就不是乱码了。

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

然后AA解码即可

crypto4

p=447685307 q=2037 e=17

提交flag{d}即可

给出p,q,e求d

exp:

from gmpy2 import *

p=447685307 
q=2037 
e=17

d = int(invert(e, (p-1)*(q-1)))
print(d)
#53616899001

crypto5

p=447685307 q=2037 e=17 c=704796792

提交flag{m}

给出p,q,e,c求m

exp:

import gmpy2
p=447685307 
q=2037 
e=17 
c=704796792

phi = (p-1) * (q-1)
n = p * q
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(m)
#904332399012

crypto6

密钥为 加密方式 名称,区分大小写
密文:
U2FsdGVkX19mGsGlfI3nciNVpWZZRqZO2PYjJ1ZQuRqoiknyHSWeQv8ol0uRZP94
MqeD2xz+
密钥:
加密方式名称

考点:兔子流

crypto7

查看代码
 Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook?
Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook.
Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook. Ook.
Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook!
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook.
Ook? Ook! Ook. Ook? Ook. Ook. Ook! Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook!
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook. Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook. Ook? Ook.

 考点:Ook

在线解码

crypto8

口出F伸中指
+++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.<
++++[ ->+++ +<]>+ +++.< +++++ +++[- >---- ----< ]>--. .--.- -.-.- --.-.
+++++ +..-- -..<+ +++++ +[->+ +++++ +<]>+ +.<++ ++++[ ->--- ---<] >----
----- .---- -.<++ ++++[ ->+++ +++<] >++++ +++++ +++.< +++++ ++[-> -----
--<]> .++.- ----. <++++ +++[- >++++ +++<] >+++. --.<+ +++++ [->-- ----<
]>--- ----- ---.+ .<+++ +++[- >++++ ++<]> +++++ +++++ ++.<+ +++++ [->--
----< ]>--- ----- ---.- .++++ .<+++ +++[- >++++ ++<]> +++++ +++.< +++++
+[->- ----- <]>-- ----- ---.- ----- .++++ +++++ .---- ----. <++++ ++[->
+++++ +<]>+ +++++ +++++ +.<++ +++[- >++++ +<]>+ ++.<

考点:BrainFuck

crypto9

看压缩包名字就知道是serpent加密

考点:serpent加密

先爆破压缩包密码得到 4132

再使用在线网址解码,key仍是4132 :

crypto10

解密后 提交 flag{明文}
=E7=94=A8=E4=BD=A0=E9=82=A3=E7=81=AB=E7=83=AD=E7=9A=84=E5=98=B4=E5=94=87=E8=AE=A9=E6=88=91=E5=9C=A8=E5=8D=88=E5=A4=9C=E9=87=8C=E6=97=A0=E5=B0=BD=E7=9A=84=E9=94=80=E9=AD=82

考点:quoted-printable编码

crypto11

密文:a8db1d82db78ed452ba0882fb9554fc

提交 flag{明文}

考点:MD5

crypto12

uozt{Zgyzhv_xlwv_uiln_xguhsld}

不用看了,没提示

考点:埃特巴什码

crypto13

考点:多重base

利用脚本循环多次解密base

import base64
filename = r"base.txt"
with open(filename) as f:
    s = f.read()
while True:
    try:
        s = base64.b16decode(s)
        continue
    except:
        pass
    try:
        s = base64.b32decode(s)
        continue
    except:
        pass
    try:
        s = base64.b64decode(s)
        continue
    except:
        pass
    break
print(s)
b'flag{b4Se_Fami1y_Is_FUn}'

crypto14

00110011 00110011 00100000 00110100 00110101 00100000 00110101 00110000 00100000 00110010 01100110 00100000 00110011 00110011 00100000 00110101 00110110 00100000 00110100 01100101 00100000 00110100 00110110 00100000 00110100 00110110 00100000 00110110 01100100 00100000 00110100 01100101 00100000 00110100 00110101 00100000 00110100 00110001 00100000 00110110 01100101 00100000 00110110 01100011 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110100 00100000 00110100 00110011 00100000 00110100 01100100 00100000 00110110 01100100 00100000 00110101 00110110 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110001 00100000 00110110 00110100 00100000 00110011 00111001 00100000 00110111 00110101 00100000 00110100 00110111 00100000 00110000 01100001

考点:base64换表

3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG

直接base64解码不行,需要根据base64编码表 对这串代码进行一下 移位替换

密文开头是 3EP/    而flag的base64编码为:ZmxhZw==

位移刚好是30   写脚本还原一下

s= '3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG'
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
flag = ''
for i in s:
    flag += a[(a.index(i)-30)%64]
if len(flag)%4!=0:
    flag += '='*(4-len(flag)%4)
print(flag)
print(base64.b64decode(flag).decode('UTF-8'))
#ZmxhZ3vnnIvmiJHplb/kuI3plb8/fQo=
#flag{看我长不长?}

或者换表为:efghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcd

萌新_密码5

由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大

考点:当铺密码

随波逐流工具解得

flag{ctfshow}

find the table

对‘’审查元素‘’右键查看源代码得到

考点:元素周期表

9对应 F  57对应La 64对应Ga  最终得到flag:flag{doyoulikesnow}

EZ_avbv(easy)

这个靶机关了暂时做不了。

贝斯多少呢

8nCDq36gzGn8hf4M2HJUsn4aYcYRBSJwj4aE0hbgpzHb4aHcH1zzC9C3IL
明文分段,然后没段base62,再拼起来

分段:8nCDq36gzGn+8hf4M2HJUsn+4aYcYRBSJwj+4aE0hbgpzHb+4aHcH1zzC9C+3IL

分别base62在拼接得到

flag{6a5eb2_i5_u5ua11y_u5ed_f0r_5h0rt_ur1}

RSA类

babyrsa

e = 65537
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194

典型RSA

EXP

#解密脚本:
import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194

phi = (p-1) * (q-1)
n = p * q
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))
#flag{b4by_R5A}

easyrsa1

e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009

类型:分解n

EXP

在线分解得到p q

import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
p=1201147059438530786835365194567
q=1212112637077862917192191913841
c = 69380371057914246192606760686152233225659503366319332065009


phi = (p-1) * (q-1)
n = p * q
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))
#flag{fact0r_sma11_N}

easyrsa2

e = 65537
n = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

e = 65537
n = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062

考点:共模攻击,共e

EXP

import gmpy2
import binascii

e = 65537
n1 = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c1 = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

n2 = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c2 = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062

p = gmpy2.gcd(n1, n2)
q = n2 // p  # 这里用n2求第二部分
phi = (p - 1) * (q - 1)

d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c2, d, n2)

print(binascii.unhexlify(hex(m)[2:]))

q = n1 // p  # 这里用n1求第一部分
phi = (p - 1) * (q - 1)

d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c1, d, n1)

print(binascii.unhexlify(hex(m)[2:]))
#flag{m0_bv_hv_sv}

easyrsa3

e = 797
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930

e = 521
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849

考点:共模攻击,共n

EXP

e1 = 797
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c1 = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930

e2 = 521
c2 = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849

# 已知两者n相同,e不同,共模攻击

import gmpy2
from Crypto.Util.number import isPrime, sieve_base as primes, long_to_bytes

def egcd(a, b):
    if b == 0:
        return a, 0;
    else:
        x, y = egcd(b, a % b)
        return y, x - (a // b) * y  # 扩展欧几里得算法

s = egcd(e1, e2)
s1 = s[0]
s2 = s[1]
print(s[0], s[1])
m = gmpy2.powmod(c1, s1, n) * gmpy2.powmod(c2, s2, n) % n
print(long_to_bytes(m))
#flag{sh4r3_N}

easyrsa4

e = 3
n = 18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661

考点:小明文

EXP

import gmpy2
from Crypto.Util.number import long_to_bytes
e = 3
n = 18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661
m = gmpy2.iroot(c,e)[0]
print(long_to_bytes(m))

#flag{Sm4ll_eee}

easyrsa5

e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827

考点:低解密指数攻击,e过大

EXP

# Sage

def rational_to_contfrac(x, y):

    # Converts a rational x/y fraction into a list of partial quotients [a0, ..., an]

    a = x // y

    pquotients = [a]

    while a * y != x:

        x, y = y, x - a * y

        a = x // y

        pquotients.append(a)

    return pquotients

def convergents_from_contfrac(frac):

    # computes the list of convergents using the list of partial quotients

    convs = [];

    for i in range(len(frac)): convs.append(contfrac_to_rational(frac[0: i]))

    return convs

def contfrac_to_rational(frac):

    # Converts a finite continued fraction [a0, ..., an] to an x/y rational.

    if len(frac) == 0: return (0, 1)

    num = frac[-1]

    denom = 1

    for _ in range(-2, -len(frac) - 1, -1): num, denom = frac[_] * num + denom, num

    return (num, denom)

e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827
def egcd(a, b):

    if a == 0: return (b, 0, 1)

    g, x, y = egcd(b % a, a)

    return (g, y - (b // a) * x, x)

def mod_inv(a, m):

    g, x, _ = egcd(a, m)

    return (x + m) % m

def isqrt(n):

    x = n

    y = (x + 1) // 2

    while y < x:

        x = y

        y = (x + n // x) // 2

    return x

def crack_rsa(e, n):

    frac = rational_to_contfrac(e, n)

    convergents = convergents_from_contfrac(frac)

    for (k, d) in convergents:

        if k != 0 and (e * d - 1) % k == 0:

            phi = (e * d - 1) // k

            s = n - phi + 1

            # check if x*x - s*x + n = 0 has integer roots

            D = s * s - 4 * n

            if D >= 0:

                sq = isqrt(D)

                if sq * sq == D and (s + sq) % 2 == 0: return d

d = crack_rsa(e, n)

m = hex(pow(c, d, n))[2:]

print(bytes.fromhex(m))
#flag{very_biiiiig_e}

easyrsa6

import gmpy2,libnum
from Crypto.Util.number import getPrime
from secret import flag

e = 0x10001
p = getPrime(1024)
q = gmpy2.next_prime(p)
n = p * q
print("n =",n)
m = libnum.s2n(flag)
c = pow(m,e,n)
print("c =", c)

# n = 26737417831000820542131903300607349805884383394154602685589253691058592906354935906805134188533804962897170211026684453428204518730064406526279112572388086653330354347467824800159214965211971007509161988095657918569122896402683130342348264873834798355125176339737540844380018932257326719850776549178097196650971801959829891897782953799819540258181186971887122329746532348310216818846497644520553218363336194855498009339838369114649453618101321999347367800581959933596734457081762378746706371599215668686459906553007018812297658015353803626409606707460210905216362646940355737679889912399014237502529373804288304270563
# c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257

考点:分解n

EXP

import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
p=163515803000813412334620775647541652549604895368507102613553057136855632963322853570924931001138446030409251690646645635800254129997200577719209532684847732809399187385176309169421205833279943214621695444496660249881675974141488357432373412184140130503562295159152949524373214358417567189638680209172147385163
q=163515803000813412334620775647541652549604895368507102613553057136855632963322853570924931001138446030409251690646645635800254129997200577719209532684847732809399187385176309169421205833279943214621695444496660249881675974141488357432373412184140130503562295159152949524373214358417567189638680209172147385801
c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257


phi = (p-1) * (q-1)
n = p * q
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))
#flag{p&q_4re_t00_c1o5ed}

easyrsa7

e = 0x10001
p>>128<<128 = 0xd1c520d9798f811e87f4ff406941958bab8fc24b19a32c3ad89b0b73258ed3541e9ca696fd98ce15255264c39ae8c6e8db5ee89993fa44459410d30a0a8af700ae3aee8a9a1d6094f8c757d3b79a8d1147e85be34fb260a970a52826c0a92b46cefb5dfaf2b5a31edf867f8d34d2222900000000000000000000000000000000
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3
c = 0x1b2b4f9afed5fb5f9876757e959c183c2381ca73514b1918d2f123e386bebe9832835350f17ac439ac570c9b2738f924ef49afea02922981fad702012d69ea3a3c7d1fc8efc80e541ca2622d7741090b9ccd590906ac273ffcc66a7b8c0d48b7d62d6cd6dd4cd75747c55aac28f8be3249eb255d8750482ebf492692121ab4b27b275a0f69b15baef20bf812f3cbf581786128b51694331be76f80d6fb1314d8b280eaa16c767821b9c2ba05dfde5451feef22ac3cb3dfbc88bc1501765506f0c05045184292a75c475486b680f726f44ef8ddfe3c48f75bb03c8d44198ac70e6b7c885f53000654db22c8cee8eb4f65eaeea2da13887aaf53d8c254d2945691

考点:p低位丢失,sage恢复

EXP

#sage#
p = 0xd1c520d9798f811e87f4ff406941958bab8fc24b19a32c3ad89b0b73258ed3541e9ca696fd98ce15255264c39ae8c6e8db5ee89993fa44459410d30a0a8af700ae3aee8a9a1d6094f8c757d3b79a8d1147e85be34fb260a970a52826c0a92b46cefb5dfaf2b5a31edf867f8d34d2222900000000000000000000000000000000
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3

pbits = 1024
kbits = 128

PR.<x> = PolynomialRing(Zmod(n))
f = x + p
roots = f.small_roots(X=2^kbits, beta=0.4)
if roots:
    p = p+int(roots[0])
    print("p = "+str(p))

#p = 147305526294483975294006704928271118039370615054437206404408410848858740256154476278591035455064149531353089038270283281541411458250950936656537283482331598521457077465891874559349872035197398406708610440618635013091489698011474611145014167945729411970665381793142591665313979405475889978830728651549052207969
from Crypto.Util.number import *
from gmpy2 import *

e = 0x10001
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3
p = 147305526294483975294006704928271118039370615054437206404408410848858740256154476278591035455064149531353089038270283281541411458250950936656537283482331598521457077465891874559349872035197398406708610440618635013091489698011474611145014167945729411970665381793142591665313979405475889978830728651549052207969
q = n // p
c = 0x1b2b4f9afed5fb5f9876757e959c183c2381ca73514b1918d2f123e386bebe9832835350f17ac439ac570c9b2738f924ef49afea02922981fad702012d69ea3a3c7d1fc8efc80e541ca2622d7741090b9ccd590906ac273ffcc66a7b8c0d48b7d62d6cd6dd4cd75747c55aac28f8be3249eb255d8750482ebf492692121ab4b27b275a0f69b15baef20bf812f3cbf581786128b51694331be76f80d6fb1314d8b280eaa16c767821b9c2ba05dfde5451feef22ac3cb3dfbc88bc1501765506f0c05045184292a75c475486b680f726f44ef8ddfe3c48f75bb03c8d44198ac70e6b7c885f53000654db22c8cee8eb4f65eaeea2da13887aaf53d8c254d2945691

phi_n = (p - 1) * (q - 1)

d = invert(e, phi_n)
m = pow(c, d, n)
print(long_to_bytes(m))
#flag{Kn0wn_Hi9h_Bit5}

easyrsa8

考点:公钥解析

在线工具解出n e

利用在线网站 对n进行因数分解 得到 p、q

密文为flag.enc文件内容

EXP

import gmpy2
from Crypto.Cipher import PKCS1_OAEP
#PKCS1 OAEP 是一种基于 RSA 和 OAEP 填充的非对称密码
from Crypto.PublicKey import RSA

e = 65537
n = 10306247299477991196335954707897189353577589618180446614762218980226685668311143526740800444344046158260556585833057716406703213966249956775927205061731821632025483608182881492214855240841820024816859031176291364212054293818204399157346955465232586109199762630150640804366966946066155685218609638749171632685073
p = 106249972159566919549855203174197828387397831115262336234662051342543151219702510584956705611794290291345944183845955839244363030579896461607496959399297130227066841321473005074379950936513608503266587950271044991876848389878395867601515004796212227929894460104645781488319246866661398816686697306692491058609
q = n//p

phi_n = (p-1)*(q-1)
d = int(gmpy2.invert(e,phi_n))

rsakey = RSA.importKey(open(r'public.key', 'r').read())
privatekey = RSA.construct((n,e,d,p,q))
rsa = PKCS1_OAEP.new(privatekey)
m = rsa.decrypt(open(r'flag.enc', 'rb').read())
print(m)
#flag{p_1s_5mall_num6er}

funnyrsa1

e1 = 14606334023791426
p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248

e2 = 13813369129257838
p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649
c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919

考点:两个e,c,q不同,两个p相同

EXP

from Cryptodome.Util.number import *
import gmpy2
from libnum import *

e1 = 14606334023791426
p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593
c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248
n1 = p1 * q1

e2 = 13813369129257838
p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859
q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649
c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919
n2 = p2 * q2

p = p1
phi1 = (p - 1) * (q1 - 1)
phi2 = (p - 1) * (q2 - 1)
b = gmpy2.gcd(e1, phi1)
a1 = e1 // b
a2 = e2 // b
bd1 = gmpy2.invert(a1, phi1)
bd2 = gmpy2.invert(a2, phi2)

mb1 = pow(c1, bd1, n1)
mb2 = pow(c2, bd2, n2)
c3 = mb1 * mb2 % p
c2 = mb2 % q2
c1 = mb1 % q1

res = solve_crt([c1, c2, c3], [q1, q2, p])  # crt中国同余定理,求出特解作为
print(res)

n = q1 * q2
f = (q1 - 1) * (q2 - 1)
m = res % n
d2 = gmpy2.invert(7, f)
m = pow(m, d2, n)
msg = gmpy2.iroot(m, 2)[0]
print(long_to_bytes(msg))
#flag{gcd_e&\xcf\x86_isn't_1}
#结果\xcf\x86需要utf-8编码转字符,形式为\xXX形式的utf-8编码

funnyrsa2

from Crypto.Util.number import getPrime
import libnum
from secret import flag

e = 0x10001
p = getPrime(80)
q = getPrime(80)
r = getPrime(80)
n = p * q * r
m = libnum.s2n(flag)
c = pow(m,e,n)
print("n =", n)
print("c =", c)
# n = 897607935780955837078784515115186203180822213482989041398073067996023639
# c = 490571531583321382715358426750276448536961994273309958885670149895389968

考点:n分解出多个因子

EXP

import gmpy2
from Crypto.Util.number import long_to_bytes
n = 897607935780955837078784515115186203180822213482989041398073067996023639

e = 65537
c = 490571531583321382715358426750276448536961994273309958885670149895389968

p1=932470255754103340237147
p2=1098382268985762240184333
p3=876391552113414716726089

phi = (p1 - 1) * (p2 - 1) * (p3 - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
#flag{what_that_fvck_r}

funnyrsa3

e = 65537
n = 13851998696110232034312408768370264747862778787235362033287301947690834384177869107768578977872169953363148442670412868565346964490724532894099772144625540138618913694240688555684873934424471837897053658485573395777349902581306875149677867098014969597240339327588421766510008083189109825385296069501377605893298996953970043168244444585264894721914216744153344106498382558756181912535774309211692338879110643793628550244212618635476290699881188640645260075209594318725693972840846967120418641315829098807385382509029722923894508557890331485536938749583463709142484622852210528766911899504093351926912519458381934550361
dp = 100611735902103791101540576986246738909129436434351921338402204616138072968334504710528544150282236463859239501881283845616704984276951309172293190252510177093383836388627040387414351112878231476909883325883401542820439430154583554163420769232994455628864269732485342860663552714235811175102557578574454173473
c = 6181444980714386809771037400474840421684417066099228619603249443862056564342775884427843519992558503521271217237572084931179577274213056759651748072521423406391343404390036640425926587772914253834826777952428924120724879097154106281898045222573790203042535146780386650453819006195025203611969467741808115336980555931965932953399428393416196507391201647015490298928857521725626891994892890499900822051002774649242597456942480104711177604984775375394980504583557491508969320498603227402590571065045541654263605281038512927133012338467311855856106905424708532806690350246294477230699496179884682385040569548652234893413

考点:dp泄露

EXP

import gmpy2 as gp
e = 65537
n = gp.mpz(13851998696110232034312408768370264747862778787235362033287301947690834384177869107768578977872169953363148442670412868565346964490724532894099772144625540138618913694240688555684873934424471837897053658485573395777349902581306875149677867098014969597240339327588421766510008083189109825385296069501377605893298996953970043168244444585264894721914216744153344106498382558756181912535774309211692338879110643793628550244212618635476290699881188640645260075209594318725693972840846967120418641315829098807385382509029722923894508557890331485536938749583463709142484622852210528766911899504093351926912519458381934550361)
dp = gp.mpz(100611735902103791101540576986246738909129436434351921338402204616138072968334504710528544150282236463859239501881283845616704984276951309172293190252510177093383836388627040387414351112878231476909883325883401542820439430154583554163420769232994455628864269732485342860663552714235811175102557578574454173473)
c = gp.mpz(6181444980714386809771037400474840421684417066099228619603249443862056564342775884427843519992558503521271217237572084931179577274213056759651748072521423406391343404390036640425926587772914253834826777952428924120724879097154106281898045222573790203042535146780386650453819006195025203611969467741808115336980555931965932953399428393416196507391201647015490298928857521725626891994892890499900822051002774649242597456942480104711177604984775375394980504583557491508969320498603227402590571065045541654263605281038512927133012338467311855856106905424708532806690350246294477230699496179884682385040569548652234893413
)
for x in range(1, e):
    if(e*dp%x==1):
        p=(e*dp-1)//x+1
        if(n%p!=0):
            continue
        q=n//p
        phin=(p-1)*(q-1)
        d=gp.invert(e, phin)
        m=gp.powmod(c, d, n)
        if(len(hex(m)[2:])%2==1):
            continue
        print('--------------')
        print(m)
        print(hex(m)[2:])
        print(bytes.fromhex(hex(m)[2:]))
#flag{dp_i5_1eak}

unusualrsa1

# ********************
# @Author: Lazzaro
# ********************

from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes
from random import randint
from secret import flag

p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(n)

m = bytes_to_long(long_to_bytes(randint(0,30))*208+flag)
assert(m.bit_length()==2044)
print((m>>315)<<315)
c = pow(m,3,n)
print(c)

#14113948189208713011909396304970377626324044633561155020366406284451614054260708934598840781397326960921718892801653205159753091559901114082556464576477585198060530094478860626532455065960136263963965819002575418616768412539016154873800614138683106056209070597212668250136909436974469812231498651367459717175769611385545792201291192023843434476550550829737236225181770896867698281325858412643953550465132756142888893550007041167700300621499970661661288422834479368072744930285128061160879720771910458653611076539210357701565156322144818787619821653007453741709031635862923191561438148729294430924288173571196757351837
#1520800285708753284739523608878585974609134243280728660335545667177630830064371336150456537012842986526527904043383436211487979254140749228004148347597566264500276581990635110200009305900689510908049771218073767918907869112593870878204145615928290375086195098919355531430003571366638390993296583488184959318678321571278510231561645872308920917404996519309473979203661442792048291421574603018835698487725981963573816645574675640357569465990665689618997534740389987351864738104038598104713275375385003471306823348792559733332094774873827383320058176803218213042061965933143968710199376164960850951030741280074168795136
#6635663565033382363211849843446648120305449056573116171933923595209656581213410699649926913276685818674688954045817246263487415328838542489103709103428412175252447323358040041217431171817865818374522191881448865227314554997131690963910348820833080760482835650538394814181656599175839964284713498394589419605748581347163389157651739759144560719049281761889094518791244702056048080280278984031050608249265997808217512349309696532160108250480622956599732443714546043439089844571655280770141647694859907985919056009576606333143546094941635324929407538860140272562570973340199814409134962729885962133342668270226853146819

考点:CopperSmith攻击 低位数据缺失-知m高位

sage恢复m

EXP

#sage#
e = 3
n = 14113948189208713011909396304970377626324044633561155020366406284451614054260708934598840781397326960921718892801653205159753091559901114082556464576477585198060530094478860626532455065960136263963965819002575418616768412539016154873800614138683106056209070597212668250136909436974469812231498651367459717175769611385545792201291192023843434476550550829737236225181770896867698281325858412643953550465132756142888893550007041167700300621499970661661288422834479368072744930285128061160879720771910458653611076539210357701565156322144818787619821653007453741709031635862923191561438148729294430924288173571196757351837
c = 6635663565033382363211849843446648120305449056573116171933923595209656581213410699649926913276685818674688954045817246263487415328838542489103709103428412175252447323358040041217431171817865818374522191881448865227314554997131690963910348820833080760482835650538394814181656599175839964284713498394589419605748581347163389157651739759144560719049281761889094518791244702056048080280278984031050608249265997808217512349309696532160108250480622956599732443714546043439089844571655280770141647694859907985919056009576606333143546094941635324929407538860140272562570973340199814409134962729885962133342668270226853146819
 
m_high = 1520800285708753284739523608878585974609134243280728660335545667177630830064371336150456537012842986526527904043383436211487979254140749228004148347597566264500276581990635110200009305900689510908049771218073767918907869112593870878204145615928290375086195098919355531430003571366638390993296583488184959318678321571278510231561645872308920917404996519309473979203661442792048291421574603018835698487725981963573816645574675640357569465990665689618997534740389987351864738104038598104713275375385003471306823348792559733332094774873827383320058176803218213042061965933143968710199376164960850951030741280074168795136
 
pbits = 2044
kbits = 315
 
R.<x> = PolynomialRing(Zmod(n))
f = (m_high + x)^e - c
m_low = f.small_roots(2^kbits,0.4)[0]
m = int(m_high + m_low)
print("m =",m)
#m = 1520800285708753284739523608878585974609134243280728660335545667177630830064371336150456537012842986526527904043383436211487979254140749228004148347597566264500276581990635110200009305900689510908049771218073767918907869112593870878204145615928290375086195098919355531430003571366638390993296583488184959318678321571278510231561645872308920917404996519309473979203661442792048291421574603018835698487725981963573816645574675640357569465990665689618997534740389987351864738104038598104713275375385003471306823348792559733393609593321367463114703873343853590413300366406780333184299791982772652326424221774382732443261
from Crypto.Util.number import *
m = 1520800285708753284739523608878585974609134243280728660335545667177630830064371336150456537012842986526527904043383436211487979254140749228004148347597566264500276581990635110200009305900689510908049771218073767918907869112593870878204145615928290375086195098919355531430003571366638390993296583488184959318678321571278510231561645872308920917404996519309473979203661442792048291421574603018835698487725981963573816645574675640357569465990665689618997534740389987351864738104038598104713275375385003471306823348792559733393609593321367463114703873343853590413300366406780333184299791982772652326424221774382732443261

print(long_to_bytes(m))
#flag{r54__c0pp3r5m17h_p4r714l_m_4774ck_15_c00l~}

unusualrsa2

# ********************
# @Author: Lazzaro
# ********************

from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes
from functools import reduce
from secret import flag, x, y

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(n)

assert(reduce(lambda x,y:x&y,[(i-5)*i+6==0 for i in x]))
assert(reduce(lambda x,y:x&y,[(j-15)*j+44==0 for j in y]))

print(pow(reduce(lambda x,y:x*m+y,x),17,n))
print(pow(reduce(lambda x,y:x*m+y,y),17,n))

#23772599983135215481563178266884362291876571759991288577057472733374903836591330410574958472090396886895304944176208711481780781286891334062794555288959410390926474473859289842654809538435377431088422352076225067494924657598298955407771484146155998883073439266427190212827600119365643065276814044272790573450938596830336430371987561905132579730619341196199420897034988685012777895002554746080384319298123154671447844799088258541911028041717897434816921424155687677867019535399434825468160227242441375503664915265223696139025407768146464383537556265875013085702422829200814612395116961538432886116917063119749068212699
#10900151504654409767059699202929100225155892269473271859207513720755903691031362539478242920144073599515746938827937863835169270383721094542639011665235593065932998091574636525973099426040452626893461449084383663453549354608769727777329036059746386523843912382289597182615339786437186169811342356085836838520978047561127661777189045888648773949147220411427306098338616422692914110656004863767719312410906124366000507952960331116878197129010412361636679449281808407214524741732730279777729251515759320442591663641984363061618865267606007355576230009922421807527598213455112981354590909603317525854070358390622096569841
#17298679220717326374674940612143058330715465693318467692839033642321129433471254547497087746971317567301086124779289015934582615377165560688447452762043163082394944604062014490446763247008217251611443338103074143809936437694543761369945095202092750900940979469994907399829695696313513303922266742415376818434932335640062684245008822643258497589196668426788916969378417960200705779461808292296450298558001909603602502604228973101048082095642290047196235959438278631661658312398313171590515776453711432353011579809351076532129444735206408591345372296372378396539831385036814349328459266432393612919118094115543053115450

考点:Related Message Attack

 题目给了 n、c1、c2以及x和y的条件,用到了lambda表达式 和 reduce函数

EXP

#sage#
import binascii
def attack(c1, c2, n, e):
    PR.<x>=PolynomialRing(Zmod(n))
    # replace a,b,c,d
    g1 = (2*x+3)^e - c1
    g2 = (4*x+11)^e - c2
 
    def gcd(g1, g2):
        while g2:
            g1, g2 = g2, g1 % g2
        return g1.monic()
    return -gcd(g1, g2)[0]
c1 = 10900151504654409767059699202929100225155892269473271859207513720755903691031362539478242920144073599515746938827937863835169270383721094542639011665235593065932998091574636525973099426040452626893461449084383663453549354608769727777329036059746386523843912382289597182615339786437186169811342356085836838520978047561127661777189045888648773949147220411427306098338616422692914110656004863767719312410906124366000507952960331116878197129010412361636679449281808407214524741732730279777729251515759320442591663641984363061618865267606007355576230009922421807527598213455112981354590909603317525854070358390622096569841
c2 = 17298679220717326374674940612143058330715465693318467692839033642321129433471254547497087746971317567301086124779289015934582615377165560688447452762043163082394944604062014490446763247008217251611443338103074143809936437694543761369945095202092750900940979469994907399829695696313513303922266742415376818434932335640062684245008822643258497589196668426788916969378417960200705779461808292296450298558001909603602502604228973101048082095642290047196235959438278631661658312398313171590515776453711432353011579809351076532129444735206408591345372296372378396539831385036814349328459266432393612919118094115543053115450
n = 23772599983135215481563178266884362291876571759991288577057472733374903836591330410574958472090396886895304944176208711481780781286891334062794555288959410390926474473859289842654809538435377431088422352076225067494924657598298955407771484146155998883073439266427190212827600119365643065276814044272790573450938596830336430371987561905132579730619341196199420897034988685012777895002554746080384319298123154671447844799088258541911028041717897434816921424155687677867019535399434825468160227242441375503664915265223696139025407768146464383537556265875013085702422829200814612395116961538432886116917063119749068212699
e = 17
m1 = attack(c1, c2, n, e)
print(binascii.unhexlify("%x" % int(m1)))
#flag{r54__r3l473d_m355463_4774ck_4l50_c4ll3d_fr4nkl1n_r3173r_4774ck~}

unusualrsa3

# ********************
# @Author: Lazzaro
# ********************

p: 
2470567871

N: 
1932231392*x^255 + 1432733708*x^254 + 1270867914*x^253 + 1573324635*x^252 + 2378103997*x^251 + 820889786*x^250 + 762279735*x^249 + 1378353578*x^248 + 1226179520*x^247 + 657116276*x^246 + 1264717357*x^245 + 1015587392*x^244 + 849699356*x^243 + 1509168990*x^242 + 2407367106*x^241 + 873379233*x^240 + 2391647981*x^239 + 517715639*x^238 + 828941376*x^237 + 843708018*x^236 + 1526075137*x^235 + 1499291590*x^234 + 235611028*x^233 + 19615265*x^232 + 53338886*x^231 + 434434839*x^230 + 902171938*x^229 + 516444143*x^228 + 1984443642*x^227 + 966493372*x^226 + 1166227650*x^225 + 1824442929*x^224 + 930231465*x^223 + 1664522302*x^222 + 1067203343*x^221 + 28569139*x^220 + 2327926559*x^219 + 899788156*x^218 + 296985783*x^217 + 1144578716*x^216 + 340677494*x^215 + 254306901*x^214 + 766641243*x^213 + 1882320336*x^212 + 2139903463*x^211 + 1904225023*x^210 + 475412928*x^209 + 127723603*x^208 + 2015416361*x^207 + 1500078813*x^206 + 1845826007*x^205 + 797486240*x^204 + 85924125*x^203 + 1921772796*x^202 + 1322682658*x^201 + 2372929383*x^200 + 1323964787*x^199 + 1302258424*x^198 + 271875267*x^197 + 1297768962*x^196 + 2147341770*x^195 + 1665066191*x^194 + 2342921569*x^193 + 1450622685*x^192 + 1453466049*x^191 + 1105227173*x^190 + 2357717379*x^189 + 1044263540*x^188 + 697816284*x^187 + 647124526*x^186 + 1414769298*x^185 + 657373752*x^184 + 91863906*x^183 + 1095083181*x^182 + 658171402*x^181 + 75339882*x^180 + 2216678027*x^179 + 2208320155*x^178 + 1351845267*x^177 + 1740451894*x^176 + 1302531891*x^175 + 320751753*x^174 + 1303477598*x^173 + 783321123*x^172 + 1400145206*x^171 + 1379768234*x^170 + 1191445903*x^169 + 946530449*x^168 + 2008674144*x^167 + 2247371104*x^166 + 1267042416*x^165 + 1795774455*x^164 + 1976911493*x^163 + 167037165*x^162 + 1848717750*x^161 + 573072954*x^160 + 1126046031*x^159 + 376257986*x^158 + 1001726783*x^157 + 2250967824*x^156 + 2339380314*x^155 + 571922874*x^154 + 961000788*x^153 + 306686020*x^152 + 80717392*x^151 + 2454799241*x^150 + 1005427673*x^149 + 1032257735*x^148 + 593980163*x^147 + 1656568780*x^146 + 1865541316*x^145 + 2003844061*x^144 + 1265566902*x^143 + 573548790*x^142 + 494063408*x^141 + 1722266624*x^140 + 938551278*x^139 + 2284832499*x^138 + 597191613*x^137 + 476121126*x^136 + 1237943942*x^135 + 275861976*x^134 + 1603993606*x^133 + 1895285286*x^132 + 589034062*x^131 + 713986937*x^130 + 1206118526*x^129 + 311679750*x^128 + 1989860861*x^127 + 1551409650*x^126 + 2188452501*x^125 + 1175930901*x^124 + 1991529213*x^123 + 2019090583*x^122 + 215965300*x^121 + 532432639*x^120 + 1148806816*x^119 + 493362403*x^118 + 2166920790*x^117 + 185609624*x^116 + 184370704*x^115 + 2141702861*x^114 + 223551915*x^113 + 298497455*x^112 + 722376028*x^111 + 678813029*x^110 + 915121681*x^109 + 1107871854*x^108 + 1369194845*x^107 + 328165402*x^106 + 1792110161*x^105 + 798151427*x^104 + 954952187*x^103 + 471555401*x^102 + 68969853*x^101 + 453598910*x^100 + 2458706380*x^99 + 889221741*x^98 + 320515821*x^97 + 1549538476*x^96 + 909607400*x^95 + 499973742*x^94 + 552728308*x^93 + 1538610725*x^92 + 186272117*x^91 + 862153635*x^90 + 981463824*x^89 + 2400233482*x^88 + 1742475067*x^87 + 437801940*x^86 + 1504315277*x^85 + 1756497351*x^84 + 197089583*x^83 + 2082285292*x^82 + 109369793*x^81 + 2197572728*x^80 + 107235697*x^79 + 567322310*x^78 + 1755205142*x^77 + 1089091449*x^76 + 1993836978*x^75 + 2393709429*x^74 + 170647828*x^73 + 1205814501*x^72 + 2444570340*x^71 + 328372190*x^70 + 1929704306*x^69 + 717796715*x^68 + 1057597610*x^67 + 482243092*x^66 + 277530014*x^65 + 2393168828*x^64 + 12380707*x^63 + 1108646500*x^62 + 637721571*x^61 + 604983755*x^60 + 1142068056*x^59 + 1911643955*x^58 + 1713852330*x^57 + 1757273231*x^56 + 1778819295*x^55 + 957146826*x^54 + 900005615*x^53 + 521467961*x^52 + 1255707235*x^51 + 861871574*x^50 + 397953653*x^49 + 1259753202*x^48 + 471431762*x^47 + 1245956917*x^46 + 1688297180*x^45 + 1536178591*x^44 + 1833258462*x^43 + 1369087493*x^42 + 459426544*x^41 + 418389643*x^40 + 1800239647*x^39 + 2467433889*x^38 + 477713059*x^37 + 1898813986*x^36 + 2202042708*x^35 + 894088738*x^34 + 1204601190*x^33 + 1592921228*x^32 + 2234027582*x^31 + 1308900201*x^30 + 461430959*x^29 + 718926726*x^28 + 2081988029*x^27 + 1337342428*x^26 + 2039153142*x^25 + 1364177470*x^24 + 613659517*x^23 + 853968854*x^22 + 1013582418*x^21 + 1167857934*x^20 + 2014147362*x^19 + 1083466865*x^18 + 1091690302*x^17 + 302196939*x^16 + 1946675573*x^15 + 2450124113*x^14 + 1199066291*x^13 + 401889502*x^12 + 712045611*x^11 + 1850096904*x^10 + 1808400208*x^9 + 1567687877*x^8 + 2013445952*x^7 + 2435360770*x^6 + 2414019676*x^5 + 2277377050*x^4 + 2148341337*x^3 + 1073721716*x^2 + 1045363399*x + 1809685811

m^0x10001%N:  
922927962*x^254 + 1141958714*x^253 + 295409606*x^252 + 1197491798*x^251 + 2463440866*x^250 + 1671460946*x^249 + 967543123*x^248 + 119796323*x^247 + 1172760592*x^246 + 770640267*x^245 + 1093816376*x^244 + 196379610*x^243 + 2205270506*x^242 + 459693142*x^241 + 829093322*x^240 + 816440689*x^239 + 648546871*x^238 + 1533372161*x^237 + 1349964227*x^236 + 2132166634*x^235 + 403690250*x^234 + 835793319*x^233 + 2056945807*x^232 + 480459588*x^231 + 1401028924*x^230 + 2231055325*x^229 + 1716893325*x^228 + 16299164*x^227 + 1125072063*x^226 + 1903340994*x^225 + 1372971897*x^224 + 242927971*x^223 + 711296789*x^222 + 535407256*x^221 + 976773179*x^220 + 533569974*x^219 + 501041034*x^218 + 326232105*x^217 + 2248775507*x^216 + 1010397596*x^215 + 1641864795*x^214 + 1365178317*x^213 + 1038477612*x^212 + 2201213637*x^211 + 760847531*x^210 + 2072085932*x^209 + 168159257*x^208 + 70202009*x^207 + 1193933930*x^206 + 1559162272*x^205 + 1380642174*x^204 + 1296625644*x^203 + 1338288152*x^202 + 843839510*x^201 + 460174838*x^200 + 660412151*x^199 + 716865491*x^198 + 772161222*x^197 + 924177515*x^196 + 1372790342*x^195 + 320044037*x^194 + 117027412*x^193 + 814803809*x^192 + 1175035545*x^191 + 244769161*x^190 + 2116927976*x^189 + 617780431*x^188 + 342577832*x^187 + 356586691*x^186 + 695795444*x^185 + 281750528*x^184 + 133432552*x^183 + 741747447*x^182 + 2138036298*x^181 + 524386605*x^180 + 1231287380*x^179 + 1246706891*x^178 + 69277523*x^177 + 2124927225*x^176 + 2334697345*x^175 + 1769733543*x^174 + 2248037872*x^173 + 1899902290*x^172 + 409421149*x^171 + 1223261878*x^170 + 666594221*x^169 + 1795456341*x^168 + 406003299*x^167 + 992699270*x^166 + 2201384104*x^165 + 907692883*x^164 + 1667882231*x^163 + 1414341647*x^162 + 1592159752*x^161 + 28054099*x^160 + 2184618098*x^159 + 2047102725*x^158 + 103202495*x^157 + 1803852525*x^156 + 446464179*x^155 + 909116906*x^154 + 1541693644*x^153 + 166545130*x^152 + 2283548843*x^151 + 2348768005*x^150 + 71682607*x^149 + 484339546*x^148 + 669511666*x^147 + 2110974006*x^146 + 1634563992*x^145 + 1810433926*x^144 + 2388805064*x^143 + 1200258695*x^142 + 1555191384*x^141 + 363842947*x^140 + 1105757887*x^139 + 402111289*x^138 + 361094351*x^137 + 1788238752*x^136 + 2017677334*x^135 + 1506224550*x^134 + 648916609*x^133 + 2008973424*x^132 + 2452922307*x^131 + 1446527028*x^130 + 29659632*x^129 + 627390142*x^128 + 1695661760*x^127 + 734686497*x^126 + 227059690*x^125 + 1219692361*x^124 + 635166359*x^123 + 428703291*x^122 + 2334823064*x^121 + 204888978*x^120 + 1694957361*x^119 + 94211180*x^118 + 2207723563*x^117 + 872340606*x^116 + 46197669*x^115 + 710312088*x^114 + 305132032*x^113 + 1621042631*x^112 + 2023404084*x^111 + 2169254305*x^110 + 463525650*x^109 + 2349964255*x^108 + 626689949*x^107 + 2072533779*x^106 + 177264308*x^105 + 153948342*x^104 + 1992646054*x^103 + 2379817214*x^102 + 1396334187*x^101 + 2254165812*x^100 + 1300455472*x^99 + 2396842759*x^98 + 2398953180*x^97 + 88249450*x^96 + 1726340322*x^95 + 2004986735*x^94 + 2446249940*x^93 + 520126803*x^92 + 821544954*x^91 + 1177737015*x^90 + 676286546*x^89 + 1519043368*x^88 + 224894464*x^87 + 1742023262*x^86 + 142627164*x^85 + 1427710141*x^84 + 1504189919*x^83 + 688315682*x^82 + 1397842239*x^81 + 435187331*x^80 + 433176780*x^79 + 454834357*x^78 + 1046713282*x^77 + 1208458516*x^76 + 811240741*x^75 + 151611952*x^74 + 164192249*x^73 + 353336244*x^72 + 1779538914*x^71 + 1489144873*x^70 + 213140082*x^69 + 1874778522*x^68 + 908618863*x^67 + 1058334731*x^66 + 1706255211*x^65 + 708134837*x^64 + 1382118347*x^63 + 2111915733*x^62 + 1273497300*x^61 + 368639880*x^60 + 1652005004*x^59 + 1977610754*x^58 + 1412680185*x^57 + 2312775720*x^56 + 59793381*x^55 + 1345145822*x^54 + 627534850*x^53 + 2159477761*x^52 + 10450988*x^51 + 1479007796*x^50 + 2082579205*x^49 + 1158447154*x^48 + 126359830*x^47 + 393411272*x^46 + 2343384236*x^45 + 2191577465*x^44 + 1281188680*x^43 + 230049708*x^42 + 539600199*x^41 + 1711135601*x^40 + 1659775448*x^39 + 1716176055*x^38 + 904363231*x^37 + 2385749710*x^36 + 567278351*x^35 + 404199078*x^34 + 372670353*x^33 + 1286079784*x^32 + 1744355671*x^31 + 2316856064*x^30 + 2106475476*x^29 + 614988454*x^28 + 2149964943*x^27 + 1065233185*x^26 + 188130174*x^25 + 540415659*x^24 + 1031409799*x^23 + 1067085678*x^22 + 1005161755*x^21 + 249654085*x^20 + 1816791634*x^19 + 1437500292*x^18 + 448596413*x^17 + 2397497659*x^16 + 2353732701*x^15 + 2068949189*x^14 + 1826419168*x^13 + 1265366199*x^12 + 547031306*x^11 + 1016962374*x^10 + 160089486*x^9 + 2264803979*x^8 + 1081806194*x^7 + 824215340*x^6 + 497731793*x^5 + 45017166*x^4 + 317548920*x^3 + 1391127733*x^2 + 1752881284*x + 1290424106

考点:多项式RSA

题目给了 p、N、e、c  其中 N和c都是多项式

EXP

#sage#
p = 2470567871
R.<x> = PolynomialRing(GF(p))#构造以p为模的,关于x的多项式
N = 1932231392*x^255 + 1432733708*x^254 + 1270867914*x^253 + 1573324635*x^252 + 2378103997*x^251 + 820889786*x^250 + 762279735*x^249 + 1378353578*x^248 + 1226179520*x^247 + 657116276*x^246 + 1264717357*x^245 + 1015587392*x^244 + 849699356*x^243 + 1509168990*x^242 + 2407367106*x^241 + 873379233*x^240 + 2391647981*x^239 + 517715639*x^238 + 828941376*x^237 + 843708018*x^236 + 1526075137*x^235 + 1499291590*x^234 + 235611028*x^233 + 19615265*x^232 + 53338886*x^231 + 434434839*x^230 + 902171938*x^229 + 516444143*x^228 + 1984443642*x^227 + 966493372*x^226 + 1166227650*x^225 + 1824442929*x^224 + 930231465*x^223 + 1664522302*x^222 + 1067203343*x^221 + 28569139*x^220 + 2327926559*x^219 + 899788156*x^218 + 296985783*x^217 + 1144578716*x^216 + 340677494*x^215 + 254306901*x^214 + 766641243*x^213 + 1882320336*x^212 + 2139903463*x^211 + 1904225023*x^210 + 475412928*x^209 + 127723603*x^208 + 2015416361*x^207 + 1500078813*x^206 + 1845826007*x^205 + 797486240*x^204 + 85924125*x^203 + 1921772796*x^202 + 1322682658*x^201 + 2372929383*x^200 + 1323964787*x^199 + 1302258424*x^198 + 271875267*x^197 + 1297768962*x^196 + 2147341770*x^195 + 1665066191*x^194 + 2342921569*x^193 + 1450622685*x^192 + 1453466049*x^191 + 1105227173*x^190 + 2357717379*x^189 + 1044263540*x^188 + 697816284*x^187 + 647124526*x^186 + 1414769298*x^185 + 657373752*x^184 + 91863906*x^183 + 1095083181*x^182 + 658171402*x^181 + 75339882*x^180 + 2216678027*x^179 + 2208320155*x^178 + 1351845267*x^177 + 1740451894*x^176 + 1302531891*x^175 + 320751753*x^174 + 1303477598*x^173 + 783321123*x^172 + 1400145206*x^171 + 1379768234*x^170 + 1191445903*x^169 + 946530449*x^168 + 2008674144*x^167 + 2247371104*x^166 + 1267042416*x^165 + 1795774455*x^164 + 1976911493*x^163 + 167037165*x^162 + 1848717750*x^161 + 573072954*x^160 + 1126046031*x^159 + 376257986*x^158 + 1001726783*x^157 + 2250967824*x^156 + 2339380314*x^155 + 571922874*x^154 + 961000788*x^153 + 306686020*x^152 + 80717392*x^151 + 2454799241*x^150 + 1005427673*x^149 + 1032257735*x^148 + 593980163*x^147 + 1656568780*x^146 + 1865541316*x^145 + 2003844061*x^144 + 1265566902*x^143 + 573548790*x^142 + 494063408*x^141 + 1722266624*x^140 + 938551278*x^139 + 2284832499*x^138 + 597191613*x^137 + 476121126*x^136 + 1237943942*x^135 + 275861976*x^134 + 1603993606*x^133 + 1895285286*x^132 + 589034062*x^131 + 713986937*x^130 + 1206118526*x^129 + 311679750*x^128 + 1989860861*x^127 + 1551409650*x^126 + 2188452501*x^125 + 1175930901*x^124 + 1991529213*x^123 + 2019090583*x^122 + 215965300*x^121 + 532432639*x^120 + 1148806816*x^119 + 493362403*x^118 + 2166920790*x^117 + 185609624*x^116 + 184370704*x^115 + 2141702861*x^114 + 223551915*x^113 + 298497455*x^112 + 722376028*x^111 + 678813029*x^110 + 915121681*x^109 + 1107871854*x^108 + 1369194845*x^107 + 328165402*x^106 + 1792110161*x^105 + 798151427*x^104 + 954952187*x^103 + 471555401*x^102 + 68969853*x^101 + 453598910*x^100 + 2458706380*x^99 + 889221741*x^98 + 320515821*x^97 + 1549538476*x^96 + 909607400*x^95 + 499973742*x^94 + 552728308*x^93 + 1538610725*x^92 + 186272117*x^91 + 862153635*x^90 + 981463824*x^89 + 2400233482*x^88 + 1742475067*x^87 + 437801940*x^86 + 1504315277*x^85 + 1756497351*x^84 + 197089583*x^83 + 2082285292*x^82 + 109369793*x^81 + 2197572728*x^80 + 107235697*x^79 + 567322310*x^78 + 1755205142*x^77 + 1089091449*x^76 + 1993836978*x^75 + 2393709429*x^74 + 170647828*x^73 + 1205814501*x^72 + 2444570340*x^71 + 328372190*x^70 + 1929704306*x^69 + 717796715*x^68 + 1057597610*x^67 + 482243092*x^66 + 277530014*x^65 + 2393168828*x^64 + 12380707*x^63 + 1108646500*x^62 + 637721571*x^61 + 604983755*x^60 + 1142068056*x^59 + 1911643955*x^58 + 1713852330*x^57 + 1757273231*x^56 + 1778819295*x^55 + 957146826*x^54 + 900005615*x^53 + 521467961*x^52 + 1255707235*x^51 + 861871574*x^50 + 397953653*x^49 + 1259753202*x^48 + 471431762*x^47 + 1245956917*x^46 + 1688297180*x^45 + 1536178591*x^44 + 1833258462*x^43 + 1369087493*x^42 + 459426544*x^41 + 418389643*x^40 + 1800239647*x^39 + 2467433889*x^38 + 477713059*x^37 + 1898813986*x^36 + 2202042708*x^35 + 894088738*x^34 + 1204601190*x^33 + 1592921228*x^32 + 2234027582*x^31 + 1308900201*x^30 + 461430959*x^29 + 718926726*x^28 + 2081988029*x^27 + 1337342428*x^26 + 2039153142*x^25 + 1364177470*x^24 + 613659517*x^23 + 853968854*x^22 + 1013582418*x^21 + 1167857934*x^20 + 2014147362*x^19 + 1083466865*x^18 + 1091690302*x^17 + 302196939*x^16 + 1946675573*x^15 + 2450124113*x^14 + 1199066291*x^13 + 401889502*x^12 + 712045611*x^11 + 1850096904*x^10 + 1808400208*x^9 + 1567687877*x^8 + 2013445952*x^7 + 2435360770*x^6 + 2414019676*x^5 + 2277377050*x^4 + 2148341337*x^3 + 1073721716*x^2 + 1045363399*x + 1809685811
 
c = 922927962*x^254 + 1141958714*x^253 + 295409606*x^252 + 1197491798*x^251 + 2463440866*x^250 + 1671460946*x^249 + 967543123*x^248 + 119796323*x^247 + 1172760592*x^246 + 770640267*x^245 + 1093816376*x^244 + 196379610*x^243 + 2205270506*x^242 + 459693142*x^241 + 829093322*x^240 + 816440689*x^239 + 648546871*x^238 + 1533372161*x^237 + 1349964227*x^236 + 2132166634*x^235 + 403690250*x^234 + 835793319*x^233 + 2056945807*x^232 + 480459588*x^231 + 1401028924*x^230 + 2231055325*x^229 + 1716893325*x^228 + 16299164*x^227 + 1125072063*x^226 + 1903340994*x^225 + 1372971897*x^224 + 242927971*x^223 + 711296789*x^222 + 535407256*x^221 + 976773179*x^220 + 533569974*x^219 + 501041034*x^218 + 326232105*x^217 + 2248775507*x^216 + 1010397596*x^215 + 1641864795*x^214 + 1365178317*x^213 + 1038477612*x^212 + 2201213637*x^211 + 760847531*x^210 + 2072085932*x^209 + 168159257*x^208 + 70202009*x^207 + 1193933930*x^206 + 1559162272*x^205 + 1380642174*x^204 + 1296625644*x^203 + 1338288152*x^202 + 843839510*x^201 + 460174838*x^200 + 660412151*x^199 + 716865491*x^198 + 772161222*x^197 + 924177515*x^196 + 1372790342*x^195 + 320044037*x^194 + 117027412*x^193 + 814803809*x^192 + 1175035545*x^191 + 244769161*x^190 + 2116927976*x^189 + 617780431*x^188 + 342577832*x^187 + 356586691*x^186 + 695795444*x^185 + 281750528*x^184 + 133432552*x^183 + 741747447*x^182 + 2138036298*x^181 + 524386605*x^180 + 1231287380*x^179 + 1246706891*x^178 + 69277523*x^177 + 2124927225*x^176 + 2334697345*x^175 + 1769733543*x^174 + 2248037872*x^173 + 1899902290*x^172 + 409421149*x^171 + 1223261878*x^170 + 666594221*x^169 + 1795456341*x^168 + 406003299*x^167 + 992699270*x^166 + 2201384104*x^165 + 907692883*x^164 + 1667882231*x^163 + 1414341647*x^162 + 1592159752*x^161 + 28054099*x^160 + 2184618098*x^159 + 2047102725*x^158 + 103202495*x^157 + 1803852525*x^156 + 446464179*x^155 + 909116906*x^154 + 1541693644*x^153 + 166545130*x^152 + 2283548843*x^151 + 2348768005*x^150 + 71682607*x^149 + 484339546*x^148 + 669511666*x^147 + 2110974006*x^146 + 1634563992*x^145 + 1810433926*x^144 + 2388805064*x^143 + 1200258695*x^142 + 1555191384*x^141 + 363842947*x^140 + 1105757887*x^139 + 402111289*x^138 + 361094351*x^137 + 1788238752*x^136 + 2017677334*x^135 + 1506224550*x^134 + 648916609*x^133 + 2008973424*x^132 + 2452922307*x^131 + 1446527028*x^130 + 29659632*x^129 + 627390142*x^128 + 1695661760*x^127 + 734686497*x^126 + 227059690*x^125 + 1219692361*x^124 + 635166359*x^123 + 428703291*x^122 + 2334823064*x^121 + 204888978*x^120 + 1694957361*x^119 + 94211180*x^118 + 2207723563*x^117 + 872340606*x^116 + 46197669*x^115 + 710312088*x^114 + 305132032*x^113 + 1621042631*x^112 + 2023404084*x^111 + 2169254305*x^110 + 463525650*x^109 + 2349964255*x^108 + 626689949*x^107 + 2072533779*x^106 + 177264308*x^105 + 153948342*x^104 + 1992646054*x^103 + 2379817214*x^102 + 1396334187*x^101 + 2254165812*x^100 + 1300455472*x^99 + 2396842759*x^98 + 2398953180*x^97 + 88249450*x^96 + 1726340322*x^95 + 2004986735*x^94 + 2446249940*x^93 + 520126803*x^92 + 821544954*x^91 + 1177737015*x^90 + 676286546*x^89 + 1519043368*x^88 + 224894464*x^87 + 1742023262*x^86 + 142627164*x^85 + 1427710141*x^84 + 1504189919*x^83 + 688315682*x^82 + 1397842239*x^81 + 435187331*x^80 + 433176780*x^79 + 454834357*x^78 + 1046713282*x^77 + 1208458516*x^76 + 811240741*x^75 + 151611952*x^74 + 164192249*x^73 + 353336244*x^72 + 1779538914*x^71 + 1489144873*x^70 + 213140082*x^69 + 1874778522*x^68 + 908618863*x^67 + 1058334731*x^66 + 1706255211*x^65 + 708134837*x^64 + 1382118347*x^63 + 2111915733*x^62 + 1273497300*x^61 + 368639880*x^60 + 1652005004*x^59 + 1977610754*x^58 + 1412680185*x^57 + 2312775720*x^56 + 59793381*x^55 + 1345145822*x^54 + 627534850*x^53 + 2159477761*x^52 + 10450988*x^51 + 1479007796*x^50 + 2082579205*x^49 + 1158447154*x^48 + 126359830*x^47 + 393411272*x^46 + 2343384236*x^45 + 2191577465*x^44 + 1281188680*x^43 + 230049708*x^42 + 539600199*x^41 + 1711135601*x^40 + 1659775448*x^39 + 1716176055*x^38 + 904363231*x^37 + 2385749710*x^36 + 567278351*x^35 + 404199078*x^34 + 372670353*x^33 + 1286079784*x^32 + 1744355671*x^31 + 2316856064*x^30 + 2106475476*x^29 + 614988454*x^28 + 2149964943*x^27 + 1065233185*x^26 + 188130174*x^25 + 540415659*x^24 + 1031409799*x^23 + 1067085678*x^22 + 1005161755*x^21 + 249654085*x^20 + 1816791634*x^19 + 1437500292*x^18 + 448596413*x^17 + 2397497659*x^16 + 2353732701*x^15 + 2068949189*x^14 + 1826419168*x^13 + 1265366199*x^12 + 547031306*x^11 + 1016962374*x^10 + 160089486*x^9 + 2264803979*x^8 + 1081806194*x^7 + 824215340*x^6 + 497731793*x^5 + 45017166*x^4 + 317548920*x^3 + 1391127733*x^2 + 1752881284*x + 1290424106
S.<x> = R.quotient(N)#关于x的瑞利定理
 
P, Q = N.factor()
print(N.factor())
P, Q = P[0], Q[0]
phi = (p ** P.degree() - 1) * (p ** Q.degree() - 1)
e = 0x10001
d = inverse_mod(e, phi)
 
m = pow(c,d,N)
m = "".join([chr(c) for c in m.list()])
print(m)
# flag{h4v3_y0u_533n_p0lyn0m14l_b453d_r54??}

unusualrsa4

# ********************
# @Author: Lazzaro
# ********************

from Crypto.Util.number import getPrime,bytes_to_long
from gmpy2 import invert
from secret import flag

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(invert(q,p))

e = 0x10001
d = invert(e,(p-1)*(q-1))
print(d)

c = pow(m,e,n)
print(c)


#113350138578125471637271827037682321496361317426731366252238155037440385105997423113671392038498349668206564266165641194668802966439465128197299073392773586475372002967691512324151673246253769186679521811837698540632534357656221715752733588763108463093085549826122278822507051740839450621887847679420115044512
#27451162557471435115589774083548548295656504741540442329428952622804866596982747294930359990602468139076296433114830591568558281638895221175730257057177963017177029796952153436494826699802526267315286199047856818119832831065330607262567182123834935483241720327760312585050990828017966534872294866865933062292893033455722786996125448961180665396831710915882697366767203858387536850040283296013681157070419459208544201363726008380145444214578735817521392863391376821427153094146080055636026442795625833039248405951946367504865008639190248509000950429593990524808051779361516918410348680313371657111798761410501793645137
#619543409290228183446186073184791934402487500047968659800765382797769750763696880547221266055431306972840980865602729031475343233357485820872268765911041297456664938715949124290204230537793877747551374176167292845717246943780371146830637073310108630812389581197831196039107931968703635129091224513813241403591357678410312272233389708366642638825455844282490676862737715585788829936919637988039113463707959069907015464745700766013573282604376277598510224455044288896809217461295080140187509519005245601483583507547733673523120385089098002298314719617693895392148294399937798485146568296114338393548124451378170302291

考点:考察数学原理 已知e、c、d、q模p逆

题目提示 :

Hint1:

ed=1+kφ

  1. 比较e与k比特位数
  2. 联立两式,尝试化简 (inv(q,p)·φ) mod p

Hint2:

  1. 费马小定理
  2. 对于任意 r,k1,k2,当 k2 为 k1 因子时,r mod k2≡(r mod k1) mod k2

 已知 e、d、c、inv(p,q) 且p、q同bit位数

Hint1: (可以爆破k求得φ(n)值)

根据提示 比较e与k比特位数   e与k同长  可以爆破 k 得到φ(n) :

Hint2:(可以求出不同倍数的p 取gcd即得到p)

则有

φ(n) mod p ≡ (p-1)(q-1) mod p ≡ -(q-1) mod p

-->  φ(n) = (p-1)(q-1) = n - p - q +1

-->  x·φ(n)  = xn - xp - xq +x mod p = -1 + x mod p

则有 x·φ(n) +1 -x = 0 mod p

  f = x·φ(n) +1 -x = kp     故p是f的因子(这个k和前面求得k没关系)

然后看hint2  :费马小定理   以及  对于任意 r,a1,a2,当 a2 为 a1 因子时,r mod a2≡(r mod a1) mod a2

这里虽然没有r ,但我们可以任意给r 赋个值  又因为 p 是 f 的因子,则  

因此 就是 p的倍数

 已知 φ(n)  r可以 赋两个不同值。

EXP:

# -*- coding: utf-8 -*-
from Crypto.Util.number import *
from gmpy2 import *
from itertools import *
 
q_1 = 113350138578125471637271827037682321496361317426731366252238155037440385105997423113671392038498349668206564266165641194668802966439465128197299073392773586475372002967691512324151673246253769186679521811837698540632534357656221715752733588763108463093085549826122278822507051740839450621887847679420115044512
d = 27451162557471435115589774083548548295656504741540442329428952622804866596982747294930359990602468139076296433114830591568558281638895221175730257057177963017177029796952153436494826699802526267315286199047856818119832831065330607262567182123834935483241720327760312585050990828017966534872294866865933062292893033455722786996125448961180665396831710915882697366767203858387536850040283296013681157070419459208544201363726008380145444214578735817521392863391376821427153094146080055636026442795625833039248405951946367504865008639190248509000950429593990524808051779361516918410348680313371657111798761410501793645137
c = 619543409290228183446186073184791934402487500047968659800765382797769750763696880547221266055431306972840980865602729031475343233357485820872268765911041297456664938715949124290204230537793877747551374176167292845717246943780371146830637073310108630812389581197831196039107931968703635129091224513813241403591357678410312272233389708366642638825455844282490676862737715585788829936919637988039113463707959069907015464745700766013573282604376277598510224455044288896809217461295080140187509519005245601483583507547733673523120385089098002298314719617693895392148294399937798485146568296114338393548124451378170302291
e = 0x10001
for k in range(1, e):
    t = e * d - 1  #hint1
    if t % k == 0:
        phi = t // k  #这里的phi就是 φ(n)
        kp = q_1 * phi - q_1 + 1
        x1 = pow(3, phi, kp) - 1  #这里3和5处的数字随便取
        x2 = pow(5, phi, kp) - 1
        x = gcd(x1, x2)
        if x.bit_length() == 1024:
            p = x
            q = invert(q_1, p)
            n, phi = p*q, (p-1)*(q-1)
            assert d == invert(e, phi)
            m = pow(c, d, n)
            print(long_to_bytes(m))
            break
# b'flag{wh47_1f_y0u_kn0w_1nv3r7_q_p~?}'

unusualrsa5

# ********************
# @Author: Lazzaro
# ********************

from Crypto.Util.number import bytes_to_long
from secret import flag

e = 0x14
p = 733089589724903586073820965792963746076789390539824437962807679954808310072656817423828613938510684864567664345751164944269489647964227519307980688068059059377123391499328155025962198363435968318689113750910755244276996554328840879221120846257832190569086861774466785101694608744384540722995426474322431441
q = 771182695213910447650732428220054698293987458796864628535794956332865106301119308051373568460701145677164052375651484670636989109023957702790185901445649197004100341656188532246838220216919835415376078688888076677350412398198442910825884505318258393640994788407100699355386681624118606588957344077387058721
n = p*q

m = bytes_to_long(flag)
c = pow(m,e,n)
print(c)


#406314720119562590605554101860453913891646775958515375190169046313074168423687276987576196367702523895650602252851191274766072774312855212771035294337840170341052016067631007495713764510925931612800335613551752201920460877432379214684677593342046715833439574705829048358675771542989832566579493199671622475225225451781214904100440695928239014046619329247750637911015313431804069312072581674845078940868349474663382442540424342613429896445329365750444298236684237769335405534090013035238333534521759502103604033307768304224154383880727399879024077733935062478113298538634071453067782212909271392163928445051705642

考点:e _phi不互素有限域情况

题目提示:有限域 n-th root

EXP

from Crypto.Util.number import  *
import libnum
 
p = 733089589724903586073820965792963746076789390539824437962807679954808310072656817423828613938510684864567664345751164944269489647964227519307980688068059059377123391499328155025962198363435968318689113750910755244276996554328840879221120846257832190569086861774466785101694608744384540722995426474322431441
q = 771182695213910447650732428220054698293987458796864628535794956332865106301119308051373568460701145677164052375651484670636989109023957702790185901445649197004100341656188532246838220216919835415376078688888076677350412398198442910825884505318258393640994788407100699355386681624118606588957344077387058721
n = 9057141637995599750120273501711128117576789048411357158233050845658505488383724832915968443730006384810721595601723748471745315354759415044859624198755098491311647992728384572103262800310263916249536898582100747311978019829291619921741682336800665277699122504431456051606407509905004993708771825443764723285750825546500765451509998514747599779552241055519485714649825416851221219747115910385536482995890893190128149999622905611239433481756073333147782531765685320972075370276543786386451560493093416152466142374684450770169257924330366774896526508005296520372463932722237001341584625279676089901419404816917142209281664709940400762785892142918132066900664643155176180059403739
c = 406314720119562590605554101860453913891646775958515375190169046313074168423687276987576196367702523895650602252851191274766072774312855212771035294337840170341052016067631007495713764510925931612800335613551752201920460877432379214684677593342046715833439574705829048358675771542989832566579493199671622475225225451781214904100440695928239014046619329247750637911015313431804069312072581674845078940868349474663382442540424342613429896445329365750444298236684237769335405534090013035238333534521759502103604033307768304224154383880727399879024077733935062478113298538634071453067782212909271392163928445051705642
e= 20
 
R.<x> = Zmod(p)[]
f = x ^ e - c
f = f.monic()
res1 = f.roots()
 
R.<x> = Zmod(q)[]
f = x ^ e - c
f = f.monic()
res2 = f.roots()
 
for i in res1:
    for j in res2:
        # 中国剩余定理
        m =libnum.solve_crt([int(i[0]),int(j[0])],[p,q])
        flag = long_to_bytes(m)
        if flag.startswith(b'flag'):
            print(flag)
# flag{r54__d34l1n6_w17h_3v3n_3 _&_f1nd1n6_n-7h_r0075~~}

红包四

from secrets import randbelow
from nationalsecret import p, r, k, flag

g = 2
y = pow(g, k, p)

def gogogo():
    print("Another chance:")
    t = int(input('t = '))
    c = randbelow(p)
    print("Here is my real challenge:")
    print(f'c = {c}')
    print("Give me your answer.")
    s = int(input('s = '))
    return pow(g, s, p) == t * pow(y, c, p) % p

def dododo():
    print("Here is my gift for National's Day!")
    t = pow(g, r, p)
    print(f't = {t}')
    print("What do you want?")
    c = int(input('c = '))
    s = (r + c*k) % (p - 1)
    print("This is another gift:")
    print(f's = {s}')

print("Happy National's Day!")
print("Don't play CTF these days.")
print("Just go out and play~")
print("Don't finish this chall,")
print("although I should tell you that")
print(f"p = {p}")


dododo()

if gogogo():
    print(f"FUIYOH! You can get flag: {flag}")
    print("and then go out and play!")
else:
    print("HAIYAA! You are wrong. Just go out and play!")

考点:数学计算+Related Message Attack

解题思路来源:https://blog.csdn.net/weixin_63231007/article/details/131737959

这是一道 nc交互的密码题。。。。

连接靶机得到:

Happy National's Day!
Don't play CTF these days.
Just go out and play~
Don't finish this chall,
although I should tell you that
p = 7526302761219292384516320458476826372797872663057451950281209134223968710706794896418657298098771066812159473328070946462804625151223418806039166782001991
Here is my gift for National's Day!
t = 59285549689505892056868344324448208820874232148807968788202283012051522375647232
What do you want?
c = 

 分析代码可知,要得到flag   而gogogo()函数返回就为True,在执行gogogo() 之前 会先执行dododo()   分析两个函数的逻辑

题目给了 g=2,p=7526302761219292384516320458476826372797872663057451950281209134223968710706794896418657298098771066812159473328070946462804625151223418806039166782001991

dododo() 中给了 的值t = 59285549689505892056868344324448208820874232148807968788202283012051522375647232

需要我们输入 c 计算s = (r + c*k) mod (p - 1)  并输出

这里有两个未知数 r、k 我们输入c=0  就只剩r一个未知数了 即可得到  s = r mod (p-1) 

t、p、s已知 结合:

  • 2^r mod p = t
  • r mod (p-1) = s

可以求出来 r=265,得到 r的值之后,s = (r + c*k) mod (p - 1) 便只剩下了一个未知数了

我们给 c 赋值1、2

根据公式:

  • r + k mod (p-1) = s1
  • r + 2*k mod (p-1) = s2

求K   思想:Related Message Attack

# n是p-1
n = 7526302761219292384516320458476826372797872663057451950281209134223968710706794896418657298098771066812159473328070946462804625151223418806039166782001990
s1 = 5203637065410876209210522770601417320599666097370753594371567079527528187720710020402735935579372598420047179803477749301701871164082715520274463690067523
s2 = 2880971369602460033904725082726008268401459531684055238461925024831087664734625144386814573059974130027934886278884552140599117176942012234509760598132791
e = 1
 
R.<x> = PolynomialRing(Zmod(n))
g1 = (x+265)^e - s1
g2 = (2*x+265)^e - s2
 
def myGcd(x, y):
    if y == 0:
        return x.monic()
    return myGcd(y, x%y)
 
v = myGcd(g2, g1)
M = n - v.coefficients()[0]
 
assert g1(M) == 0
print(int(M))
#5203637065410876209210522770601417320599666097370753594371567079527528187720710020402735935579372598420047179803477749301701871164082715520274463690067258

得出:

K=5203637065410876209210522770601417320599666097370753594371567079527528187720710020402735935579372598420047179803477749301701871164082715520274463690067258

然后再来看 gogogo()函数:

让我们输入两个数  t 和  s   输出 c的值

返回值为:pow(g, s, p) == t * pow(y, c, p) % p

g、p、y、c 都已知,因此我们需要做的就是 通过输入 s、t 满足:pow(g, s, p) == t * pow(y, c, p) % p

我们令 t=1 这样计算简单一些 ,其中 y 根据题目给的条件  y=g^k mod p

因此 pow(y, c, p) % p  相当于  g^ck  mod p

题目可以转换为要满足  g^s mod p =  g^ck  mod p

c、k已知   输入的 s值为 c*k即可:

c=6680664053885173708585114206895914038061635570714198861579939569110571304122920943296482827161923185503919651799904045769838936912973587667753821310843809
k=5203637065410876209210522770601417320599666097370753594371567079527528187720710020402735935579372598420047179803477749301701871164082715520274463690067258
m =c * k
print(m)
#34763751092354973085426352795032782470849417952031681567473770020128084325473478985304826772713237897531947403206713855510557745923315457005085407191264369837160361485986697119896027428964841168890552164196958385705220366858233277355897266036338283728583001693027216990221070569460188668148295345519942905722

完整过程:

Happy National's Day!
Don't play CTF these days.
Just go out and play~
Don't finish this chall,
although I should tell you that
p = 7526302761219292384516320458476826372797872663057451950281209134223968710706794896418657298098771066812159473328070946462804625151223418806039166782001991
Here is my gift for National's Day!
t = 59285549689505892056868344324448208820874232148807968788202283012051522375647232
What do you want?
c = 0
This is another gift:
s = 265
Another chance:
t = 1
Here is my real challenge:
c = 6680664053885173708585114206895914038061635570714198861579939569110571304122920943296482827161923185503919651799904045769838936912973587667753821310843809
Give me your answer.
s = 34763751092354973085426352795032782470849417952031681567473770020128084325473478985304826772713237897531947403206713855510557745923315457005085407191264369837160361485986697119896027428964841168890552164196958385705220366858233277355897266036338283728583001693027216990221070569460188668148295345519942905722
FUIYOH! You can get flag: ctfshow{db1de3f6-db76-4743-974a-cc063809f07f}

and then go out and play!

5203637065410876209210522770601417320599666097370753594371567079527528187720710020402735935579372598420047179803477749301701871164082715520274463690067258

萌新赛

签到题

Ao(mgHX^E)AN2PSBOu3qI0o

考点:base85

flag{base85_here}

抱我

cstring = 'abcdefghijklmnopqrstuvwxyz{}_0123456789'
key = 'flag{********}'
length = 300

def encode():
    res = ''
    for i in range(1, length):
        c = random.randint(0, 36)
        res += cstring[c]
        for n in range(10):
            c = random.randint(0, len(key) - 1)
            res += key[c]
    return res

#qdfl33{6{6gs3afa6{3}agf{}aagdf}6fl36d{dfl{6ay6gafddfg}{j3f}}6la{3}bfdf3}gla}65}lg6g6dflf0{dfgd3fdfgc{g6a}a3{6}mfa{}f}f}}}3363}}f6a6a7g{a}g66{d3xgfffg}a}3}_{lad}a33ga5fd33}{{dl}{}f{3da}g}3egfal{a3l}3f33}dfdda{3sa{d6g{ff}6vgl33d6g333h{gd{{lg6ldg{ad{3333a6oalf6a{33{de3{fa}ggl{abfd}6}6}}l33fa}f{{3{3fla}a6}af}{amg}{{d}}a6gallfg36{g3dh{{{a{lfg3{sll6g6gfaggid6d{3afl}3rff3gfad3d}1dlllff6}6}h3g66gla336b{6d3gf}f{30d63l}3dfl6a3llfgld3{}qg}gf}dg{6l}3gal}agdl6{lg{g}ddfaaealf{f3llgge3ad3{3adf{c}fllf6f}3at{aag}a66d3}ad{dfg{}dlz6gld}6{3flxgf{3g3ald}3g}g63f6ggf3}gfd}f3ga3efllf6}363fu6366fdlggfx6}6l3}}a{afg{{}}3fdaluaa}al{dg3dpfga}}l}d3l4afg}f{d{lgcfgffglal}dq6l}fgflldavdad6}df{}dw}l6g}}{l3gf6fdaa66aadt}f6lg{dg33h{fa3d{}laao3l6aal{lfdv{3dlf6af36bddg}3ggad3o}{}3g3fgddyffd3lddgdd6{gdfl{{la3ild}dg{g}dgef{a3{d6dfgq3adll{fdadt}66fdflg{3x{l3ll}3{{g4a3af6lag3gdaf66dadg6dfglaf66l3f{2}6{afaf}3l6all}{l}lfdla6{fgff{}g13dl{a{6{l6rd6}}l3dgg3_f{66gll{f6a3d3dga6{lg}{g}d{6{d36lll3dd6{3dg3afal}d}gff26}l}al}}{a6}g66gaaff}0fga{g6dfld{{}fglf{af}iddf6g6}l361{ag}{{dlfak}{d3fa{6{godgg{l36a{gmllgfa3fa{}f}}3{a6{a3{nafg{l3d6}g2lf6{gg}{g}sg{ga{63g{}la6g{g6{{63o6{l}{3}l3ag36{af33g3dw6d33f3lfdan{dddad{{6l6}}fad63lgd1ffaa}g}3flkg3d}aalf3lbgf{g}f}}d3agf{ld{dl3l4fl{{3fla}}r3g}{}gda{}_df3g}fa36gq}la{f{6l}66fgdg}6ag6feaal6all3{d}lfgl}}{{6lal}gf}}gfgd4d{g36daff}l6fd63ag6}f7}l3{{d}{al6lff66gda}f7dfaf6}fd3ldfgfl36gf337a6al663afd{dff}6}df{lt}66}ag6a3{na}3la{6daa}63fgldf3ggcl6dd{3fg{}}gfgaf{633lpfadalldgglg{l}{6}gf{agf6{3l3a366wa6l6}fdla}wfl}33}d{6d6aa}laldag}bgaa3gff}3db{gd}lfga3{}ffddd6}{la4}3{agdg3{}bf33adg3a632d}66f}dgd67}{333dfg}}mgg3all3l}fd6dd3{g}{}}v6}a6f6lgd3nfgg6aff3a}d3da{l3ldldz{}{}g3}6fdg6f{gd{g3adx{gll6{fg3dc63lf}6dl{d63f3g{3adda5f3dgfla3{6}gd{3{d6dlldal6g66}{ddp}lalafd}d{lgl}g6g33agjg}33dgf}lg0adlda6gfdlx{3g}{g3a{a76}gdf3la}lh}l{l{}}a6gm{gdd{agg}6xfgg}{336}d_a{df3}df33jgf}6d3}}f}h3l{6ga6fll2}dd{l36d66}ldafdlga3gbgd}d6df}ff1gf6a{ll3a3w{3g}allfafldal}aal}dlra33l3f}3dff{6{6}f}la}lgf}}}gd{f3z3l3{d3636dpl3fag3{faa1{3ga33l}6ll6{gg6}ddf}t6g}{gl6ggl{d}aafalf{lw6a{dad}}a3x{ada{fg6d}a3g{d{fggdawdfal{{3dlfndl636}36alv633ada6gf6hd{3l66ddlfpglda}{g3fdogdfa3}3g}3k3d3gda33}dvd}laa{fa{a{{}a}36}}}{r6d6{a6}}6{0laa36gd{36kf63a{3}gga4af6}f3gfgf0lf{6g}{{6}pafg6dg}g6{b}3d36ad6d{h6f3agff}63p}{l3ag3}lf1f3dgd{66a37}}}d6gglaftaf3l6a3{{a7{lgd3d}fl6tlfl663lgg3wa}33gl}d{3i6aaagl6{{}n3gd}l3l6}l7a{gf{a}l}f3al{alg63fln{{dd}3l{ll1}{3g}6{6}{u63{f3{g6lgf{3d}{636}{u3}{f6d{{d3lg{3l6aldf{i{f366{f3l{eg{d{gll{3dhgdgfgaf{}}g}{lg3{a{flm}fa3ldf{d32fagllf{{66q363}dl66gg2fa6af6d6g37lffl{d{3lltgl33}}{}d3o{lfld3d{}a6a663a66{fabfd6ld333g3rafa}}fddfgt{ggad3ag}lr63af6lgg}gy{6{{6}6dd626{gl6a{ad3b3df}alf3afdaf66ll}lf6jd}3{6dldfgg}f3lg63l{lr3ff3l{gafaa}f}agl6l33xglfggg{{{fq66}g6lfa3{736lllflalglf}{}gf{aggdg3{a}}da{fp6fglla3l}65gf36{l6dl}g}f{la6{l{fpf{}63{f6gdfaalf6{dffgdgf{lgaf{f{56}g6af63l6a}a}{lfa{3gblda}l}{fl{s{g}}6{g6la56g6g3{f}ddfaa{l}dg6g}0glda6{6d}ff}f{6laadd6zaag{l3l}6dc}f3gg}lffgsag}l3l6d3apd3gd3fd}}aga3ga}a3{6f1f3df{{d}}av3laf}6adf3_d{afa6f}adt{faf{d33aaol3}{l}ld}3yl3a6a{fa6}_d33gf3fll}of{6lad}}fdx}6d{f}ll63ugag66d{6f3}33}al6l{ffwf{}{fl3a36ogg3{}}g6}3hl}6dg6ld{digaa}g}{{l}da{ddg3{{d}w3}ld}adgg3m{lad{gd{a{7afff}{d6}fsf3{f}gflgavfldg6a6{ldqf}fd{f3f3}73ddad{666fz6}d{3{l36a1d6fal3fl6lrl{}aga{fdlsa}{6l6ag3gtgdg{6lgf3f

分析可知,最外层循环有299次(从1开始到300),每次随机选取0-36区间的数字,然后在cstring里取对应数字位置的字符,作为密文,一次最外层循环中有10次小循环,每次小循环会随机选取(0, len(key) - 1)区间的一个数字,然后取key中对应位置的字符作为密文。相当于一次最外层循环会获得11个字符的密文,但是每组的第一个字符不是key中的字符,所以要将每次最外层循环的第一个字符去掉。

代码如下:

res='qdfl33{6{6gs3afa6{3}agf{}aagdf}6fl36d{dfl{6ay6gafddfg}{j3f}}6la{3}bfdf3}gla}65}lg6g6dflf0{dfgd3fdfgc{g6a}a3{6}mfa{}f}f}}}3363}}f6a6a7g{a}g66{d3xgfffg}a}3}_{lad}a33ga5fd33}{{dl}{}f{3da}g}3egfal{a3l}3f33}dfdda{3sa{d6g{ff}6vgl33d6g333h{gd{{lg6ldg{ad{3333a6oalf6a{33{de3{fa}ggl{abfd}6}6}}l33fa}f{{3{3fla}a6}af}{amg}{{d}}a6gallfg36{g3dh{{{a{lfg3{sll6g6gfaggid6d{3afl}3rff3gfad3d}1dlllff6}6}h3g66gla336b{6d3gf}f{30d63l}3dfl6a3llfgld3{}qg}gf}dg{6l}3gal}agdl6{lg{g}ddfaaealf{f3llgge3ad3{3adf{c}fllf6f}3at{aag}a66d3}ad{dfg{}dlz6gld}6{3flxgf{3g3ald}3g}g63f6ggf3}gfd}f3ga3efllf6}363fu6366fdlggfx6}6l3}}a{afg{{}}3fdaluaa}al{dg3dpfga}}l}d3l4afg}f{d{lgcfgffglal}dq6l}fgflldavdad6}df{}dw}l6g}}{l3gf6fdaa66aadt}f6lg{dg33h{fa3d{}laao3l6aal{lfdv{3dlf6af36bddg}3ggad3o}{}3g3fgddyffd3lddgdd6{gdfl{{la3ild}dg{g}dgef{a3{d6dfgq3adll{fdadt}66fdflg{3x{l3ll}3{{g4a3af6lag3gdaf66dadg6dfglaf66l3f{2}6{afaf}3l6all}{l}lfdla6{fgff{}g13dl{a{6{l6rd6}}l3dgg3_f{66gll{f6a3d3dga6{lg}{g}d{6{d36lll3dd6{3dg3afal}d}gff26}l}al}}{a6}g66gaaff}0fga{g6dfld{{}fglf{af}iddf6g6}l361{ag}{{dlfak}{d3fa{6{godgg{l36a{gmllgfa3fa{}f}}3{a6{a3{nafg{l3d6}g2lf6{gg}{g}sg{ga{63g{}la6g{g6{{63o6{l}{3}l3ag36{af33g3dw6d33f3lfdan{dddad{{6l6}}fad63lgd1ffaa}g}3flkg3d}aalf3lbgf{g}f}}d3agf{ld{dl3l4fl{{3fla}}r3g}{}gda{}_df3g}fa36gq}la{f{6l}66fgdg}6ag6feaal6all3{d}lfgl}}{{6lal}gf}}gfgd4d{g36daff}l6fd63ag6}f7}l3{{d}{al6lff66gda}f7dfaf6}fd3ldfgfl36gf337a6al663afd{dff}6}df{lt}66}ag6a3{na}3la{6daa}63fgldf3ggcl6dd{3fg{}}gfgaf{633lpfadalldgglg{l}{6}gf{agf6{3l3a366wa6l6}fdla}wfl}33}d{6d6aa}laldag}bgaa3gff}3db{gd}lfga3{}ffddd6}{la4}3{agdg3{}bf33adg3a632d}66f}dgd67}{333dfg}}mgg3all3l}fd6dd3{g}{}}v6}a6f6lgd3nfgg6aff3a}d3da{l3ldldz{}{}g3}6fdg6f{gd{g3adx{gll6{fg3dc63lf}6dl{d63f3g{3adda5f3dgfla3{6}gd{3{d6dlldal6g66}{ddp}lalafd}d{lgl}g6g33agjg}33dgf}lg0adlda6gfdlx{3g}{g3a{a76}gdf3la}lh}l{l{}}a6gm{gdd{agg}6xfgg}{336}d_a{df3}df33jgf}6d3}}f}h3l{6ga6fll2}dd{l36d66}ldafdlga3gbgd}d6df}ff1gf6a{ll3a3w{3g}allfafldal}aal}dlra33l3f}3dff{6{6}f}la}lgf}}}gd{f3z3l3{d3636dpl3fag3{faa1{3ga33l}6ll6{gg6}ddf}t6g}{gl6ggl{d}aafalf{lw6a{dad}}a3x{ada{fg6d}a3g{d{fggdawdfal{{3dlfndl636}36alv633ada6gf6hd{3l66ddlfpglda}{g3fdogdfa3}3g}3k3d3gda33}dvd}laa{fa{a{{}a}36}}}{r6d6{a6}}6{0laa36gd{36kf63a{3}gga4af6}f3gfgf0lf{6g}{{6}pafg6dg}g6{b}3d36ad6d{h6f3agff}63p}{l3ag3}lf1f3dgd{66a37}}}d6gglaftaf3l6a3{{a7{lgd3d}fl6tlfl663lgg3wa}33gl}d{3i6aaagl6{{}n3gd}l3l6}l7a{gf{a}l}f3al{alg63fln{{dd}3l{ll1}{3g}6{6}{u63{f3{g6lgf{3d}{636}{u3}{f6d{{d3lg{3l6aldf{i{f366{f3l{eg{d{gll{3dhgdgfgaf{}}g}{lg3{a{flm}fa3ldf{d32fagllf{{66q363}dl66gg2fa6af6d6g37lffl{d{3lltgl33}}{}d3o{lfld3d{}a6a663a66{fabfd6ld333g3rafa}}fddfgt{ggad3ag}lr63af6lgg}gy{6{{6}6dd626{gl6a{ad3b3df}alf3afdaf66ll}lf6jd}3{6dldfgg}f3lg63l{lr3ff3l{gafaa}f}agl6l33xglfggg{{{fq66}g6lfa3{736lllflalglf}{}gf{aggdg3{a}}da{fp6fglla3l}65gf36{l6dl}g}f{la6{l{fpf{}63{f6gdfaalf6{dffgdgf{lgaf{f{56}g6af63l6a}a}{lfa{3gblda}l}{fl{s{g}}6{g6la56g6g3{f}ddfaa{l}dg6g}0glda6{6d}ff}f{6laadd6zaag{l3l}6dc}f3gg}lffgsag}l3l6d3apd3gd3fd}}aga3ga}a3{6f1f3df{{d}}av3laf}6adf3_d{afa6f}adt{faf{d33aaol3}{l}ld}3yl3a6a{fa6}_d33gf3fll}of{6lad}}fdx}6d{f}ll63ugag66d{6f3}33}al6l{ffwf{}{fl3a36ogg3{}}g6}3hl}6dg6ld{digaa}g}{{l}da{ddg3{{d}w3}ld}adgg3m{lad{gd{a{7afff}{d6}fsf3{f}gflgavfldg6a6{ldqf}fd{f3f3}73ddad{666fz6}d{3{l36a1d6fal3fl6lrl{}aga{fdlsa}{6l6ag3gtgdg{6lgf3f'
def decode(res):
    flag = ''
    for i in range(1, len(res), 11):
        flag += res[i:i + 10]
    return flag
 
print(decode(res))

得到

dfl33{6{6g3afa6{3}ag{}aagdf}6f36d{dfl{6a6gafddfg}{3f}}6la{3}fdf3}gla}6}lg6g6dflf{dfgd3fdfg{g6a}a3{6}fa{}f}f}}}363}}f6a6ag{a}g66{d3gfffg}a}3}{lad}a33gafd33}{{dl}}f{3da}g}3gfal{a3l}333}dfdda{3a{d6g{ff}6gl33d6g333{gd{{lg6ld{ad{3333a6alf6a{33{d3{fa}ggl{afd}6}6}}l3fa}f{{3{3fa}a6}af}{ag}{{d}}a6gllfg36{g3d{{{a{lfg3{ll6g6gfaggd6d{3afl}3ff3gfad3d}dlllff6}6}3g66gla336{6d3gf}f{3d63l}3dfl63llfgld3{}g}gf}dg{6l3gal}agdl6lg{g}ddfaaalf{f3llgg3ad3{3adf{}fllf6f}3a{aag}a66d3ad{dfg{}dl6gld}6{3flgf{3g3ald}g}g63f6ggf}gfd}f3ga3fllf6}363f6366fdlggf6}6l3}}a{ag{{}}3fdalaa}al{dg3dfga}}l}d3lafg}f{d{lgfgffglal}d6l}fgflldadad6}df{}d}l6g}}{l3g6fdaa66aad}f6lg{dg33{fa3d{}laa3l6aal{lfd{3dlf6af36ddg}3ggad3}{}3g3fgddffd3lddgdd{gdfl{{la3ld}dg{g}dgf{a3{d6dfg3adll{fdad}66fdflg{3{l3ll}3{{ga3af6lag3gaf66dadg6dglaf66l3f{}6{afaf}3lall}{l}lfda6{fgff{}g3dl{a{6{l6d6}}l3dgg3f{66gll{f63d3dga6{lg{g}d{6{d36ll3dd6{3dgafal}d}gff6}l}al}}{a}g66gaaff}fga{g6dfld{}fglf{af}ddf6g6}l36{ag}{{dlfa}{d3fa{6{gdgg{l36a{gllgfa3fa{}}}3{a6{a3{afg{l3d6}glf6{gg}{g}g{ga{63g{}a6g{g6{{636{l}{3}l3a36{af33g3d6d33f3lfda{dddad{{6l}}fad63lgdffaa}g}3flg3d}aalf3lgf{g}f}}d3gf{ld{dl3lfl{{3fla}}3g}{}gda{}df3g}fa36g}la{f{6l}6fgdg}6ag6faal6all3{dlfgl}}{{6ll}gf}}gfgdd{g36daff}6fd63ag6}f}l3{{d}{allff66gda}fdfaf6}fd3lfgfl36gf33a6al663afddff}6}df{l}66}ag6a3{a}3la{6daa63fgldf3ggl6dd{3fg{}gfgaf{633lfadalldggl{l}{6}gf{af6{3l3a366a6l6}fdla}fl}33}d{6daa}laldag}gaa3gff}3d{gd}lfga3{ffddd6}{la}3{agdg3{}f33adg3a63d}66f}dgd6}{333dfg}}gg3all3l}f6dd3{g}{}}6}a6f6lgd3fgg6aff3a}3da{l3ldld{}{}g3}6fd6f{gd{g3ad{gll6{fg3d63lf}6dl{d3f3g{3addaf3dgfla3{6gd{3{d6dllal6g66}{dd}lalafd}d{gl}g6g33agg}33dgf}lgadlda6gfdl{3g}{g3a{a6}gdf3la}l}l{l{}}a6g{gdd{agg}6fgg}{336}da{df3}df33gf}6d3}}f}3l{6ga6fll}dd{l36d66ldafdlga3ggd}d6df}ffgf6a{ll3a3{3g}allfafdal}aal}dla33l3f}3df{6{6}f}la}gf}}}gd{f33l3{d3636dl3fag3{faa{3ga33l}6l6{gg6}ddf}6g}{gl6ggld}aafalf{l6a{dad}}a3{ada{fg6d}3g{d{fggdadfal{{3dlfdl636}36al633ada6gf6d{3l66ddlfglda}{g3fdgdfa3}3g}33d3gda33}dd}laa{fa{a{}a}36}}}{6d6{a6}}6{laa36gd{36f63a{3}ggaaf6}f3gfgflf{6g}{{6}afg6dg}g6{}3d36ad6d{6f3agff}63}{l3ag3}lff3dgd{66a3}}}d6gglafaf3l6a3{{a{lgd3d}fl6lfl663lgg3a}33gl}d{36aaagl6{{}3gd}l3l6}la{gf{a}l}fal{alg63fl{{dd}3l{ll}{3g}6{6}{63{f3{g6lg{3d}{636}{3}{f6d{{d3g{3l6aldf{{f366{f3l{g{d{gll{3dgdgfgaf{}}}{lg3{a{fl}fa3ldf{d3fagllf{{66363}dl66ggfa6af6d6g3lffl{d{3llgl33}}{}d3{lfld3d{}aa663a66{fafd6ld333g3afa}}fddfg{ggad3ag}l63af6lgg}g{6{{6}6dd66{gl6a{ad33df}alf3afaf66ll}lf6d}3{6dldfg}f3lg63l{l3ff3l{gafa}f}agl6l33glfggg{{{f66}g6lfa3{36lllflalgf}{}gf{aggg3{a}}da{f6fglla3l}6gf36{l6dl}}f{la6{l{ff{}63{f6gdaalf6{dffggf{lgaf{f{6}g6af63l6}a}{lfa{3glda}l}{fl{{g}}6{g6la6g6g3{f}ddaa{l}dg6g}glda6{6d}f}f{6laadd6aag{l3l}6d}f3gg}lffgag}l3l6d3ad3gd3fd}}aa3ga}a3{6ff3df{{d}}a3laf}6adf3d{afa6f}ad{faf{d33aal3}{l}ld}3l3a6a{fa6}d33gf3fll}f{6lad}}fd}6d{f}ll63gag66d{6f333}al6l{fff{}{fl3a36gg3{}}g6}3l}6dg6ld{dgaa}g}{{l}a{ddg3{{d}3}ld}adgg3{lad{gd{a{afff}{d6}ff3{f}gflgafldg6a6{ldf}fd{f3f3}3ddad{666f6}d{3{l36ad6fal3fl6ll{}aga{fdla}{6l6ag3ggdg{6lgf3f

词频分析得到 3fgadl6去除flag,只剩36d了,因此答案也就出来了。

妈呀,完了

提示:图文无关,和妈呀有关

01000100 01010011 01111001 00110011 01001010 01111001 01001011 01110110 01010000 01000011 01010000 01101101 01001000 00110100 01010111 01000011 01111010 00101011 01010100 01101000 01010111 01101001 00110010 01000110 01100111 01001011 01101111 00111001 01100101 01010011 01010000 01010101 00110100 01100101 00110101 01100111 00101011 01101010 01011010 01010101 00110011 01000110 01110010 01010111 01001110 01110110 01001100 01001101 00110101 00110101 01101011 01000101 01100110 00110001 01101000 01000101 01101101 01001110 01110010 01110101 00101011 01001110 01000101 00110011

解码得到

DSy3JyKvPCPmH4WCz+ThWi2FgKo9eSPU4e5g+jZU3FrWNvLM55kEf1hEmNru+NE3

根据提示 :妈呀!玛雅就应该知道key是20121221,不知道的可以积累下,小经验

AES在线解码

http://tool.chacuo.net/cryptaes

内部赛

签到

MyU1RCU1Q2FtbldvNCUyOEYlMjMlMjZXYUo0Y3QrayUyMyslMjFEc0Zja0tVNjVHJTVDUGlZWFM0JTI0RmNqdyU1RGE0Y0V6ayUyNSslMjE5JTVCSVFTYWQlM0M0JTIxJTNBZ283WEMzekUlM0UlM0RCJTVEJTVDMyU1REYuayUyNCslMjFVZkdIazNYJTIxNCUyMWhobEkrUi5ISG4lM0QlMjFVNDUlMjdGKmslMjMqbiUzRkFHR2p3WCUyNjQlMjFRJTNEayUyMytCSlRGJTIxU1BhSzRjRXJpWlhkJTNGOUUlM0RrJTNCWCUyNDRCJTVDTG1wWEMzJTdDRiUyM1NQWm80QiUzQW9wJTVEWCUyMy5ESCUyQ2srWCUyODMlNUQlNUNhbW5XbzQlMjhGJTIzJTI2V2FKNGN0K2slMjMrJTIxRHNHR2pvVTY1RyU1Q1BpWVhTNCUyNEZjJTNDdiU1RGE0Y0V6ayUyNSslMjElM0Y5RFhTYWQlM0M0JTIxJTNBZ283WEM0JTIxRSUzRSUzREIlNUQlNUMzJTVERi5rJTI0KyUyMVAlMkNHSGszWCUyMTQlMjFoaG1uV04uSEhuJTNEJTIxVTQ1JTI3RiUyNmxIKm4lM0ZBR0dqd1glMjY0JTIxUSUzRGslMjMrQkpURiUyMVNQYUs0QkY2aVpYZCUzRjlFJTNEayUzQlglMjU0JTIxJTI0NG1wWEMzJTdDRiUyM1NQJTVEJTVDMnklM0FvcCU1RFglMjMuREglMkNrK1psMyU1RCU1Q2FtbldvNCUyOEYlMjMlMjZXUkQ0Y3QrayUyMyslMjFEc0dHandVNjVHJTVDUGlZWFM0JTI0RmQlM0N2JTVEYTRjRXprJTI1KyUyMTklNURFJTNEU2FkJTNDNCUyMSUzQWdvN1hDMyU3Q0UlM0UlM0RCJTVEJTVDMyU1REYuayUyNCslMjFVZkdIazNYJTIxNCUyMWhobW5XJTVFLkhIbiUzRCUyMVU0NSUyN0YlMjZsR1dvJTNGQUdHandYJTI2NCUyMVElM0RvNytCSlRGJTIxU1BhSzRCUTlpWlhkJTNGOUUlM0RrJTNCWCUyNTQlMjEvS21wWEMzJTdDRiUyM1NQWm41aCUzQW9wJTVEWCUyMy5ESCUyQ2srWm0zJTVEJTVDYW1uV280JTI4RiUyMyUyNldVMzRjdCtrJTIzKyUyMURzRmNrU1U2NUclNUNQaVlYUzQlMjZGJTIxJTI2RyU1RGE0Y0V6ayUyNSslMjE5JTVERFhTYWQlM0M0JTIxJTNBZ283WDM0LkUlM0UlM0RCJTVEJTVDMyU1REYuayUyNFglMjMlMjhlR0hrM1glMjE0JTIxaGhsSSpuLkhIbiUzRCUyMVU0NSUyN0YlMjZsSipuJTNGQUdHandYJTI2NCUyMSU1Q1BmaytCSlRGJTIxU1BhSzRCUTFpWlhkJTNGOUUlM0RrJTNCWCUyNDRCRXptcFhDMyU3Q0YlMjNTUCU1RCU1QzQlMjElM0FvcCU1RFglMjMuREglMkNrK1puMyU1RCU1Q2FtbldvNCUyOEYlMjMlMjZXUkQ0Y3QrayUyMyslMjFEc0dHandVNjVHJTVDUGlZWFM0JTI0RiUyNCUyNkclNURhNGNFemslMjUrJTIxJTNGOURYU2FkJTNDNCUyMSUzQWdvN1hDM3pFJTNFJTNEQiU1RCU1QzMlNURGLmslMjRYJTIzLkJHSGszWCUyMTQlMjFoaG1uV04uSEhuJTNEJTIxVTQ1JTI3RiUyNmslMjZXbyUzRkFHR2p3WCUyNjQlMjFROXNLK0JKVEYlMjFTUGFLNEJROWlaWGQlM0Y5RSUzRGslM0JYJTI0NEIlNUNMbXBYQzMlN0NGJTIzU1AlNUQlNUMyeSUzQW9wJTVEWCUyMy5ESCUyQ2szWCUyMTMlNUQlNUNhbW5XbzQlMjhGJTIzJTI2V1glMjE0Y3QrayUyMyslMjFEc0ZkJTI2T1U2NUclNUNQaVlYUzQlMjRGZCUyNkclNURhNGNFemslMjUrJTIxOSU1RERYU2FkJTNDNCUyMSUzQWdvN1hDM3hFJTNFJTNEQiU1RCU1QzMlNURGLmslMjQrMi4=

提示: 灿烂的星空,传说中美丽的梦

Cyber梭出来

3]\amnWo4(F#&WaJ4ct k# !DsFckKU65G\PiYXS4$Fcjw]a4cEzk% !9[IQSad<4!:go7XC3zE>=B]\3]F.k$ !UfGHk3X!4!hhlI R.HHn=!U45'F*k#*n?AGGjwX&4!Q=k# BJTF!SPaK4cEriZXd?9E=k;X$4B\LmpXC3|F#SPZo4B:op]X#.DH,k X(3]\amnWo4(F#&WaJ4ct k# !DsGGjoU65G\PiYXS4$Fc<v]a4cEzk% !?9DXSad<4!:go7XC4!E>=B]\3]F.k$ !P,GHk3X!4!hhmnWN.HHn=!U45'F&lH*n?AGGjwX&4!Q=k# BJTF!SPaK4BF6iZXd?9E=k;X%4!$4mpXC3|F#SP]\2y:op]X#.DH,k Zl3]\amnWo4(F#&WRD4ct k# !DsGGjwU65G\PiYXS4$Fd<v]a4cEzk% !9]E=Sad<4!:go7XC3|E>=B]\3]F.k$ !UfGHk3X!4!hhmnW^.HHn=!U45'F&lGWo?AGGjwX&4!Q=o7 BJTF!SPaK4BQ9iZXd?9E=k;X%4!/KmpXC3|F#SPZn5h:op]X#.DH,k Zm3]\amnWo4(F#&WU34ct k# !DsFckSU65G\PiYXS4&F!&G]a4cEzk% !9]DXSad<4!:go7X34.E>=B]\3]F.k$X#(eGHk3X!4!hhlI*n.HHn=!U45'F&lJ*n?AGGjwX&4!\Pfk BJTF!SPaK4BQ1iZXd?9E=k;X$4BEzmpXC3|F#SP]\4!:op]X#.DH,k Zn3]\amnWo4(F#&WRD4ct k# !DsGGjwU65G\PiYXS4$F$&G]a4cEzk% !?9DXSad<4!:go7XC3zE>=B]\3]F.k$X#.BGHk3X!4!hhmnWN.HHn=!U45'F&k&Wo?AGGjwX&4!Q9sK BJTF!SPaK4BQ9iZXd?9E=k;X$4B\LmpXC3|F#SP]\2y:op]X#.DH,k3X!3]\amnWo4(F#&WX!4ct k# !DsFd&OU65G\PiYXS4$Fd&G]a4cEzk% !9]DXSad<4!:go7XC3xE>=B]\3]F.k$ 2.

base92解码

257532363446257532363438257532363443257532363438257532363531257532363439257532363446257532363532257532363443257532363530257532363445257532363444257532363438257532363446257532363531257532363441257532363531257532363533257532363438257532363530257532363442257532363443257532363438257532363530257532363530257532363441257532363441257532363532257532363445257532363442257532363532257532363439257532363531257532363441257532363446257532363443257532363531257532363438257532363442257532363442257532363439257532363530257532363441257532363439257532363531257532363442257532363446257532363530257532363441257532363443257532363533257532363443257532363441257532363532257532363438257532363531257532363531257532363532257532363530257532363439257532363439257532363443257532363445257532363530257532363532257532363443257532363443257532363444257532363441257532363530257532363443

十进制 转换为16进制,再转字符串

import re
for i in re.findall(r".{2}","257532363446257532363438257532363443257532363438257532363531257532363439257532363446257532363532257532363443257532363530257532363445257532363444257532363438257532363446257532363531257532363441257532363531257532363533257532363438257532363530257532363442257532363443257532363438257532363530257532363530257532363441257532363441257532363532257532363445257532363442257532363532257532363439257532363531257532363441257532363446257532363443257532363531257532363438257532363442257532363442257532363439257532363530257532363441257532363439257532363531257532363442257532363446257532363530257532363441257532363443257532363533257532363443257532363441257532363532257532363438257532363531257532363531257532363532257532363530257532363439257532363439257532363443257532363445257532363530257532363532257532363443257532363443257532363444257532363441257532363530257532363443"):
    print(chr(int(i,16)),end="")
%u264F%u2648%u264C%u2648%u2651%u2649%u264F%u2652%u264C%u2650%u264E%u264D%u2648%u264F%u2651%u264A%u2651%u2653%u2648%u2650%u264B%u264C%u2648%u2650%u2650%u264A%u264A%u2652%u264E%u264B%u2652%u2649%u2651%u264A%u264F%u264C%u2651%u2648%u264B%u264B%u2649%u2650%u264A%u2649%u2651%u264B%u264F%u2650%u264A%u264C%u2653%u264C%u264A%u2652%u2648%u2651%u2651%u2652%u2650%u2649%u2649%u264C%u264E%u2650%u2652%u264C%u264C%u264D%u264A%u2650%u264C

url 解码

♏♈♌♈♑♉♏♒♌♐♎♍♈♏♑♊♑♓♈♐♋♌♈♐♐♊♊♒♎♋♒♉♑♊♏♌♑♈♋♋♉♐♊♉♑♋♏♐♊♌♓♌♊♒♈♑♑♒♐♉♉♌♎♐♒♌♌♍♊♐♌

十二进制转16进制

十二星座的符号,联想到十二进制,分别对应 0123456789ab

白羊座 ♈ U+2648(3月21日 - 4月20日)
金牛座 ♉ U+2649(4月21日 - 5月21日)
双子座 ♊ U+264A(5月22日 - 6月21日)
巨蟹座 ♋ U+264B(6月22日 - 7月22日)
狮子座 ♌ U+264C(7月23日 - 8月22日)
处女座 ♍ U+264D(8月23日 - 9月22日)
天秤座 ♎ U+264E(9月23日 - 10月23日)
天蝎座 ♏ U+264F(10月24日 - 11月22日)
射手座 ♐ U+2650(11月23日 - 12月21日)
摩羯座 ♑ U+2651(12月22日 - 1月20日)
水瓶座 ♒ U+2652(1月21日 - 2月19日)
双鱼座 ♓ U+2653(2月20日 - 3月20日)

十二星座的顺序依次为白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座、摩羯座、水瓶座、双鱼座。  他们对应的12进制为

7040917a486507929b083408822a63a1927490331821937824b42a099a811468a445284

 转十六得到

3636364336313637374234393546344334463536343535463333333634343744

转ASCII

666C61677B495F4C4F56455F3336447D

base16 解密 

flag{I_LOVE_36D}

avbv编码(Easy)

不会

密码2


ctfctfshowctf
ctfshowctfctf
ctfshow
showshowctf
showshowshowshowshow showshowshowshowshow showshowctfctfctf showctfctfctf
showshowctfctfctf ctfctfctfshowshow showctfshowctf showctfctf
showctfctfctfctf showshowshowshowshow showctfctf showctfshowctf
showshowctfctfctf showshowctfctfctf ctfctfctfshowshow showctfshowctf
ctfctfctfctfctf ctfctfshowshowshow ctfctfctfctfshow showctfctf
ctfctfctfctfshow ctf showctfctfctf ctfshow
showshowshowshowshow showshowshowshowshow showshowctfctfctf showctfctf

考点:摩斯密码

因为只有ctf和show,所以联想到摩斯密码,转化后得到:

..-./.-../.-/--./-----/-----/--.../-.../--.../...--/-.-./-../-..../-----/-../-.-./--.../--.../...--/-.-./...../..---/....-/-../....-/./-.../.-/-----/-----/--.../-../

 

007B73CD60DC773C524D4EBA007D

然后再进行4位16进制转换 https://the-x.cn/encodings/Hex.aspx

BJDCTF2020

签到

welcome to crypto world!! 密文:424a447b57653163306d655f74345f424a444354467d

编码与调制

密文:2559659965656A9A65656996696965A6695669A9695A699569666A5A6A6569666A59695A69AA696569666AA6

考点:曼彻斯特

首先了解曼彻斯特编码,10为1,01为0

将密文转化为2进制,再两位进行一个划分进行曼彻斯特编码,再转化为十六进制,再转ASCII

脚本:

import re
x='2559659965656A9A65656996696965A6695669A9695A699569666A5A6A6569666A59695A69AA696569666AA6'
strr=bin(int(x,16))[2:]
print(strr)

step = 2
str2 = [strr[i:i+step] for i in range(0,len(strr),step)]
print(str2)
flag = []
final = ""
for i in str2:
    flag.append(i)
for i in flag:
    if(i=="10"):
        final += "1"
    if(i=="01"):
        final += "0"
print(hex(int(final,2)))
#424a447b4469664d616e63686573746572636f64657d
for i in re.findall(r".{2}","424a447b4469664d616e63686573746572636f64657d"):
    print(chr(int(i,16)),end="")

#BJD{DifManchestercode}

Polybius

hint:VGhlIGxlbmd0aCBvZiB0aGlzIHBsYWludGV4dDogMTQ= flag 长度14

密文:ouauuuoooeeaaiaeauieuooeeiea hint:VGhlIGxlbmd0aCBvZiB0aGlzIHBsYWludGV4dDogMTQ= flag:解出明文后,请加上BJD{}

波利比奥斯方阵密码:一般解密出来是14位,由于不知道aeiou的顺序所以分类

import itertools
ciper = 'ouauuuoooeeaaiaeauieuooeeiea'
head = 'aeoiu'
headlist = []
num_headlist = []

# 先列举处aeiou五种的不同排序
x = itertools.permutations(head,5)
for i in x:
    temp = "".join(i)
    headlist.append(temp)
print(headlist)

# 根据aeiou对应的12345修改ciper的对应值,便于后续的遍历得到结果
for i in headlist:
    temp = ''
    for j in ciper:
        temp += str(i.index(j) + 1)        
    num_headlist.append(temp)
print(num_headlist)

# 将ciper对应的数字乘上比例加上96再转为ASCII码,即 可得到对应的字母
for i in num_headlist:
    temp = ''
    for j in range(0,len(i),2):
        xx = (int(i[j]) - 1)*5 + int(i[j+1]) + 96   # 前一个为乘上5加上后一个就正好对应了表格中的字母
        if xx>ord('i'):
            xx+=1
        temp += chr(xx)
    print(temp)
flagispolybius

easyrsa

from Crypto.Util.number import getPrime,bytes_to_long
from sympy import Derivative
from fractions import Fraction
from secret import flag

p=getPrime(1024)
q=getPrime(1024)
e=65537
n=p*q
z=Fraction(1,Derivative(arctan(p),p))-Fraction(1,Derivative(arth(q),q))
m=bytes_to_long(flag)
c=pow(m,e,n)
print(c,z,n)
'''
output:
7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035
32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441

'''

EXP

import gmpy2
from Crypto.Util.number import long_to_bytes
c=7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035
z=32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
n=15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441
e=65537
 
hip=n-(gmpy2.iroot((z+2*n),2)[0])+1
d=gmpy2.invert(e,hip)
m=pow(c,d,n)
print(long_to_bytes(m))
#BJD{Advanced_mathematics_is_too_hard!!!}

rsa_output

{21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111,2767}

{21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111,3659}

message1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599

message2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227

共模攻击,n相同,e不同,加密相同的m

import gmpy2 
from Crypto.Util.number import getPrime, long_to_bytes 
e1 = 2767 
n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111
e2 = 3659 
c1= 20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
c2 = 11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
_, s1, s2 = gmpy2.gcdext(e1, e2) 
m = pow(c1, s1, n) * pow(c2, s2, n) % n 
print(long_to_bytes(m))
#BJD{r3a_C0mmoN_moD@_4ttack}

RSA

from Crypto.Util.number import getPrime,bytes_to_long

flag=open("flag","rb").read()

p=getPrime(1024)
q=getPrime(1024)
assert(e<100000)
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print c,n
print pow(294,e,n)

p=getPrime(1024)
n=p*q
m=bytes_to_long("BJD"*32)
c=pow(m,e,n)
print c,n

'''
output:
12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120  13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018
979153370552535153498477459720877329811204688208387543826122582132404214848454954722487086658061408795223805022202997613522014736983452121073860054851302343517756732701026667062765906277626879215457936330799698812755973057557620930172778859116538571207100424990838508255127616637334499680058645411786925302368790414768248611809358160197554369255458675450109457987698749584630551177577492043403656419968285163536823819817573531356497236154342689914525321673807925458651854768512396355389740863270148775362744448115581639629326362342160548500035000156097215446881251055505465713854173913142040976382500435185442521721  12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
'''

先用n1和n2求出公因数q,然后再爆破e。

 EXP

import gmpy2
import libnum
c1=12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120
n1=13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
c2=979153370552535153498477459720877329811204688208387543826122582132404214848454954722487086658061408795223805022202997613522014736983452121073860054851302343517756732701026667062765906277626879215457936330799698812755973057557620930172778859116538571207100424990838508255127616637334499680058645411786925302368790414768248611809358160197554369255458675450109457987698749584630551177577492043403656419968285163536823819817573531356497236154342689914525321673807925458651854768512396355389740863270148775362744448115581639629326362342160548500035000156097215446881251055505465713854173913142040976382500435185442521721
n2=12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
q=gmpy2.gcd(n1,n2)
p=n1//q
#pow(294,e,n)
x=381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018
e=0
for i in range(100000):
    if(pow(294,i,n1)==x):
        e=i#52361
        print(e)
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c1,d,n1)
print(libnum.n2s(int(m)))
# 52361
# b'BJD{p_is_common_divisor}'

这是base??

EXP

import base64
#dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h',33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}
dict='JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/='
base64_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/']
cipher='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'
res=''
for i in range(len(cipher)):
    for j in range(64):
        if(dict[j]==cipher[i]):
            res+=base64_list[j]
print(res)
flag=base64.b64decode(res)
print(flag)
#b'BJD{D0_Y0u_kNoW_Th1s_b4se_map}'

伏羲六十四卦

这是什么,怎么看起来像是再算64卦!!!

密文:升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有

嗯?为什么还有个b呢?
b=7


flag:请按照格式BJD{}
# -- coding:UTF-8 --
from secret import flag

def encrpyt5():
    enc=''
    for i in flag:
        enc+=chr((a*(ord(i)-97)+b)%26+97)
    return(enc)

def encrypt4():
    temp=''
    offset=5
    for i in range(len(enc)):
        temp+=chr(ord(enc[i])-offset-i)
    return(temp)

首先知道六十四卦的转换,就是每一卦都换成六位二进制

dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}

然后6位变8位,转换为字符,也就是转换为base64的过程

s='升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有'
dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}

cc=""
i=0
while True:
    if i >=len(s):
        break
    try:
        cc+=dic[s[i]]
    except:
        cc+=dic[s[i] + s[i + 1]]
        i+=1
    i+=1
x=""
end=cc
for i in range(0,len(end),8):
    ins=end[i:i+8]
    x+=chr(int(ins,2))
print(x)
#bl1oXF1ra2FbW2VpV1dfUmBiT11dYE5NVVdXSUZYSFVDUA==
bl1oXF1ra2FbW2VpV1dfUmBiT11dYE5NVVdXSUZYSFVDUA==

base64解码得

n]h\]kka[[eiWW_R`bO]]`NMUWWIFXHUCP

然后先解decrypt4,再解decrypt5

EXP

# -- coding:UTF-8 --

'''
from secret import flag

def encrpyt5():
    enc=''
    for i in flag:
        enc+=chr((a*(ord(i)-97)+b)%26+97)
    return(enc)

def encrypt4():
    temp=''
    offset=5
    for i in range(len(enc)):
        temp+=chr(ord(enc[i])-offset-i)
    return(temp)

'''

def decrypt4(enc):
    temp=''
    offset=5
    for i in range(len(enc)):
        temp+=chr(ord(enc[i])+offset+i)
    return temp
def decrypt5(flag):
    for a in range(1,200):
        enc = ''
        for i in flag:
            for k in range(200):
                 if (ord(i) - 97 - 7+26*k)%a==0:
                    enc+= chr((ord(i) - 97 - 7 + 26 * k) // a + 97)
                    break
        print(enc)

s='升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有'
dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}
li=[]
k=0
for i in range(len(s)):
    if k ==1:
        k=0
        continue
    try:
        li.append(dic[s[i]])
    except:
        t=''
        t=t+s[i]+s[i+1]
        li.append(dic[t])
        k=1
ss=''.join(li)
print(ss)
enc=''
for i in range(0,len(ss),8):
    enc+=chr(eval('0b'+ss[i:i+8]))
import base64
print(enc)
x=base64.b64decode(enc).decode()
print(x)
x=decrypt4(x)
x=decrypt5(x)

得到

bjdcongratulationsongettingtheflag

套上BJD{}即可。

36D杯

签到

请将解密后的字符串加上 flag{}。
hint:rot了吗,rot了就去看电脑键盘吧。
W9@F0>:2?0D9:07=28X/3/TUW/o/7/PUo/ST7/T/6/R

ROT47

(hou_mian_shi_flag)^b^%&(^@^f^!&@^$%f^%^e^#

将后面字符对应键盘转为数字

6b6579626f6172645f656e63

HEX解码得

keyboard_enc

rsaEZ

考点:rsa密钥解析

EXP

from Crypto.PublicKey import RSA
import libnum
import gmpy2
#导入公钥
with open("public.key","rb") as f:
    key = RSA.import_key(f.read())
    n =key.n
    e =key.e
 
with open("encrypted.message1","rb") as f:
    c1=libnum.s2n(f.read())
with open("encrypted.message2","rb") as f:
    c2=libnum.s2n(f.read())
with open("encrypted.message3","rb") as f:
    c3=libnum.s2n(f.read())
 
p=302825536744096741518546212761194311477
q=325045504186436346209877301320131277983
d=libnum.invmod(e,(p-1)*(q-1))
c=[c1,c2,c3]
flag=''
for i in c:
    m=pow(i,d,n)
    m1=str(libnum.n2s(int(m)))
    flag+=(m1.split("x00")[1])[:-3]  
print(flag)

justShow

hlcgoyfsjqknyifnpd:bcdefghijklmnopqrstuvwxyza

考点:简单移位+playfair密码

观察后面的字符串规律:向后进行了一次移位

所以将密文:hlcgoyfsjqknyifnpd 往前移一位得:gkbfnxeripjmxhemoc

用playfair密码解密,密钥为默认的:abcdefghijklmnopqrstuvwxyz

飞鸽传书

TVdJd09HRm1NamMyWkdKak56VTVNekkzTVdZMFpXVTJNVFl5T0Rrek1qUWxNRUZsTW1GbE0yRXlNelV3TnpRell6VXhObU5rWVRReE1qUTVPV0poTTJKbE9TVXdRV0prWlRVeVkySXpNV1JsTXpObE5EWXlORFZsTURWbVltUmlaRFptWWpJMEpUQkJaVEl6WlRBd1ltVXpPV1F6Tm1Zek5EWXlaVFUzTm1FMk4yRTNaamt4T1RrbE1FRXhPR00zT1RJNE5XSTFNVFJqTmpObVl6a3dNelZsTTJZNU1qQmhaVFEzTnlVd1FXUmhORFJrWkRFNU1tUmxabVF4WW1VM09XWTJNMk16TlRCa01qa3lNR05tSlRCQk5ESTFNV00wWXpZME9XTTNaREptT0RZek1qZGxabVJsTWpNNU9USm1ZVGNsTUVGaFlXVTNZakprTkRneU16Z3lZV0ZoWkRjMVptUmxOalJrWmpobVpqZzJaaVV3UVRJNU5tWTNabVpqTW1VME5UUTFaR00zTnpreU1EVXdZMlZpTkdFNE56RXhKVEJCTmpFd04yRmpNV0UxTldZeFpUQm1aV05pTjJSa1lqWXdabUl6WW1ZeE1Ea2xNRUZoWldNeU16TXpNekl4WkRjek1EQXdNVFl4TmpneVpETmpOR1ZpWXpBd09TVXdRVFV3TURWaU0ySm1NREF3TlRCaVpqUm1OMlUwTTJGak16TmhNRFExTkdJNEpUQkI=

考点:base64、md5

两次64得到

1b08af276dbc7593271f4ee616289324%0Ae2ae3a2350743c516cda412499ba3be9%0Abde52cb31de33e46245e05fbdbd6fb24%0Ae23e00be39d36f3462e576a67a7f9199%0A18c79285b514c63fc9035e3f920ae477%0Ada44dd192defd1be79f63c350d2920cf%0A4251c4c649c7d2f86327efde23992fa7%0Aaae7b2d482382aaad75fde64df8ff86f%0A296f7ffc2e4545dc7792050ceb4a8711%0A6107ac1a55f1e0fecb7ddb60fb3bf109%0Aaec2333321d73000161682d3c4ebc009%0A5005b3bf00050bf4f7e43ac33a0454b8%0A

再URL换下行

1b08af276dbc7593271f4ee616289324
e2ae3a2350743c516cda412499ba3be9
bde52cb31de33e46245e05fbdbd6fb24
e23e00be39d36f3462e576a67a7f9199
18c79285b514c63fc9035e3f920ae477
da44dd192defd1be79f63c350d2920cf
4251c4c649c7d2f86327efde23992fa7
aae7b2d482382aaad75fde64df8ff86f
296f7ffc2e4545dc7792050ceb4a8711
6107ac1a55f1e0fecb7ddb60fb3bf109
aec2333321d73000161682d3c4ebc009
5005b3bf00050bf4f7e43ac33a0454b8

一个个MD5即可:http://www.ttmd5.com/

flag{36D_me}

密码学AK赛(部分)

加法

vtu[ypslg;sh}lrunpstf[sddeptf\

考点:键盘密码

密文键盘上对应位置分别向前移一位得到

cryptoakflag{keyboardpassword}

即flag

flag{keyboardpassword}

月饼杯

crypto1_中秋月

此夜中秋月,清光十万家

自动钥匙⊕

明文全大写,得到后转小写,并以_连接单词。

格式:flag{xxx}。

@⎝Lazzaro⎠师傅供题

Unlock Hint for 0 points

某古典密码

Unlock Hint for 0 points

经此古典密码加密后,密文还是大写

Unlock Hint for 0 points

该古典密码的密钥形式:
keyword+plaintext (+plaintext...+plaintext)

 

fsskryenvkm~jl{ejs}jwflzsnpgmifq{{j{|suhzrjppnx|qvixt~whu

参考:月饼王师傅wp

首先来先爆破得到异或结果:

s='fsskryenvkm~jl{ejs}jwflzsnpgmifq{{j{|suhzrjppnx|qvixt~whu'
for i in range(255):
	res=''
	for j in range(0,len(s)):
		temp = ord(s[j])^i
		if 65<=temp<=90 or 97<=temp<=122:	#由大小写字母构成
			res += (chr(temp))
	if len(res)==len(s):
		print(res)

根据Hint2全大写:YLLTMFZQITRAUSDZULBUHYSELQOXRVYNDDUDCLJWEMUOOQGCNIVGKAHWJ

再使用Autokey爆破脚本,得key:KEYFORFLAG以及明文

klen 10 :"KEYFORFLAG", ohnoyoufindtheflagtheflagforyouisdoyoulikeclassicalcipher
flag{do_you_like_classical_cipher}

crypto2_月自圆

世远人何在?天空月自圆。

Baby (Don't) Cry

@⎝Lazzaro⎠师傅供题

 

# -*- coding:utf-8 -*-
#Author: Lazzaro

from itertools import *
from random import *
from string import *

def encrypt(m, a, si):
	c=""
	for i in range(len(m)):
		c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
	return c
	
if __name__ == "__main__":
	m = '****************************************************flag{*************}'
	assert(len(m)==71)
	a = randint(50,100)
	salt = ''.join(sample(ascii_uppercase, 4))
	si = cycle(salt.lower())
	c=encrypt(m, a, si)
	print(c)
	
#3472184e657e50561c481f5c1c4e1938163e154431015e13062c1b073d4e3a444f4a5c5c7a071919167b034e1c29566647600c4e1c2956661b6c1f50622f0016317e563546202a

内容引用 月饼王师傅

明文长度为71位,加密后为142位。
这里由于a不大,salt长度也不长,且明文m中存在flag,正好可以用这几位去爆破出asalt
flag在明文m中的位置是53,对应密文c中的位置是105。flag出现的位置正好对应salt的位置。

f ⇒ 1c
l ⇒ 29
a ⇒ 56
g ⇒ 66

 写脚本爆出a、salt

from itertools import *
from random import *
from string import *

def encrypt(m, a, si):
	c=""
	for i in range(len(m)):
		c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
	return c

if __name__ == "__main__":
	for i in range(50,100):
		for j in ascii_uppercase:
			si = cycle(j.lower())
			# if encrypt('f', i, si)=='1c':
			# 	print('i =',i,'\tj =',j)

			if encrypt('l', i, si)=='29':
				print('i =',i,'\tj =',j)

结果:
满足encrypt('f', i, si)=='1c'的结果:

i = 52 	j = D
i = 57 	j = F
i = 62 	j = H
i = 67 	j = J
i = 72 	j = L
i = 77 	j = N
i = 82 	j = P
i = 87 	j = R
i = 92 	j = T
i = 97 	j = V

满足encrypt('l', i, si)=='29'的结果:

i = 54 	j = A
i = 55 	j = U
i = 61 	j = M
i = 67 	j = E
i = 68 	j = Y
i = 74 	j = Q
i = 80 	j = I
i = 86 	j = A
i = 87 	j = U
i = 93 	j = M
i = 99 	j = E

相同的i只有67,说明随机数a=67

然后拿着a去继续爆salt的后两位

if encrypt('a', 67, si)=='56':
	print('j =',j)

if encrypt('g', 67, si)=='66':
	print('j =',j)

最终得出salt='JESQ'
知道了随机出a和salt,这道题就出来了

from itertools import *
from random import *
from string import *

def encrypt(m, a, si):
	c=""
	for i in range(len(m)):
		c+=hex(((ord(m[i])) * a + ord(si)) % 128)[2:].zfill(2)
	return c
	
if __name__ == "__main__":
	
	salt = 'JESQ'
	si = cycle(salt.lower())
	c = '3472184e657e50561c481f5c1c4e1938163e154431015e13062c1b073d4e3a444f4a5c5c7a071919167b034e1c29566647600c4e1c2956661b6c1f50622f0016317e563546202a'
	res = ''
	for i in range(0,len(c),2):
		ssi = next(si)
		for j in range(32,127):
			if encrypt(chr(j),67,ssi)==c[i]+c[i+1]:
				res += chr(j)
	print(res)
#now_is_7fad9fcb-d361-4964-821c-177c906b8d20_flag_is_flag{md5(now-salt)}

7fad9fcb-d361-4964-821c-177c906b8d20-JESQ经md5加密后为1efce62ee0a96e39149e2179db1dd04c
最终flag:flag{1efce62ee0a96e39149e2179db1dd04c}

crypto3_多少离怀

多少离怀起清夜,人间重望一回圆。

Weird Γ(x)?

@⎝Lazzaro⎠师傅供题

Unlock Hint for 0 points

注意伽马函数Γ(x)和阶乘x!的关系式

Unlock Hint for 0 points

威尔逊定理

 

# -*- coding:utf-8 -*-
#Author: Lazzaro

from Crypto.Util.number import getPrime,isPrime
from math import gamma
import random

def nextPrime(n):
    n += 2 if n & 1 else 1
    while not isPrime(n):
        n += 2
    return n

def getNewPrime():
    A = getPrime(512)
    B = nextPrime(A - random.randint(1e4,1e5))
    return nextPrime(gamma(B+2)%A)
	
p = getNewPrime()
q = getNewPrime()
r = getNewPrime()
n = p * q ** 2 * r ** 3
e = 0x10001
c = pow(flag,e,n)

#pA=6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723982789
#pB=6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723922147
#qA=7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477881291
#qB=7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477807457
#n=4451906216583258787166698210560165433649728830889954633721198623488802305844782492171757604711145165920462286487680020347239300947225371917344589502941576734875830871998499135120227347066586066943289430156378296665669974728569678779668142712266780949126509440672273927433367293606776081254094682033167575930701870261219046464773708974194213798032346187463443317770758989273370488582862531630356263732232300508706676725203199729764016766683870925164232508407363688370458877688991733322055785233669885166225464068579486683574954699370175267031949720967812902215635630884502987094547523361027411501285252862476410213277925430392164226297316310465146003494714018456407793759170649913180823814850170639706664167149612984905056804131124522209409607977589884632999710708045656852149371030046919242039957767777840304466948549383597755811307383659188216421501912831203089570725388153416013596114462069777713822433178099904907224119
#c=1996198968748552041728429851810599627895157160099076033250854211280074825148767841655949210593646824507865483166496070951130337321360509148527292165245205219296211294789087358959553387392928560150390604911087085313000622842025416521494799132969818997182731021267942464323979261593380113740152841984062184326431879167516288834455296913822921806893572566867611541664848820247889274979245086440402996661226884320574824077910315143756471444347386795428338020162169391827182914043434253974549636668126789355991920452920806351939782281969098470635517019120996509180703896707990501216102290302162705699788457579330150149320348175742131887213742989509004374645723471497302400169849858253644606818874098604333865973357374444445825761600866472906771935670261641342221394488068630591190697667016958881530367047928341661857241378511420562236766886349565409774340321441504290366223243635878057759623855735794209219474650425139791831374

内容引用 月饼王师傅

提示:

注意伽马函数Γ(x)和阶乘x!的关系式
威尔逊定理

知识点:

#伽马函数Γ(x)和阶乘x!的关系式
gamma(n)=(n-1)!

#威尔逊定理
当且仅当p为素数时:(p-1)! ≡ -1 (mod p)
推论:(p-2)! ≡ 1 (mod p)

#欧拉函数
若n是质数p的k次幂,phi = p**k - p**(k-1)


我们需要求gamma(B+2)%A,根据伽马函数Γ(x)和阶乘x!的关系式可知(B+1)! % A。而根据威尔逊定理可知(A-2)! % A = 1
x = (A-2)!/(B+1)!,y = (B+1)!,所以x * y ≡ 1 (mod A)
而我们需要求的是y % A,y是x关于A的逆元。所以求x % A的逆元即可。
这里由于A、B相差还不到10万,所以很容易求解出x % A

from Crypto.Util.number import getPrime,isPrime
import gmpy2
import binascii

def nextPrime(n):
    n += 2 if n & 1 else 1
    while not isPrime(n):
        n += 2
    return n
	
def factorial_mod(A,B):
    ans = 1
    tmp = pow(-1,1,A)
    for i in range(B+1,A):
        ans = (ans*gmpy2.invert(i,A))%A
    return (ans*tmp)%A
	
pA = 6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723982789
pB = 6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723922147
qA = 7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477881291
qB = 7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477807457
n = 4451906216583258787166698210560165433649728830889954633721198623488802305844782492171757604711145165920462286487680020347239300947225371917344589502941576734875830871998499135120227347066586066943289430156378296665669974728569678779668142712266780949126509440672273927433367293606776081254094682033167575930701870261219046464773708974194213798032346187463443317770758989273370488582862531630356263732232300508706676725203199729764016766683870925164232508407363688370458877688991733322055785233669885166225464068579486683574954699370175267031949720967812902215635630884502987094547523361027411501285252862476410213277925430392164226297316310465146003494714018456407793759170649913180823814850170639706664167149612984905056804131124522209409607977589884632999710708045656852149371030046919242039957767777840304466948549383597755811307383659188216421501912831203089570725388153416013596114462069777713822433178099904907224119
c = 1996198968748552041728429851810599627895157160099076033250854211280074825148767841655949210593646824507865483166496070951130337321360509148527292165245205219296211294789087358959553387392928560150390604911087085313000622842025416521494799132969818997182731021267942464323979261593380113740152841984062184326431879167516288834455296913822921806893572566867611541664848820247889274979245086440402996661226884320574824077910315143756471444347386795428338020162169391827182914043434253974549636668126789355991920452920806351939782281969098470635517019120996509180703896707990501216102290302162705699788457579330150149320348175742131887213742989509004374645723471497302400169849858253644606818874098604333865973357374444445825761600866472906771935670261641342221394488068630591190697667016958881530367047928341661857241378511420562236766886349565409774340321441504290366223243635878057759623855735794209219474650425139791831374
e = 0x10001

p = nextPrime(factorial_mod(pA,pB+1))
q = nextPrime(factorial_mod(qA,qB+1))
r=gmpy2.iroot(n//(p*q*q),3)[0]
phi=(p-1)*q*(q-1)*r*r*(r-1)
d=gmpy2.invert(e,phi)
flag=gmpy2.powmod(c,d,n)

print(binascii.unhexlify(hex(flag)[2:]))
#flag{N0w_U_knOw_how_70_u5E_W1lS0n'5_Th30r3m~}

密码挑战

真·Beginner

题目来源:TSGCTF 2020 Crypto - Beginner's Crypto

assert(len(open('flag.txt', 'rb').read()) <= 50)
assert(str(int.from_bytes(open('flag.txt', 'rb').read(), byteorder='big') << 10000).endswith('1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576'))

已知:

m < 2400

m * 210000十进制表示的后175位为c        可写为:m * 210000 = c (mod 10175)

求m

发现是同余式变形,将等式两边消去公约数,使得2的幂次可逆即可

import gmpy2
from Crypto.Util.number import long_to_bytes
b=1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576
a=pow(2,175)
b=b//a
n=pow(5,175)
m=gmpy2.invert(pow(2,9825,n),n)*b%n
print(long_to_bytes(m))
#TSGCTF{0K4y_Y0U_are_r3aDy_t0_Go_aNd_dO_M0r3_CryPt}

真·guessguess

查看代码
 from random import shuffle
from secret import secret_msg

ALPHABET = '0123456789abcdef'

class Cipher:
    def __init__(self, key):
        self.key = key
        self.n = len(self.key)
        self.s = 7

    def add(self, num1, num2):
        res = 0
        for i in range(4):
            res += (((num1 & 1) + (num2 & 1)) % 2) << i
            num1 >>= 1
            num2 >>= 1
        return res

    def encrypt(self, msg):
        key = self.key
        s = self.s
        ciphertext = ''
        for m_i in msg:
            c_i = key[self.add(key.index(m_i), s)]
            ciphertext += c_i
            s = key.index(m_i)
        return ciphertext

plaintext = b'The secret message is:'.hex() + secret_msg.hex()

key = list(ALPHABET)
shuffle(key)

cipher = Cipher(key)
ciphertext = cipher.encrypt(plaintext)
print(ciphertext)

# output:
# 85677bc8302bb20f3be728f99be0002ee88bc8fdc045b80e1dd22bc8fcc0034dd809e8f77023fbc83cd02ec8fbb11cc02cdbb62837677bc8f2277eeaaaabb1188bc998087bef3bcf40683cd02eef48f44aaee805b8045453a546815639e6592c173e4994e044a9084ea4000049e1e7e9873fc90ab9e1d4437fc9836aa80423cc2198882a

跟着大佬学习了一下发现可以使用Z3解。。

https://ericpony.github.io/z3py-tutorial/guide-examples.htm

不得不说此方法确实舒服。

C='85677bc8302bb20f3be728f99be0002ee88bc8fdc045'
M=b'The secret message is:'.hex()
lines=[]
for i in range(1,len(M)): 
     l=[int(M[i],16),int(C[i],16),int(M[i-1],16)] 
     l.sort()
     a,b,c=l 
     lines.append(f"g[{a}]^g[{b}]^g[{c}]==0")

lines=set(lines)

from z3 import *
g=[BitVec(f"g{i}",4) for i in range(16)]
s=Solver()

for i in lines:
    s.add(eval(i))

for i in range(16):
    for j in range(i+1,16):
        s.add(g[i]!=g[j])

s.add(g[4]==0)
s.add(g[5]^g[8]==7)

ans_key=[]
while(s.check()==sat):
    m=s.model()
    cond=[]
    key=[0]*16
    for d in m.decls():
        #exec(f"key[{int(d.name()[1:])}]={m[d]}")
        exec(f"key[{m[d]}]={int(d.name()[1:])}")

        cond.append(eval(f"g[{int(d.name()[1:])}]!={m[g[int(d.name()[1:])]]}"))
    ans_key.append("".join([hex(i)[2:] for i in key]))    
    s.add(Or(cond))

print(len(ans_key))    
print(ans_key[0])



from random import shuffle
#from secret import secret_msg

ALPHABET = '0123456789abcdef'

class Cipher:
    def __init__(self, key):
        self.key = key
        self.n = len(self.key)
        self.s = 7

    def add(self, num1, num2):
        res = 0
        for i in range(4):
            res += (((num1 & 1) + (num2 & 1)) % 2) << i
            num1 >>= 1
            num2 >>= 1
        return res

    def encrypt(self, msg):
        key = self.key
        s = self.s
        ciphertext = ''
        for m_i in msg:
            c_i = key[self.add(key.index(m_i), s)]
            ciphertext += c_i
            s = key.index(m_i)
        return ciphertext

    def decrypt(self, c):
        key = self.key
        s = self.s
        msg = ''
        for c_i in c:
            m_i = key[self.add(key.index(c_i), s)]
            msg += m_i
            s = key.index(m_i)
        return msg


plaintext = b'The secret message is:'.hex() #+ secret_msg.hex()

from Crypto.Util.number import *
C1="85677bc8302bb20f3be728f99be0002ee88bc8fdc045b80e1dd22bc8fcc0034dd809e8f77023fbc83cd02ec8fbb11cc02cdbb62837677bc8f2277eeaaaabb1188bc998087bef3bcf40683cd02eef48f44aaee805b8045453a546815639e6592c173e4994e044a9084ea4000049e1e7e9873fc90ab9e1d4437fc9836aa80423cc2198882a"
i=1
for key in ans_key:
    cipher = Cipher(key)
    ciphertext = cipher.encrypt(plaintext)
    if ciphertext == C:
        print(key)
        print(ciphertext)
        print(C)
        print(i)
        i+=1
    print(long_to_bytes(int(cipher.decrypt(C1),16)))
#DUCTF{d1d_y0u_Us3_gu3ss1nG_0r_l1n34r_4lg3bRA??}

Lousy RSA

from Crypto.Util.number import bytes_to_long, getStrongPrime
from math import gcd
from Crypto.Random import get_random_bytes

def encrypt(number):
    return pow(number,e,N)

def lousy_encrypt(a,m):
    return encrypt(pow(a,3,N)+(m << 24))

flag = open('flag.txt','r').read().encode()
out = open('output.txt','w')
e = 3
p = getStrongPrime(512)
q = getStrongPrime(512)

while (gcd(e,(p-1)*(q-1)) != 1):
    p = getStrongPrime(512)
    q = getStrongPrime(512)

N = p * q

out.write("N : " + str(N) + "\n")
out.write("e : " + str(e) + "\n")

r = bytes_to_long(get_random_bytes(64))

ct = []
ct.append(encrypt(r << 24))

for c in flag:
    ct.append(lousy_encrypt(c,r))

out.write(str(ct))

已知了(r<<24)3 mod(n)

由于flag的前几位已知,因此我们可以知道(p+r<<24)3 mod(n) 其中p是已知的

采取相关信息攻击求出r<<24,接下来就对每一个密文爆破flag每位的ascii码即可

c1=103257687156241899499827276029204507301118824708550075336030581579292744080229158179945259791076254057090939012066994369288670308228205692213690848757611643081061839053161006465150229166193002954981341426947070270455880176797323978146842145269785161624469627766308400708045099455988703109539411715223140864055
c2=18039312345525028341073707647712241370402766345056865331660652837580540815793542759809258282809577419840341021537550327084726463337011609233133342170545148227032979661306340627233039693942809584834595867764137392521082140999862780131281289116595415610743721139572406382723508438800728580847788788450897091302
n=128150250590847123515819140763559583557023719667241065482774194261953222671778618652957632134330773414619073779968547596110375728788476540473685866827556620306229504625722636397468884545844344321664742606780911043723588131983420074094601947568662171494650706678405992806598685796987329517384206573978336545669

def related_message_attack(c1, c2,n):
    PRx.<x> = PolynomialRing(Zmod(n))
    g1 = x^3- c1
    g2 = (x+99^3)^3- c2
    def gcd(g1, g2):
        while g2:
            g1, g2 = g2, g1 % g2
        return g1.monic()
    return -gcd(g1, g2)[0]
print(related_message_attack(c1,c2,n))


c=[103257687156241899499827276029204507301118824708550075336030581579292744080229158179945259791076254057090939012066994369288670308228205692213690848757611643081061839053161006465150229166193002954981341426947070270455880176797323978146842145269785161624469627766308400708045099455988703109539411715223140864055, 18039312345525028341073707647712241370402766345056865331660652837580540815793542759809258282809577419840341021537550327084726463337011609233133342170545148227032979661306340627233039693942809584834595867764137392521082140999862780131281289116595415610743721139572406382723508438800728580847788788450897091302, 87000423666336064727692984337602943371642566471348014352932981406489516357849783761197931500866383499955919080156622011097924833422636836485812707066629677483932386291299920447566816878085238180420637211900222415636934271276364011820972187735114634332760050264401030302070113822719822498002506808505975665779, 67606238530181455456032715022913389480653617645936791806930685703994489456706262500480024009988542049634549450198811744663396774191244645227751255399689899326745106390248954895026800724829472879200343816570623395757188498478893771133125576913573946704347952623121689638924997267616691598144301615790588028078, 13077276729020337991770625760071005759618421199335204193591233290650537799845873468780769762375925353603747111431085145740792296243170095325050370019379946623299531563480917703874691007096273610341664883961497566763967064292441195811598440311252130190518262319731746484408818315275126776658622716318989752266, 112969403865040522557044798078579508085122597476024987845761597347182190617888485011010829589553936990897633528096968231660131612784223914185299389933526713764282462800919489066259134790912949234642719438854717484935651688434082687906847508653006063301152527366801899857306435707773729832094581498580901891461, 102570754558941605620648556160674754308930297315878148289594889659353048183161525640502768025281667995993820720352012553098566124728782120067464051248800503909952894470585108227875736486708433123134669375599969355619437492414272534055804608095130318761211970270063219532327815025778877213620049319058661744097, 48424371753620645164299141756671291274505422562834181567359555179100884506835559281344783047973972120453511241785137899575069868467501080868568231533790844801420895527747262586771542473415518903565022842181641833047613333675683663086135353375684657660771328940389817542621581979450758676778873831302511339758, 11256969497740413597732898127732406613900016625066687658699496643096071997776595041254048141903157597333608735612369125460444047420257844344212706616879213642163538662584609517326723697288867461065236405032250966639917715976372197947153936327328313380463493416169683716135698318866310128606696205343639319582, 117988256827496743132461369026027747198522381961686293239579161045684479050381173549637331600750500205054473367177765510427537200046723076991627584611447977263057090936603090480143586940135575198527341554261701544391492957213075579337168479274786869756170024331254722176735980781607896255755296102891543952473, 106698778235265969952557199428445787012677803683635578363690703026279788463745700518863371899092075981978570169890045395899982837364634437908573990132358837420794594842005635765648190846118624335138574706250957664584409101048652072472868527514714948693293978870588258449874192009464114032342991077875442302082, 8358963801706384745115110712706694731351506554053640287666312853814007893602610044110231915137884362852470491594330405002321174706350556412532001918028959410880981447338642035029966341728604494387782970188248845418247327029815860476995802819089485760879968813744483516522976063206342934105232828732319385405, 27282384431089327321490290994380870288162181369495910221079670687522047782198295269322313214141903967944277346290202688325213576156934404559671443488295266434672838458966774242561123921902894888720654799922052440736779309096649418425651348073611728837124490574538283031406105247347621339579174918766777397484, 49997355829770370760415969214631615974972309115493838861225336579627700555068016427048977822682879734963543592913628962087524293647678520089076058466188064466327666941015757046577549196300343062515354077317889491224187387803704432731182249562130320690605730424290695616700499474037457404255820263906471922084, 18039312345525028341073707647712241370402766345056865331660652837580540815793542759809258282809577419840341021537550327084726463337011609233133342170545148227032979661306340627233039693942809584834595867764137392521082140999862780131281289116595415610743721139572406382723508438800728580847788788450897091302, 117988256827496743132461369026027747198522381961686293239579161045684479050381173549637331600750500205054473367177765510427537200046723076991627584611447977263057090936603090480143586940135575198527341554261701544391492957213075579337168479274786869756170024331254722176735980781607896255755296102891543952473, 84721233293841681424933224823064793169594057651109763508874711501538112223572039715726019286449550722922416274640903668779469201531849288486365611841444423510138527482395738248635927213152739959520041965231756325256010551494666459249427750065861393094589701653707533933621766214696172692425279573461797709251, 1765433080319911649560873528000233164973415923931197924820976980441801463886941320787588122429735976511340673099571212941061132221436355260485477033469360560697435262943817426774119514616406843375480394430673058313349112140664530809229216767340262282064535104508625425589113759509247013743452408003904212651, 8358963801706384745115110712706694731351506554053640287666312853814007893602610044110231915137884362852470491594330405002321174706350556412532001918028959410880981447338642035029966341728604494387782970188248845418247327029815860476995802819089485760879968813744483516522976063206342934105232828732319385405, 71641093020836869459059857386247778428292837158132901920687875325663457466974604366272941817500591320700011553224694560303057875010754895203370268389562705089671119069371696117517724095438866548804560646775476318940813787766932947993743711045712675484111892009972103264494944810352466914310600830470175936537, 67606238530181455456032715022913389480653617645936791806930685703994489456706262500480024009988542049634549450198811744663396774191244645227751255399689899326745106390248954895026800724829472879200343816570623395757188498478893771133125576913573946704347952623121689638924997267616691598144301615790588028078, 67606238530181455456032715022913389480653617645936791806930685703994489456706262500480024009988542049634549450198811744663396774191244645227751255399689899326745106390248954895026800724829472879200343816570623395757188498478893771133125576913573946704347952623121689638924997267616691598144301615790588028078, 1765433080319911649560873528000233164973415923931197924820976980441801463886941320787588122429735976511340673099571212941061132221436355260485477033469360560697435262943817426774119514616406843375480394430673058313349112140664530809229216767340262282064535104508625425589113759509247013743452408003904212651, 8358963801706384745115110712706694731351506554053640287666312853814007893602610044110231915137884362852470491594330405002321174706350556412532001918028959410880981447338642035029966341728604494387782970188248845418247327029815860476995802819089485760879968813744483516522976063206342934105232828732319385405, 62180534732256489939145392027333965161620416539997291795407740419005292599213799795620401624433721352370182403738325035843675415858831692993333288713116874298280204202750957267882724608195588667380457609286733564160117718955160491600836762184124155289598755647928461615465746268558157952650918596974545168570, 50744912106416672675920778117083273739676778950508015338852771746648003750371814225152993268066250025676737649345266192669120218177906851371444214246616949143709108499263175483926577166917145551867143439891781437867024602409870592616615439189368305677791119110865759468639626212456977748385013926557479502407, 49997355829770370760415969214631615974972309115493838861225336579627700555068016427048977822682879734963543592913628962087524293647678520089076058466188064466327666941015757046577549196300343062515354077317889491224187387803704432731182249562130320690605730424290695616700499474037457404255820263906471922084, 1765433080319911649560873528000233164973415923931197924820976980441801463886941320787588122429735976511340673099571212941061132221436355260485477033469360560697435262943817426774119514616406843375480394430673058313349112140664530809229216767340262282064535104508625425589113759509247013743452408003904212651, 27282384431089327321490290994380870288162181369495910221079670687522047782198295269322313214141903967944277346290202688325213576156934404559671443488295266434672838458966774242561123921902894888720654799922052440736779309096649418425651348073611728837124490574538283031406105247347621339579174918766777397484, 67268050241604489865776563507945020302759646347937662288419194732100777585627684289996812010796602861387304634719569994137874821878905201733566540689730524385447833571151879762965604422183995289856330881382198824456649737231337956931647303254424712975217262391790803365361346961198563695797570837958716706499, 62180534732256489939145392027333965161620416539997291795407740419005292599213799795620401624433721352370182403738325035843675415858831692993333288713116874298280204202750957267882724608195588667380457609286733564160117718955160491600836762184124155289598755647928461615465746268558157952650918596974545168570, 50744912106416672675920778117083273739676778950508015338852771746648003750371814225152993268066250025676737649345266192669120218177906851371444214246616949143709108499263175483926577166917145551867143439891781437867024602409870592616615439189368305677791119110865759468639626212456977748385013926557479502407, 1765433080319911649560873528000233164973415923931197924820976980441801463886941320787588122429735976511340673099571212941061132221436355260485477033469360560697435262943817426774119514616406843375480394430673058313349112140664530809229216767340262282064535104508625425589113759509247013743452408003904212651, 67606238530181455456032715022913389480653617645936791806930685703994489456706262500480024009988542049634549450198811744663396774191244645227751255399689899326745106390248954895026800724829472879200343816570623395757188498478893771133125576913573946704347952623121689638924997267616691598144301615790588028078, 27282384431089327321490290994380870288162181369495910221079670687522047782198295269322313214141903967944277346290202688325213576156934404559671443488295266434672838458966774242561123921902894888720654799922052440736779309096649418425651348073611728837124490574538283031406105247347621339579174918766777397484, 117988256827496743132461369026027747198522381961686293239579161045684479050381173549637331600750500205054473367177765510427537200046723076991627584611447977263057090936603090480143586940135575198527341554261701544391492957213075579337168479274786869756170024331254722176735980781607896255755296102891543952473, 84721233293841681424933224823064793169594057651109763508874711501538112223572039715726019286449550722922416274640903668779469201531849288486365611841444423510138527482395738248635927213152739959520041965231756325256010551494666459249427750065861393094589701653707533933621766214696172692425279573461797709251, 35558500020908917343359299736057202031536620279524971571295339321461691448208666801237490129885475361003363307214692973590137494846349994999422083435931995231149468826373201703562226911128832819747503527565530046843148550075088094434563327836926688736917202325080991233109324760419419564548505966220114864766, 13098515074610770448826445586858553983592846054264828967030148275117124752706530140632609743696995447672489392460486402090049469296257853170430468756737531772046468475169918112204200291054378208348794585408052700106452925223016139509615419662653450289877606685702783265630548093123948864887130382936959708661, 67606238530181455456032715022913389480653617645936791806930685703994489456706262500480024009988542049634549450198811744663396774191244645227751255399689899326745106390248954895026800724829472879200343816570623395757188498478893771133125576913573946704347952623121689638924997267616691598144301615790588028078, 50744912106416672675920778117083273739676778950508015338852771746648003750371814225152993268066250025676737649345266192669120218177906851371444214246616949143709108499263175483926577166917145551867143439891781437867024602409870592616615439189368305677791119110865759468639626212456977748385013926557479502407, 35558500020908917343359299736057202031536620279524971571295339321461691448208666801237490129885475361003363307214692973590137494846349994999422083435931995231149468826373201703562226911128832819747503527565530046843148550075088094434563327836926688736917202325080991233109324760419419564548505966220114864766, 62180534732256489939145392027333965161620416539997291795407740419005292599213799795620401624433721352370182403738325035843675415858831692993333288713116874298280204202750957267882724608195588667380457609286733564160117718955160491600836762184124155289598755647928461615465746268558157952650918596974545168570, 84721233293841681424933224823064793169594057651109763508874711501538112223572039715726019286449550722922416274640903668779469201531849288486365611841444423510138527482395738248635927213152739959520041965231756325256010551494666459249427750065861393094589701653707533933621766214696172692425279573461797709251, 117988256827496743132461369026027747198522381961686293239579161045684479050381173549637331600750500205054473367177765510427537200046723076991627584611447977263057090936603090480143586940135575198527341554261701544391492957213075579337168479274786869756170024331254722176735980781607896255755296102891543952473, 88022857696774675359872629419195425506105731445708172869884116879478233532175012203545758891288460792046980935095150806974409101434006784647930978772948078507260737144595276910928898105577090556500733812228704140620257095651743315324340967651136673270547588317205683702793537961465460201394936260530882952523, 35168272193662846053559479251528464052401128599502342869327365048984122161328758397160459768402458699595048892890374315284782755311245861459247525981730187764193239085045051787639782134045779003425618438883074655964304777698057040257835177631739730443229245213002177612918065392875262472061548598633261816406]
a=103257687156241899499827276029204507301118824708550075336030581579292744080229158179945259791076254057090939012066994369288670308228205692213690848757611643081061839053161006465150229166193002954981341426947070270455880176797323978146842145269785161624469627766308400708045099455988703109539411715223140864055
n=128150250590847123515819140763559583557023719667241065482774194261953222671778618652957632134330773414619073779968547596110375728788476540473685866827556620306229504625722636397468884545844344321664742606780911043723588131983420074094601947568662171494650706678405992806598685796987329517384206573978336545669
rr=19731899915591857973821365991497958774995415462855561480045728475501723487020611083602344576354117903645512273937080371635407842076645621404431507222195519619072
m=[]
for i in range(1,len(c)):
    for j in range(127):
        if pow(pow(j,3)+rr,3,n)==c[i]:
            m.append(j)
print(bytes(m))
#ctfshow{584a2c59-4bff-4632-a163-fa590ef30695}

Not That Right Use

from Crypto.Util.number import *
from secret import flag
import gmpy2
import random

length_bit = 8192
def generate_key(length_bit = 8192):
	q = getPrime(length_bit)
	f = random.getrandbits(length_bit//2)
	while True:
		g = random.getrandbits(length_bit*3//8)
		if gmpy2.gcd(f,g) == 1:
			break
	h = gmpy2.invert(f, q)*g % q
	return h,q,f,g

def encrypt(m,h,q):
	m = bytes_to_long(m)
	r = random.getrandbits(length_bit//2)
	enc = (r*h + m) % q
	return long_to_bytes(enc)

def decrypt(enc,f,g,h,q):
	a = f*enc % q
	b = gmpy2.invert(f,g)*a % g
	return long_to_bytes(b)

h,q,f,g = generate_key()
pub = open("pub.key","w")
pub.write(str(h)+"\n")
pub.write(str(q))
pub.close()

enc = open("enc","wb")
enc.write(encrypt(flag,h,q))
enc.close()

考点:NTRU

import gmpy2
h = 140641654480309646661460752259009805238822983063359975743381261932998899184657124924009078027641660038632664812668296524565206464727520596895026388236060597071386726013858963646501909196012396523837136988240197784437301120862384415682149940533848605250394303113175634035415167283080872735105912832870108712880945146080491825953020939705109174820916829051689692620946211242161384869371254560708250183882247373951211750966153182266054977202080568980091991771341013245919227004891065056914748466875350300140600531409616529059949886077689971297827093124675618542008989955575344877827824040946659512030038751389893253831481412516711878799875665224067139882771597407869970351450430459419948729296146331395877370686156516399740856252014616811497494914814385899755904538139847880089751542568309978231883094168561891730860752672873293261989147250409991608262872830092259084716940417114648971958597960369718849774615105540721662399447525067048358560864789407380815740563275439433805528298375095604942955338684305941359986487934315953665121858289306142097815651312478757549908167872661314913947544946927600211726850023950066392630122882839485809938848969950265325406399686586314459280991301825054645472425674527422929972887391753238816923298623579429710609368219213051797207053195961056438004296815009848196702292268936140424621874190909040512919014723673109665119192714879264861148038121817069654007213479519085780137202965768316745672909214544256962033590044776596987318613883438618931569568770820849164854311957684349997002160055168894414227617344006000575498315925335544219161846832480926999315432632883472713932971843620942616934646926067124395446944817779007843821815929039660037988200894593303504735755586137601186627884346462317235217848459593022989695194335576580395608745533282003408295857616739627596114657034449337931786787816708834202430301485318191988716906057312812712966166482682666772164391035856970600473354659224228523748418482322369646074712031322484015675331188701826840899169239647159728457797185599341417975052131005330363975351239128277681330549494029848264189699117329464205714708985625181438636031578843174246581394478846033426716126183473299468283652853483151156325335551346299229916621899845783802680366480774960939565022117840145287070125249514544755884841252084725187489065017117288468998533234739167462719883594746485521270177090828004405816695890424237068837967556932724183111259469809936198958551342439901421853536441105951848942732141671755288
q = 721062963295306780224288865760990406705513413320561732579234627711939010604916641502092203177136835588541554259063811291724295326953780525988898494239189350240494500021294136439018702342345820168271819324239839692861840016935631311071537166467243301000506704801343901587217940601797154207151921328887191874341607566625648510662958547199740852292999143208619354521973490573519876933142879407979683083573289638308100864165321388700902121078266071026038820486271316744664851483993423823069500303784383402304857035906448474159407085076020845226366206779141953496917489352476217054101214862066665066280950745072263325003643813350410844887077930774020933179459662916264650762216248605817745559194567515555850407282821340092531175262602702689180998414973022172701379180086212961061419818399053186026560842353748858519340974555352846705106500626664423314580198973011348673520120756781149651665967392752894792766334085124576134896850861070432338086277928670454001217670204592159022929789345510699644329966648502723120607881524783034562999715359179899943667274544446186555535385342026523507272796317613533963130150740855860225218332454607928768586519196388270192942980483940301171902740523758767325732435445754037509355869523812180653852667149772589024163493166632487347370811001485499960660824873526525919202671251942237597925764302445772724119412342705274451132940388410843886761306608395515200717447949626428049390906934269615447989583695806837918559467964483511193999073458761627082013487166837347281447834645376827978448760118048190148555572650537226385951360112553300387850015554277302469446739321719203700104354051152513702957057612668569467778263927730960518541792141873558358570677673100354450667297984686325175580976679505813813087110507883692083480127292287072406007262614228999824198116147220636799150068583032192358361413551877727766941745214486818182944108269772327140216300601094319506495541728100804461508755639873982377181607116052192238012365235618004165882010754149050486945338325383652930339212117826439488162732673179327060653649674194138447978815851287502201747481323578543139551676130822000071019318961666705089853728546154158421964235939702012776690925139910891383388310243996693561285917954515846454468095240887216321982651836906224349855624967761406539747280802571696734421390708879090880910004109042791548443392008271506467298812179909867611515314534888779065371104453531718962387778109331723060221708419208865118130890948962620930751351862376780409
c=588529356965030272025601048861282065021017902423164264957441586920595872039895404577255060274952541620315018969680195236465977272648652287926496543780173650574305499297716276827858805927298162208072303645283316405452651523836300258701988005355462277459875749978643895956961980467177804300387767414485993724320752395808791573881273230913748801373284405366594883666020631291276729848223537472276347125889834098129339716781471747034001410355814674928405649297961406796494833489565097910117203986219593353105481771936122718520536309366303961744867901990013705583165049702866175649386129367497873297054880401873031133188695262882654806285250254062236029461999697492837693504031022413406804330735094841148426551764288094879463057233019026422469014402428741654099663670413177889700803143516686274186664290312914022712001020975681794284476755306982329761414416554633826317934023660554506240542417335582689320936413929582635040851938378673355395047591192878234906774517888492511273362194115721382787428142413514396337877140039660775671326039060700550442211666812163244332762784047751975372230479416550318062822478588883067886438254695396783950270796813646987304649115877778929479117735381509546765888903982084857084146199858327966366481894960817384939327571190145773428855235037692518669027348557875061654802806227997673990112539114617853746089796693008271617776258890685231202093199769390648648724394621369070381058697619434434832764604338681140468898430273958259274423206535125100012671267337454233857407519190779123591857743660990034703847602695635498882322688596411189459783776748556641094779989138912494831839398857272788856710386704790450677690265116557152577245683557633429067370300903617226202997324638833015986591267108399829799306550735742117392415154266621030491837810396414282733584581932559949197413360798641627400507259389841455683789600794101460317701439910041563732131818865623789707908194392983359341050463836331965882104965958953776930066271528305080002935616971821352074253274211712644496549129601236468590933739942097889191987452132024182362123132201878709183393780456917565933067892953248097550146353078515168723528393603206246180698646597545792807716410931432281068936474760372741067644411320258900899808020539775178893382637068507862640029652464833884426244030678683387274373604759929344023706613753521672136720742565422001830029817188207010482846041392439542661849175431101244019020590777117194607762930230409875058098534619014803651392511587270579935
M = Matrix([[1, h], [0, q]])
fg = M.LLL()[0]
f, g = fg[0], fg[1]
def decry(c,f,g,q):
    a=c*f%q
    m=a*gmpy2.invert(f,g)%g
    print(m)
decry(c,f,g,q)
#61579680106153115696532018052895387674713503611866792755479823369112917073755555499813657518682472033419979202941
from Crypto.Util.number import long_to_bytes
m=61579680106153115696532018052895387674713503611866792755479823369112917073755555499813657518682472033419979202941
print(long_to_bytes(m))
#flag{NTRU_3ncrypti0n_alg0rithm_S0_3asy!!!!!!!!}

so Damn big e?

n1 = 0x7e503bdb2d037da083601c2945b668bbad980789cb4671b20fee013295319cc43a5b4defca704474c793fa2bd86eacd5552da0f0dc37a42eafd379d9216c0f3a1687ca42c5aa40500435374495fa0ebce37340bf6f98046c58443497457e4e442206a322ecfb60ee846f7aeb1e72f6804609a194ba9e28d6449a0e06d214525ce043afffd96eb9cb8e09b16722153ba5198bce185b5ad24b845b39a0940e5b9a7ad896c3e472b5d49cdb5956b91ef069d81fe399fcf5f3f02f465896bbf4ecbde7ba9cda0c510f14ba2b0673173c7916c284bf7a63613225ece3563a6d843ef06d731d0404646b97a4bc4a3ec4e77751d3c5fd280bf8b0277ae1cade8b1fbdf9
e1 = 0x45a1ee446ca0df0720f77b576f8c197a5033f5cefec5bc8a2ddd9da021ff389d8991e1822abbe9efe60204094c252195f6a4c898ce4f4ee0ef726bd0fcfe7741749bd9cc1cbbec83cc133743d4c746c2736da2452bfeaea1d031f10719f33fa4ef3b8878951b2b70cead75a608d883968a17cd04f19eb3a58e5d55e01790658248a0a26404131a070d3b3c9cb4a1d9d98eadc392199300fbf5ee472296e36dccef2e796b9b51e6693767d40336875ab62c41231ea9fb90bcad4df203b4459abb8d0e402de474cd802e2bfbc01d3b2d55f96b44ceec56ad6c4f3809cfa30b102bc5edc1607c613734571e1dbdb13ace896d1931a53fc9088ead61d78bc30fe78d
c1 = 0x5b4331a4de52d57c7ff77ae03a75b96629c76509d0fd003c27966ca0bd8a7e1a835eee6fe9b02afe78507b43e9efdb9c13f7cbdacd5d18d45ca98ab5538fbf6500a9b314e7e260bab673ae8a38c41b056bea895953ad7257cf30b9a1ba598a1ef01b251964feb2a63e09d8b699a14f1bf3d464809dab3c514fe7c6f59be9c434a694215ebafe547035323f90a661b9c5c73208ef0cbc21c0e9abbdaa65cc4bbaf8c2c47841aefcabd89bbaa3a6f2a9df6d3d8a0eedbec7c28c94fb369b426449b7d6ec5daed4d07df92d057e02cacbfdda0c94afce396dda307c8cc6ecd51c084fa2cfe3a31edde97018ba0de31b8cdeabe34f51ceebdf8834340605d5d71279
n2 = 0x878717447ff85bff1c360384309b5731edffd0ade56117d3b8b72b2ab9296633437e3f5fb09c57e8658c1dc1de5d7a9ba003923d3e9d8e124afe71c6fd0c9985988961198c5c21ed46dfad45399ec9d4c6a6a0ca793e5c721333db2ceed863bc919544024a2a630e9788e9f5afadbd3a291bbda804ed70c6e9b9a599cb3a4d14ed9325000c19d988a79af2e44ff1e14766a0465837125107a9c2cf7a76980d6f86aaf9f926ea0e46d641d3478112de0824bf9c5e726a7d5b7c92cbc1906d3d778e9a612290e043e2b3afd4f0a806254640772fd25980b009b4136d685e52725482ac61e1b679d13eb0d2b06df080fffc677a1b9afbcf327fba6a3ed8fbc7e22d
e2 = 0x837ebb33e9bbb4a5662d484099db6a435c68d630acdfe317aed1a089fcb9deb4df3c328a36c8f1f14045374e8cd4a75e6480bc04489fbf86a1d324b6c2c31ce11dd50d6cb75f9be5b01d2b756aac22f3c7c17f42b47b9bba52575912faa482214158c935ea1d943d62f2a5242c00771a983b1428edbefbe43b8bcad116e6a110ebc3305f622fe131596889450b16a69b8567086939f7f4766f3cb93c1cc63c0ee1f6b2a4ce0de084b760e1f7dd3d5542a4f958969f0b17f5268eddb78b68d3348ef0e6be831c3846325985170f06ad25f5af5a04ada0f2aa3c93ad8c940966248698e72d6f029b0af9af91634aae13319faf985ce77ec4c35b416a8100050c7d
c2 = 0x26049d5d64a85ad3e89d7933a0d296651d566d71314485d2c4c74e8fa462f0c95d43daca9bbbc2557efd7441286e5de65b6067f9df6eb6b9ece0439f7ce7b0ee5e97607b3de1f7e591461469482975e9e2161e5ef1664b44d994c2d294884e0ddaab5c19a1a292d057dc517c9b4cb2dbdcfdbab02972cfd0a7d00f34320c4bc887ea2531ecf188e50e0f33995770b54affe30ebbce85bff955aa66c8e28e5708b0f3d3f52f07dbe5bf155968a65deb94f877ae7904b3dbc848e29d465452a07c373799a30452985e5b9933a57ca2d5227c40fed42e9537435c9f3221749db451c3861bbf57a4901f81d6794d0ad10ba882e8ba99e320cb12edd0b8c7194ded33
n3 = 0xd0a6712277676e497a6c09871e09ca7e87a0a09cc9c7a402ff12617eb2da499651724c4bfc4bdee713062c93ac852d627954cd59ed95b97d4ace621d8b86b867b9ff4b58c45c83f51fb4dcb12a15eaba0bf7370c29b1178a1bee585c4263ac7c1f0846bf4b5d2e8be1ec7bbaa023a8439deaaeeebd04d1188692a2223820c447606662e27af3f1fc45332dcea5214b05946d65e73bc8e9a17dc5093a2b0241b5166e6310e9bd0e1a20f9a5cb0f1925ba00b71bff78b058a167ee5dcadf428e1d3e4c077710dc073025a7813160fe825c8e3c81ef5e5070226b5d89a1ce86e91b3ce7cf3b5d590fa467a8defb2f96083291a74996dff53dfc44883a6a1c2e4651
e3 = 0x25b452f7ef6177efeb93d117aa856ca788713ff813af2f577246ed3a0a8cf244032197abd38c42677a0b7a3693108207b71ac7c934cc96d8cfafbe27e1a3ecda72796f0c09d9308e14f62be5bd913bb28afb6f92dc7a362e871d0f8667b9f44ffa2bcd240c554da99fe159599d68a9f7c4aa869b44edb382315b3ffb75bd2b12ba60f7ac667551756d13cb88e2be3f9959ab99fc4a063b8b53d208950f6db139d486f5f7351fa75010ad5177c07e4b2226298678518dd5145be36d4901c69949800f5e63be0b9fd7297eb204d76fd8c87217ea30a5495add4b5d901caabc929ee72de78d6ed3ae760c985ff58703f46046352d17926db6bcd57839c0a3ca9cfd
c3 = 0x874354398f60a93239229e47157f12c2c5b34886cacfe9b236ec545a5dc503c9e5cd38552eeb024d7562fed842368bde2e1744b222aa5f857684de402924a1b493c715a679ad17ab2251c1ad8e92fa83f45c4fb33154e09de088704acd4f14a4d3f8099aba4e2e2a4bc3baf35f32485ca67de3338cf0fd2276af6eb35751b0378709cb2aaff033146bc5d2f94fde12cb2286173af2f582b1841db9fb136667f2f90aca690f6041ad84380ecb86b443949d05bee5a08305b26f3efd53d0ae6e2e9cae6c4b4c36b2ae7d826117512e4c1d12dcce75b35d55b737970e3dc809c04b5aa309583e6a9650bd58415805be3c8175bf9546b24c8ce833a402f9b5d2ef35

hint:

Dɪғғᴇʀᴇɴᴄᴇ?ɴo!

题目分析:参考论文:https://eprint.iacr.org/2014/549.pdf

根据hint可猜测应该是三次加密的d相同。不然没法做。。

从题目所给的数据可以看到每组e和n的量级都是接近的,但我们并不能通过Wiener攻击或者更好的Boneh and Durfee attack得到结果,原因是d还不够小,否则出题人也不会给你三组了。。

文章里介绍了一种攻击方式,当给出多组模数n和指数e的情况下,如果d是相同的就能够在对d的大小限制更松的情况下找到d的解。下面来标记一下论文中的有关此攻击的关键地方:

我们需要解决的就是实现Theorem5的过程。首先有一组等式:eid-kiφ(ni)=1 [i=1,2,3]

基于这个方程组得:

我们通过LLL算法求出向量(d k1 k2 k3),可以根据Minkowsiki约束调一个L*=diag(c c c c)

根据上图二的证明可知限制了左式的大小范围 ε=

具体计算文章中有提到,最后可以取到 c=,然后再通过格基规约得到(d,k1,k2,k3),原方程可变形为:

由上图1可由S得到p的近似值且相差不到这意味着我们有可能通过copper还原p从而达到分解N的效果。

EXP

#sage#
n1 = 0x7e503bdb2d037da083601c2945b668bbad980789cb4671b20fee013295319cc43a5b4defca704474c793fa2bd86eacd5552da0f0dc37a42eafd379d9216c0f3a1687ca42c5aa40500435374495fa0ebce37340bf6f98046c58443497457e4e442206a322ecfb60ee846f7aeb1e72f6804609a194ba9e28d6449a0e06d214525ce043afffd96eb9cb8e09b16722153ba5198bce185b5ad24b845b39a0940e5b9a7ad896c3e472b5d49cdb5956b91ef069d81fe399fcf5f3f02f465896bbf4ecbde7ba9cda0c510f14ba2b0673173c7916c284bf7a63613225ece3563a6d843ef06d731d0404646b97a4bc4a3ec4e77751d3c5fd280bf8b0277ae1cade8b1fbdf9
e1 = 0x45a1ee446ca0df0720f77b576f8c197a5033f5cefec5bc8a2ddd9da021ff389d8991e1822abbe9efe60204094c252195f6a4c898ce4f4ee0ef726bd0fcfe7741749bd9cc1cbbec83cc133743d4c746c2736da2452bfeaea1d031f10719f33fa4ef3b8878951b2b70cead75a608d883968a17cd04f19eb3a58e5d55e01790658248a0a26404131a070d3b3c9cb4a1d9d98eadc392199300fbf5ee472296e36dccef2e796b9b51e6693767d40336875ab62c41231ea9fb90bcad4df203b4459abb8d0e402de474cd802e2bfbc01d3b2d55f96b44ceec56ad6c4f3809cfa30b102bc5edc1607c613734571e1dbdb13ace896d1931a53fc9088ead61d78bc30fe78d
c1 = 0x5b4331a4de52d57c7ff77ae03a75b96629c76509d0fd003c27966ca0bd8a7e1a835eee6fe9b02afe78507b43e9efdb9c13f7cbdacd5d18d45ca98ab5538fbf6500a9b314e7e260bab673ae8a38c41b056bea895953ad7257cf30b9a1ba598a1ef01b251964feb2a63e09d8b699a14f1bf3d464809dab3c514fe7c6f59be9c434a694215ebafe547035323f90a661b9c5c73208ef0cbc21c0e9abbdaa65cc4bbaf8c2c47841aefcabd89bbaa3a6f2a9df6d3d8a0eedbec7c28c94fb369b426449b7d6ec5daed4d07df92d057e02cacbfdda0c94afce396dda307c8cc6ecd51c084fa2cfe3a31edde97018ba0de31b8cdeabe34f51ceebdf8834340605d5d71279
n2 = 0x878717447ff85bff1c360384309b5731edffd0ade56117d3b8b72b2ab9296633437e3f5fb09c57e8658c1dc1de5d7a9ba003923d3e9d8e124afe71c6fd0c9985988961198c5c21ed46dfad45399ec9d4c6a6a0ca793e5c721333db2ceed863bc919544024a2a630e9788e9f5afadbd3a291bbda804ed70c6e9b9a599cb3a4d14ed9325000c19d988a79af2e44ff1e14766a0465837125107a9c2cf7a76980d6f86aaf9f926ea0e46d641d3478112de0824bf9c5e726a7d5b7c92cbc1906d3d778e9a612290e043e2b3afd4f0a806254640772fd25980b009b4136d685e52725482ac61e1b679d13eb0d2b06df080fffc677a1b9afbcf327fba6a3ed8fbc7e22d
e2 = 0x837ebb33e9bbb4a5662d484099db6a435c68d630acdfe317aed1a089fcb9deb4df3c328a36c8f1f14045374e8cd4a75e6480bc04489fbf86a1d324b6c2c31ce11dd50d6cb75f9be5b01d2b756aac22f3c7c17f42b47b9bba52575912faa482214158c935ea1d943d62f2a5242c00771a983b1428edbefbe43b8bcad116e6a110ebc3305f622fe131596889450b16a69b8567086939f7f4766f3cb93c1cc63c0ee1f6b2a4ce0de084b760e1f7dd3d5542a4f958969f0b17f5268eddb78b68d3348ef0e6be831c3846325985170f06ad25f5af5a04ada0f2aa3c93ad8c940966248698e72d6f029b0af9af91634aae13319faf985ce77ec4c35b416a8100050c7d
c2 = 0x26049d5d64a85ad3e89d7933a0d296651d566d71314485d2c4c74e8fa462f0c95d43daca9bbbc2557efd7441286e5de65b6067f9df6eb6b9ece0439f7ce7b0ee5e97607b3de1f7e591461469482975e9e2161e5ef1664b44d994c2d294884e0ddaab5c19a1a292d057dc517c9b4cb2dbdcfdbab02972cfd0a7d00f34320c4bc887ea2531ecf188e50e0f33995770b54affe30ebbce85bff955aa66c8e28e5708b0f3d3f52f07dbe5bf155968a65deb94f877ae7904b3dbc848e29d465452a07c373799a30452985e5b9933a57ca2d5227c40fed42e9537435c9f3221749db451c3861bbf57a4901f81d6794d0ad10ba882e8ba99e320cb12edd0b8c7194ded33
n3 = 0xd0a6712277676e497a6c09871e09ca7e87a0a09cc9c7a402ff12617eb2da499651724c4bfc4bdee713062c93ac852d627954cd59ed95b97d4ace621d8b86b867b9ff4b58c45c83f51fb4dcb12a15eaba0bf7370c29b1178a1bee585c4263ac7c1f0846bf4b5d2e8be1ec7bbaa023a8439deaaeeebd04d1188692a2223820c447606662e27af3f1fc45332dcea5214b05946d65e73bc8e9a17dc5093a2b0241b5166e6310e9bd0e1a20f9a5cb0f1925ba00b71bff78b058a167ee5dcadf428e1d3e4c077710dc073025a7813160fe825c8e3c81ef5e5070226b5d89a1ce86e91b3ce7cf3b5d590fa467a8defb2f96083291a74996dff53dfc44883a6a1c2e4651
e3 = 0x25b452f7ef6177efeb93d117aa856ca788713ff813af2f577246ed3a0a8cf244032197abd38c42677a0b7a3693108207b71ac7c934cc96d8cfafbe27e1a3ecda72796f0c09d9308e14f62be5bd913bb28afb6f92dc7a362e871d0f8667b9f44ffa2bcd240c554da99fe159599d68a9f7c4aa869b44edb382315b3ffb75bd2b12ba60f7ac667551756d13cb88e2be3f9959ab99fc4a063b8b53d208950f6db139d486f5f7351fa75010ad5177c07e4b2226298678518dd5145be36d4901c69949800f5e63be0b9fd7297eb204d76fd8c87217ea30a5495add4b5d901caabc929ee72de78d6ed3ae760c985ff58703f46046352d17926db6bcd57839c0a3ca9cfd
c3 = 0x874354398f60a93239229e47157f12c2c5b34886cacfe9b236ec545a5dc503c9e5cd38552eeb024d7562fed842368bde2e1744b222aa5f857684de402924a1b493c715a679ad17ab2251c1ad8e92fa83f45c4fb33154e09de088704acd4f14a4d3f8099aba4e2e2a4bc3baf35f32485ca67de3338cf0fd2276af6eb35751b0378709cb2aaff033146bc5d2f94fde12cb2286173af2f582b1841db9fb136667f2f90aca690f6041ad84380ecb86b443949d05bee5a08305b26f3efd53d0ae6e2e9cae6c4b4c36b2ae7d826117512e4c1d12dcce75b35d55b737970e3dc809c04b5aa309583e6a9650bd58415805be3c8175bf9546b24c8ce833a402f9b5d2ef35

Ns = [n1, n2, n3]
es = [e1, e2, e3]
cs = [c1, c2, c3]

N = max(Ns)
k = 3
delta = 0.375
epsilon = sqrt(5) * N^(delta-1/2)

n = k
C = int(3^(n+1) * 2 ^ ((n+1)*(n-4)/4) * epsilon^(-n-1))

M = Matrix(ZZ, [[1, -int(C * es[0] / (Ns[0] + 1)), -int(C * es[1] / (Ns[1] + 1)), -int(C * es[2] / (Ns[2] + 1))],
                [0, C, 0, 0],
                [0, 0, C, 0],
                [0, 0, 0, C]])

K = M.LLL()
need_x = K * M.inverse()
x, y1, y2, y3 = -need_x[0]
print(x, y1, y2, y3)
ys = [y1, y2, y3]
print(type(x))

print(Ns[0])
print(type(es[0]))
# print(x)
# print(ys[0])
print(int(es[0] * x / ys[0]))

Ss = [abs(int(Ns[i] + 1 - es[i] * x / ys[i])) for i in range(3)]
Ds = [int(sqrt(Ss[i]^2 - 4 * Ns[i])) for i in range(3)]
pas = [int((Ss[i] + Ds[i])/2) for i in range(3)]

# print(pas)
# print(ciphertexts[0]['p'])
# print(ciphertexts[0]['p'] - pas[0])


ps = []
for i in range(3):
    PR.<x> = PolynomialRing(Zmod(Ns[i]))
    f = x + pas[i]
    f = f.monic()
    # print(f)
    p_solve = f.small_roots(X = 2 ** 160, beta=0.42) # 
    ps.append(int(p_solve[0] + pas[i]))

print(ps)
#[157707652044954065883248214094147515960781498023967398493866737048160194845929609971945268913342639376954130819274238111268402746889024696472465420225345676826020796461691471921551009561245466403164679939829014558870992933051462924171768979717895761663820761612431000208587588404525132115782685704147275255241, 134467352870172721086663617487320827107944852392631884943068637021627162676031989148210978169987916425325567670231112391483638032602427634302334367058622382189060098327604654094143334054589791216993379074168674127640479975959252188162183197901377686773411570035676747597419729384196401299465708797796908895919, 177103272127746261573385967645038293407610839421054614597788236711007060769922255108780061424450518047994317823931282781515635740701239891227509060639263938171994919512088224736088491527369822360826617624197198797264853362314153027715370103929785006836058648266276012519698248710722443951537232833671998408637]
from Crypto.Util.number import *

n1 = 0x7e503bdb2d037da083601c2945b668bbad980789cb4671b20fee013295319cc43a5b4defca704474c793fa2bd86eacd5552da0f0dc37a42eafd379d9216c0f3a1687ca42c5aa40500435374495fa0ebce37340bf6f98046c58443497457e4e442206a322ecfb60ee846f7aeb1e72f6804609a194ba9e28d6449a0e06d214525ce043afffd96eb9cb8e09b16722153ba5198bce185b5ad24b845b39a0940e5b9a7ad896c3e472b5d49cdb5956b91ef069d81fe399fcf5f3f02f465896bbf4ecbde7ba9cda0c510f14ba2b0673173c7916c284bf7a63613225ece3563a6d843ef06d731d0404646b97a4bc4a3ec4e77751d3c5fd280bf8b0277ae1cade8b1fbdf9
e1 = 0x45a1ee446ca0df0720f77b576f8c197a5033f5cefec5bc8a2ddd9da021ff389d8991e1822abbe9efe60204094c252195f6a4c898ce4f4ee0ef726bd0fcfe7741749bd9cc1cbbec83cc133743d4c746c2736da2452bfeaea1d031f10719f33fa4ef3b8878951b2b70cead75a608d883968a17cd04f19eb3a58e5d55e01790658248a0a26404131a070d3b3c9cb4a1d9d98eadc392199300fbf5ee472296e36dccef2e796b9b51e6693767d40336875ab62c41231ea9fb90bcad4df203b4459abb8d0e402de474cd802e2bfbc01d3b2d55f96b44ceec56ad6c4f3809cfa30b102bc5edc1607c613734571e1dbdb13ace896d1931a53fc9088ead61d78bc30fe78d
c1 = 0x5b4331a4de52d57c7ff77ae03a75b96629c76509d0fd003c27966ca0bd8a7e1a835eee6fe9b02afe78507b43e9efdb9c13f7cbdacd5d18d45ca98ab5538fbf6500a9b314e7e260bab673ae8a38c41b056bea895953ad7257cf30b9a1ba598a1ef01b251964feb2a63e09d8b699a14f1bf3d464809dab3c514fe7c6f59be9c434a694215ebafe547035323f90a661b9c5c73208ef0cbc21c0e9abbdaa65cc4bbaf8c2c47841aefcabd89bbaa3a6f2a9df6d3d8a0eedbec7c28c94fb369b426449b7d6ec5daed4d07df92d057e02cacbfdda0c94afce396dda307c8cc6ecd51c084fa2cfe3a31edde97018ba0de31b8cdeabe34f51ceebdf8834340605d5d71279
n2 = 0x878717447ff85bff1c360384309b5731edffd0ade56117d3b8b72b2ab9296633437e3f5fb09c57e8658c1dc1de5d7a9ba003923d3e9d8e124afe71c6fd0c9985988961198c5c21ed46dfad45399ec9d4c6a6a0ca793e5c721333db2ceed863bc919544024a2a630e9788e9f5afadbd3a291bbda804ed70c6e9b9a599cb3a4d14ed9325000c19d988a79af2e44ff1e14766a0465837125107a9c2cf7a76980d6f86aaf9f926ea0e46d641d3478112de0824bf9c5e726a7d5b7c92cbc1906d3d778e9a612290e043e2b3afd4f0a806254640772fd25980b009b4136d685e52725482ac61e1b679d13eb0d2b06df080fffc677a1b9afbcf327fba6a3ed8fbc7e22d
e2 = 0x837ebb33e9bbb4a5662d484099db6a435c68d630acdfe317aed1a089fcb9deb4df3c328a36c8f1f14045374e8cd4a75e6480bc04489fbf86a1d324b6c2c31ce11dd50d6cb75f9be5b01d2b756aac22f3c7c17f42b47b9bba52575912faa482214158c935ea1d943d62f2a5242c00771a983b1428edbefbe43b8bcad116e6a110ebc3305f622fe131596889450b16a69b8567086939f7f4766f3cb93c1cc63c0ee1f6b2a4ce0de084b760e1f7dd3d5542a4f958969f0b17f5268eddb78b68d3348ef0e6be831c3846325985170f06ad25f5af5a04ada0f2aa3c93ad8c940966248698e72d6f029b0af9af91634aae13319faf985ce77ec4c35b416a8100050c7d
c2 = 0x26049d5d64a85ad3e89d7933a0d296651d566d71314485d2c4c74e8fa462f0c95d43daca9bbbc2557efd7441286e5de65b6067f9df6eb6b9ece0439f7ce7b0ee5e97607b3de1f7e591461469482975e9e2161e5ef1664b44d994c2d294884e0ddaab5c19a1a292d057dc517c9b4cb2dbdcfdbab02972cfd0a7d00f34320c4bc887ea2531ecf188e50e0f33995770b54affe30ebbce85bff955aa66c8e28e5708b0f3d3f52f07dbe5bf155968a65deb94f877ae7904b3dbc848e29d465452a07c373799a30452985e5b9933a57ca2d5227c40fed42e9537435c9f3221749db451c3861bbf57a4901f81d6794d0ad10ba882e8ba99e320cb12edd0b8c7194ded33
n3 = 0xd0a6712277676e497a6c09871e09ca7e87a0a09cc9c7a402ff12617eb2da499651724c4bfc4bdee713062c93ac852d627954cd59ed95b97d4ace621d8b86b867b9ff4b58c45c83f51fb4dcb12a15eaba0bf7370c29b1178a1bee585c4263ac7c1f0846bf4b5d2e8be1ec7bbaa023a8439deaaeeebd04d1188692a2223820c447606662e27af3f1fc45332dcea5214b05946d65e73bc8e9a17dc5093a2b0241b5166e6310e9bd0e1a20f9a5cb0f1925ba00b71bff78b058a167ee5dcadf428e1d3e4c077710dc073025a7813160fe825c8e3c81ef5e5070226b5d89a1ce86e91b3ce7cf3b5d590fa467a8defb2f96083291a74996dff53dfc44883a6a1c2e4651
e3 = 0x25b452f7ef6177efeb93d117aa856ca788713ff813af2f577246ed3a0a8cf244032197abd38c42677a0b7a3693108207b71ac7c934cc96d8cfafbe27e1a3ecda72796f0c09d9308e14f62be5bd913bb28afb6f92dc7a362e871d0f8667b9f44ffa2bcd240c554da99fe159599d68a9f7c4aa869b44edb382315b3ffb75bd2b12ba60f7ac667551756d13cb88e2be3f9959ab99fc4a063b8b53d208950f6db139d486f5f7351fa75010ad5177c07e4b2226298678518dd5145be36d4901c69949800f5e63be0b9fd7297eb204d76fd8c87217ea30a5495add4b5d901caabc929ee72de78d6ed3ae760c985ff58703f46046352d17926db6bcd57839c0a3ca9cfd
c3 = 0x874354398f60a93239229e47157f12c2c5b34886cacfe9b236ec545a5dc503c9e5cd38552eeb024d7562fed842368bde2e1744b222aa5f857684de402924a1b493c715a679ad17ab2251c1ad8e92fa83f45c4fb33154e09de088704acd4f14a4d3f8099aba4e2e2a4bc3baf35f32485ca67de3338cf0fd2276af6eb35751b0378709cb2aaff033146bc5d2f94fde12cb2286173af2f582b1841db9fb136667f2f90aca690f6041ad84380ecb86b443949d05bee5a08305b26f3efd53d0ae6e2e9cae6c4b4c36b2ae7d826117512e4c1d12dcce75b35d55b737970e3dc809c04b5aa309583e6a9650bd58415805be3c8175bf9546b24c8ce833a402f9b5d2ef35

def decrypt(c, d, n):
    return pow(c, d, n)

Ns = [n1, n2, n3]
es = [e1, e2, e3]
cs = [c1, c2, c3]
ps = [157707652044954065883248214094147515960781498023967398493866737048160194845929609971945268913342639376954130819274238111268402746889024696472465420225345676826020796461691471921551009561245466403164679939829014558870992933051462924171768979717895761663820761612431000208587588404525132115782685704147275255241, 134467352870172721086663617487320827107944852392631884943068637021627162676031989148210978169987916425325567670231112391483638032602427634302334367058622382189060098327604654094143334054589791216993379074168674127640479975959252188162183197901377686773411570035676747597419729384196401299465708797796908895919, 177103272127746261573385967645038293407610839421054614597788236711007060769922255108780061424450518047994317823931282781515635740701239891227509060639263938171994919512088224736088491527369822360826617624197198797264853362314153027715370103929785006836058648266276012519698248710722443951537232833671998408637]

for i in range(3):
    q = Ns[i] // ps[i]
    d = inverse(es[i], (ps[i] - 1) * (q-1))
    print(long_to_bytes(decrypt(cs[i], d, Ns[i])))
#flag{N0W_U_SO1v3D_c0mm0n_pr1v473_3xp0n3n7_4774ck}

Hammingway

import random
from functools import reduce

flag = open("flag", "r").read()

flag = "".join(str(format(ord(c), '08b')) for c in flag)
flag = [[int(j) for j in flag[i:i+11]] for i in range(0, len(flag), 11)]
code = []
for i in flag:
    for j in range(4):
        i.insert(2**j-1, 0)
    parity = reduce(lambda a, b: a^b, [j+1 for j, bit in enumerate(i) if bit])
    parity = list(reversed(list(str(format(parity, "04b")))))

    for j in range(4):
        if parity[j] == "1":
            i[2**j-1] = 1
    
    ind = random.randint(0, len(i)-1)
    i[ind] = int(not i[ind])
    code.extend(i)

enc = "".join([str(i) for i in code])
open("enc", "w").write(enc)

汉明码具有一比特纠错功能,我们实现它的纠错效果即可:

EXP

from functools import reduce
c='110011000111011001111000011000000110101101110101011110110100101000010100001010101100110101101001110101001011001011101110010001110001010101011011011000101100100011110011110001000011110001110001111111001100001000101110010001110110000001110010010010000100011000000001001101111110010111110011111010110111000101000011001101000101000001011011001001011111111000100000110101110000000101011111011101011101101101100110111110110100111010010100110110001111111001111011100000100110011000100001110001010000011101011111'
c=list(c)
m=[]
for i in range(0,len(c),15):
    code=c[i:i+15]
    ham = reduce(lambda a, b: a ^ b, [j + 1 for j, bit in enumerate(code) if int(bit)])
    code[ham-1]=str((int(code[ham-1])+1)%2)
    for j in range(4):
        code[2**j-1]=''
    m.extend(code)
m=''.join(m)
pt=[]
for i in range(0,len(m),8):
    a=m[i:i+8]
    pt.append(int(a,2))
print(bytes(pt))
#flag{H@mmIn9_cOd3_c0rrEc7_3rr0r_$0_vv3LL~~!!!}

^o^

from Crypto.Util.number import *
from secret import n,o,_,flag

def any(m):
	return bytes_to_long(m)^o^pow(2,2**_,n)

print(n,o,_,any(flag))

#(126176329335043454027341235009057683290541781096785538088437185779950106283534462102786883,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165185658681843519312254372108072512792854040590016772780908271525769845284796145687079308339,1138895128842708275167,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165145471041075065947806083270394708336810934202426175949363009508477208686445248781032485832)

分析代码可知解密进行异或运算即可,但是由于幂次太大很难计算,所以我们需要对幂次进行处理,我们发现n是可分解的,所以只需对模数mod(phi(n))即可

EXP

from Crypto.Util.number import *
a=[126176329335043454027341235009057683290541781096785538088437185779950106283534462102786883,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165185658681843519312254372108072512792854040590016772780908271525769845284796145687079308339,1138895128842708275167,22456023784134158064387550786352078427103553489348641216173010466267938277785173301732037264951635050700506776189809535326121257316490294752439819127486709456258090566784874248887194200916292508316349668172694553726134727726937633467532396106605496205841004277926961591604901357597262377953003319850049478502819166543968493292912201066602832545685929727421332846592671475883986049409546411338070434784675992855275254782158499562211464363321053581615280674425860714715529804670567409115827118589244016504450514019111124308126165145471041075065947806083270394708336810934202426175949363009508477208686445248781032485832]
m=a[3]
o=a[1]
_=a[2]
n=a[0]
p1 = 611738359
p2 = 914351299
p3 = 648863389
p4 = 973139887
p5 = 848994661
p6 = 940957051
p7 = 856368371
p8 = 775357619
p9 = 806952673
p10 = 834612803
phi=(p1-1)*(p2-1)*(p3-1)*(p4-1)*(p5-1)*(p6-1)*(p7-1)*(p8-1)*(p9-1)*(p10-1)
a=pow(2,_,phi)
def any(m):
	return (m)^o^pow(2,a,n)
print(long_to_bytes(any(m)))
#flag{d4mN~y0U-G37-7H3-riGH7-fL4G!}

rsa-rsa-rsa-rsa

查看代码
 import os
import gmpy2
from Crypto.Util.number import bytes_to_long
from secret import flag

def genPrime(bits):
    number = bytes_to_long(os.urandom(bits // 8))
    return gmpy2.next_prime(number)

e = 1667

p, q = [genPrime(700), genPrime(1400)]
keyA = (p * q, gmpy2.powmod(e, -1, (p - 1) * (q - 1)))

p, q, r = [genPrime(700) for i in range(3)]
keyB = (p * q * r, gmpy2.powmod(e, -1, (p - 1) * (q - 1) * (r - 1)))

p, q = [genPrime(700) for i in range(2)]
keyC = (p * q * r, gmpy2.powmod(e, -1, (p - 1) * (q - 1) * (r - 1)))

p, q = [genPrime(700) for i in range(2)]
keyD = (p * q * q, gmpy2.powmod(e, -1, (p - 1) * (q - 1) * q))

key = [keyA, keyB, keyC, keyD]
key.sort()

for n, d in key:
    print('Pubkey:\n', n, d % (2**1050))
    flag = pow(flag, e, n)

print('Final encrypted:\n', flag)

记录下大佬的解题方法。太酷了。解题内容来自:https://zhuanlan.zhihu.com/p/363648238?utm_id=0

题目分析:

有四组RSA:

这四组的加密指数e均为1667。

将这四组密钥按N的大小排序之后,依次给出N以及d mod 21050的值d0 .并且嵌套着加密flag(也就是消息m经过了四次加密)。

试解密flag。

我的解答:

看上去是一个解密指数低位泄露的攻击。

而且解密指数d泄露了n/2个低位,其中是n的N二进制位数。

得出解密指数的关键就在枚举K

这篇综述里面所提及的Partial Key Exposure attack里面有提及具体的操作,而且还是针对泄露n/4个低位的。我们就直接拿过来操作一下就行了。

需要指出,因为我们的分析都已经是在2n/2,而N必有一个素因子是要小于2n/2的,所以也就不需要用Coppersmith's method来求p的高位了。

之后我们需要弄懂这四组公钥都是对应的哪组RSA。我们先梭一遍最大公约数,看看共用r的第二组和第三组是那两组:

ns = [1932038554996040104455315883223718472713346303330978743187996729621529739811658796197488223680412961958556887967491813511917170439647307828115472638585061826614468592481442868170090215351305925734264287520730497594994002140743068998862077851863298594873771123822744767803224906340976228342363101074033729879279238569509131400285857667919295999183513229060721575824944210340220184232383953260959482459809500905579066796423460415005468731499877425631734048522986804875919132786153939377820467381744176688418461727816693147502213213443376334599763827118508992087636947292972915017881722657189677917877434729457682857780869117786951, 
3131941372466165986449739075865674968940174516444076890636643699669723723624476772239531739488887900237270630167942798909976360814710578884208330959980913704031373375334097086496506714284879981190426211509126158904765890049203697875840397068619455247802512255186427221538191894428225298900004231340034286465730171834031703088563214778317659451882235661464904425245012884275748455326419836548780784469413852141646848930684399793701878360640328085712887402813460070572277272227166256367362553115896571208152861417127327011927963063263882998956777761230189213433480309856104225339302750882900096482310202396770196005219615987514591, 
10917617097027265819941199316245708170664160322239112396992379752685149315630190490833569034344683693982148527246306753579034132187820876052547216920239096359749160292797938505063486556690953030692992535714104625710877777307612335669496734575845403728813048203197554540098183478830776569082345496253038419373074472138418756601605374254337538019930772982193317933908317697869554266829969870439418941090745812562872389999750219688406179614975768418558172158692416388137635116617826776163051924280348502765388774834534253485204220529953203590706632081252443788723009621033253377031581260077729777730562359860834341986687191557500091, 
6258481099173792024819474693106946368509556265824075910806389420555433719530245040141261998807861113767884111671342271029919841711711451328448935904736886474775877276202237359977901024567156613869337571238366773386318181308244237935111072607256271603656248526102492009598490205120638143923415224899689908073058800131284179621374129893525361577639595306070201323091432351719890284142312117565661804884081697597556630696419503309791419750920380224952740990294316717474919958301157249871723798444410218228692985548446454088523506882711893486354157312740234878194977819815946236879045967624220542070450161828690568738574846066444577281]

import gmpy2

for i in range(4):
    for j in range(i+1, 4):
        if gmpy2.gcd(ns[i], ns[j]) != 1:
            print(i, j)
            print(gmpy2.gcd(ns[i], ns[j]))

 然后发现是第二个和第三个,并且求出了r的值。所以对于第二个和第三个(对应第二组和第三组密钥),记

我们也需要进一步将Nr分解出p和q。在Partial Key Exposure attack中,我们需要根据

重新推一下那些方法中关于p的方程。

第一组:

第二组和第三组:

第四组:

def partial_p(p0, kbits, n):
    p = gcd(p0, n)
    if p != 1:
        return ZZ(p)
    else:
        return
def find_p(d0, kbits, e, n):
    X = var('X')
    for k in range(1, e+1):
        print(k)
        results = solve_mod([e*d0*X == k*n*X - k*n - k*X^3 + k*X^2 + X], 2^kbits)
        print(k)
        for x in results:
            p0 = ZZ(x[0])
            p = partial_p(p0, kbits, n)
            if p:
                return p
if __name__ == '__main__':
    n = 1932038554996040104455315883223718472713346303330978743187996729621529739811658796197488223680412961958556887967491813511917170439647307828115472638585061826614468592481442868170090215351305925734264287520730497594994002140743068998862077851863298594873771123822744767803224906340976228342363101074033729879279238569509131400285857667919295999183513229060721575824944210340220184232383953260959482459809500905579066796423460415005468731499877425631734048522986804875919132786153939377820467381744176688418461727816693147502213213443376334599763827118508992087636947292972915017881722657189677917877434729457682857780869117786951
    e = 1667
    d = 5912397705121717556140784657839641276560016575788920678668312850282756456341071738849340091721631088367775989603962369060157436838599496513280991842470122870570378689158520323429323908937960430964492381345224198651911458858050453721123669314789402584706012298518271648142729102770808241490823703064903677427178678987
    beta = 0.5
    epsilon = beta^2/7
    nbits = n.nbits()
    print ("nbits:%d:"%(nbits))
    #kbits = floor(nbits*(beta^2+epsilon))
    kbits = nbits - d.nbits()-1
    print ("kbits:%d"%(kbits))
    d0 = d & (2^kbits-1)
    print ("lower %d bits (of %d bits) is given" % (kbits, nbits))
    p = find_p(d0, kbits, e, n)
    print ("found p: %d" % p)
    q = n//p
    print (d)
print (inverse_mod(e, (p-1)*(q-1)))

最终求出来所有分解之后,按部就班地求私钥、解密就行了。

四个k分别为:1、954、454、1028。

最后依次解明文,解得flag为:

flag{rSA_r0UNd_1_and_rSa_R0Und_2_aNd_RsA_r0uNd_3_And_rSa_R0UNd_4_aNd_81nG0!!}

EasyBits

from Crypto.Util.number import long_to_bytes
from functools import reduce
from secret import flag

def count(s):
	seq0=[]
	seq1=[]
	cnt0=0
	cnt1=0
	for i,b in enumerate(s):
		if b=='0':
			if i!=0 and s[i-1]=='1':
				seq1+=[cnt1]
				cnt1=0
			cnt0+=1
			if i==len(s)-1:
				seq0+=[cnt0]
		else:
			if i!=0 and s[i-1]=='0':
				seq0+=[cnt0]
				cnt0=0
			cnt1+=1
			if i==len(s)-1:
				seq1+=[cnt1]
	return [seq0,seq1]

def genN(seq):
	MAX = lambda l:reduce(lambda a,b: max(a,b),l)
	a = int(''.join(str(i) for i in seq[0]),MAX(seq[0])+1)
	b = int(''.join(str(i) for i in seq[1]),MAX(seq[1])+1)
	return a*b

with open('ciphertext','wb') as w :
	w.write(long_to_bytes(genN(count(''.join(bin(ord(i))[2:].zfill(8) for i in flag))))) 

题目描述:

将明文flag的二进制表示出来,求得0和1分别的游程编码:

如00100110的游程编码就是

  • 0:[2, 2, 1]
  • 1:[1, 2]

然后分别求出每组编码的最大值M,按照M+1进制转换成一个数(接上例):

  0:最大值为2,转换成3进制即为

  1:最大值为2,转换成3进制即为

最后将算出来的两个数的乘积,得到密文c。如上例密文为25。试求得flag。

解答:

方法来自:https://zhuanlan.zhihu.com/p/363648238?utm_id=0

首先非常自然地想到将密文c进行分解,然后再枚举c的一个约数a,求得另一个对应的约数b

一开始丢到FactorDB里面分解,结果还有一块大的分解不出来。。。

然后就试试用yafu分解,本来也以为希望渺茫的,结果,您猜怎么着?等了十多分钟居然把密文c给完全分解出来了!

分解出c之后,我们就可以枚举其可能的两个约数分解c=ab,然后再枚举进制来得到游程编码。这个进制不会太大,可能8以内就足够了。

分别a将b按照对应的进制所得到的游程编码应该具有如下特性:

  • 游程编码最小值应该是1,最大值应该是对应进制-1;
  • 游程编码的长度应该是0的比1的长1个,或者0的和1的相等;
  • 0的游程编码和1的游程编码之和,即明文的位长度,应该能被8整除。

将满足如下条件的两个游程编码都转成明文然后打印出来,就能得到对应的flag。

代码如下:

#  11^2 · 48449 · 59123 · 8694766963<10> · 69630045151<11> · 103388070465146659<18> · 444180493923722421083<21> · 30585433443292955619949165033<29> · 1603284485789102527932517130294371239263<40> · 544595079558994543939523656419724930553860455113812380055988020817<66>

factors = [11, 11, 48449, 59123, 8694766963, 69630045151, 103388070465146659, 444180493923722421083, 30585433443292955619949165033, 1603284485789102527932517130294371239263, 544595079558994543939523656419724930553860455113812380055988020817]

c = 257341678671014174901705941161725480777217699326282679647327740348082868304405278349012885595624093813001761459371505300727815357112995028183296998092408041699940235629702457970518156536007414219436741641


from Crypto.Util.number import *

def convert_to_base(x, base):
    res = []
    while (x > 0):
        res.append(x % base)
        x //= base
    return res

def check_base(cur_a, cur_b):
    for base_0 in range(2, 10):
        for base_1 in range(2, 10):
            arr_0 = convert_to_base(cur_a, base_0)
            arr_1 = convert_to_base(cur_b, base_1)
            if min(arr_0) == 1 and max(arr_0) == base_0 - 1 and min(arr_1) == 1 and max(arr_1) == base_1 - 1:
                if (sum(arr_0) + sum(arr_1)) % 8 == 0 and (len(arr_0) == len(arr_1) or len(arr_0) == len(arr_1) + 1):
                    arr_0 = arr_0[::-1]
                    arr_1 = arr_1[::-1]
                    s = ''
                    for i in range(len(arr_1)):
                        s += '0' * arr_0[i] + '1' * arr_1[i]
                    if (len(arr_0) == len(arr_1) + 1):
                        s += '0' * arr_0[-1]
                    m = int(s, 2)
                    print(long_to_bytes(m))


def dfs(cur_pos, cur_a):
    if (cur_pos == len(factors)):
        cur_b = c // cur_a
        check_base(cur_a, cur_b)
        return
    dfs(cur_pos + 1, cur_a)
    dfs(cur_pos + 1, cur_a * factors[cur_pos])

dfs(0, 1)
flag{ThiS__1s__7hE__Fun__0f__0000000000000000__4ND__1111111111111111}

HardLCG?

查看代码
 from Crypto.Random.random import randrange
from Crypto.Util.number import getPrime
from gmpy2 import gcd
from Lazzaro import flag

def gen():
	while True:
		p = getPrime(1024)
		a, b = divmod(p-1, 33)
		if b == 0 and gcd(33, a) == 1:
			break
	while True:
		q = getPrime(1024)
		if gcd(33, q - 1) == 1:
			break
	n = p * q
	phi = (p - 1) * (q - 1) // 33
	y = 1
	while True:
		y = randrange(n)
		x = pow(y, phi, n)
		if x != 1:
			break
	return (n, y)

def encrypt(pt, key):
	n, y = key
	x, a, b = [randrange(n) for _ in range(3)]
	for m in pt.hex():
		yield pow(y, int(m, 16), n) * pow(x, 33, n) % n
		x = (a * x + b) % n

key = gen()
print(key)
for ct in encrypt(flag, key):
	print(ct)

考点:Gröbner基

题目描述:

解答:

哎嘿!根本不会,还是看大佬的WP吧!方法来自:https://zhuanlan.zhihu.com/p/363648238?utm_id=0

参考:DiceCTF 2021 - benaloh   恶补文章戳这里:http://www.scholarpedia.org/article/Groebner_basis

e = 33

with open('output') as f:
	sline = f.read().splitlines()

n, y = eval(sline[0])
R = Integers(n)
z = list(map(R, sline[1:]))

y = R(y)
c2m = {y^i: '{:x}'.format(i) for i in range(e)}
# print(log)

P.<u, a, b> = PolynomialRing(R)

G = []
f = u
for i, m in enumerate('fl'.encode('hex')):
	G.append(f^e - z[i]/y^int(m, 16))
	f = a*f + b

# B = Ideal(G).groebner_basis()
# print(B)

B = [b^33 + 16031687681177907248731031106082046196362558940389190255537920893145278260286186831523688673333192709870180269448459115020499242726557799472029498927808183571694532236791470608993975536490885438905622390965115959074869323064908456911560692727529505067005994279754215775384427879356092504963716002623372203199418209335799902790854478293726197240930905916546493173300196731230308972845161325516831421989645927863218953446403645799210040113180827338577062437843063425801235374223870280587800564503052151609902710448869255249235953139314068973351768698335553450774317048331793548447779610399475742044142856472721422554252, u + 19273630051510876312028391948837130735559208530601797464391382917792739466325914056141065300498343340591344736403760513707146649944931967528633072671181734629473104000685763356947423520154733094933740307690528808117934669125915530810122957885994908078588429750529786188113270477435992793081069497323891177683400254185453579959748876069492114290921372263522180441799350952526490822582269221989842284408016211692186738000383244537681346381562162044241189434156766219536542878090727248253344901540508081140668346127813642906869146875906098145393854465651620142592736674147352241598199227782415983728513549919289028035006*b, a + 19255502845055412494598156639186616977802533137859779779902434831491836632514118685219567091760922002974700395494838207560910788891198053116098070738572880218251383744888875681528762990709335016405977187591854312499564408903116456345536613238133835182879724101843007204894689108900895904528831541718387315010453778789309715503074739542111359648647225147147549555028959409565019986507914741468663755721701013341829910852217510865839702310998721303523474490806043450340937431580688386148251268735510141169465022196449586256590370203695806295665636890157261086050821487370217048191147285067128866295244210874555960577148]

flag = ''
f = -B[1].monomial_coefficient(b)*b
for i in range(len(z)):
	flag += c2m[z[i]/(f.monomial_coefficient(b)^e*-B[0].constant_coefficient())]
	f = -B[2].constant_coefficient()*f + b
print(flag.decode('hex'))
flag{LCG?NoJustBenaloh&gr:obner!}

1024杯

1024_Trick

提示:

利用 ed≡1 (mod ϕ(n)) 建立等式

查看代码
 from Crypto.Util.number import getPrime, bytes_to_long
from gmpy2 import gcd, invert
from secret import flag

def gen(x, y):
	while True:
		k = getPrime(1024)
		if gcd(x * y - x - y + 1, k) == 1 and gcd(x * y - x - y + 1, k + 1024) == 1:
			return k

p = getPrime(1024)
q = getPrime(1024)

d = gen(p, q)

e1 = invert(d, (p - 1) * (q - 1))
e2 = invert(d + 1024, (p - 1) * (q - 1))

n = p * q
c = pow(flag, e1, n)

out = open('output', 'w')
out.write(str(n)+'\n')
out.write(str(e1)+'\n')
out.write(str(e2)+'\n')
out.write(str(c)+'\n')
28247956190796077548821036165832051095182478841343849341201099128819479182033196745888916043527789810068912335285845353736774484336851382817061906161464410813261565043154569983001168979661397673033159029064565590415202266364668996185387927547647414609049665701634943970073424680262167057713264162243044242199992525550717430218592937779319306804366853371496949090902097569447358748738601201092248706444400984549491240349808244847814292328867056531536176757195282237815281620345660712787511847864860157060561247341926472934445937054346872777130907776700747053879719058858665504682167737096909091658310703848714995507087
14729696809459508716385569304221898763069627997586157384420106315856541102841676901689428248411442723122274238893709627729613555080244422116252212813081403190521848377387091820856797688344508117977167198575999802122072100976783815485227448685251402928453641606244138534312889639695831020684859444038879931443306689809413522781182634833029742866760422550903997471974167552388516014202843112478278655370138693696356621310668692751596233613748393311787483393850367208650431878268345462622307080790201460993914739555030933412223443727451306619192444521947087311524606746672804056939248534450817019868870802552074243882377
10907651584541464409470494737289836122935666586931706055595902003883184928824627549246585826596861981965927482456455737073705999708471130440398909870554351524288791148142553288839156753336551721274021596567766812030470532876231205718107266170708315964229471470530690537533600851746463150957473253899821019421342552091338365357017748742821451767352420328276163005698272017204771807428933429417340619373269170581813206653190286582334483827342338454461627946086922006705360281421384249860374825149668002500611584152958000206147344275567898096476692898681393229095674001876869497249423498186867190630700665116613171171985
14151986355027540236877811729876734276410473157789551074684191809631364271052357249861862424614207635605041553420473293592242919606316628442514124449901660763278200999279517540020047022360186952956318844301844675024175636253509419780669989143178706203706350138854046573467948881219084764605132312446701967740275650109903208220772228525117766500225573404421894020148747991820530966508849170593946661068452445685905577771836515980941955814291933511646362511812580324895180140431064196870852032763940873198931010750588123937360585160510295014722360134758829576304291022740315244570633962516612490451736612193602659033973

EXP

import gmpy2
n=28247956190796077548821036165832051095182478841343849341201099128819479182033196745888916043527789810068912335285845353736774484336851382817061906161464410813261565043154569983001168979661397673033159029064565590415202266364668996185387927547647414609049665701634943970073424680262167057713264162243044242199992525550717430218592937779319306804366853371496949090902097569447358748738601201092248706444400984549491240349808244847814292328867056531536176757195282237815281620345660712787511847864860157060561247341926472934445937054346872777130907776700747053879719058858665504682167737096909091658310703848714995507087
e1=14729696809459508716385569304221898763069627997586157384420106315856541102841676901689428248411442723122274238893709627729613555080244422116252212813081403190521848377387091820856797688344508117977167198575999802122072100976783815485227448685251402928453641606244138534312889639695831020684859444038879931443306689809413522781182634833029742866760422550903997471974167552388516014202843112478278655370138693696356621310668692751596233613748393311787483393850367208650431878268345462622307080790201460993914739555030933412223443727451306619192444521947087311524606746672804056939248534450817019868870802552074243882377
e2=10907651584541464409470494737289836122935666586931706055595902003883184928824627549246585826596861981965927482456455737073705999708471130440398909870554351524288791148142553288839156753336551721274021596567766812030470532876231205718107266170708315964229471470530690537533600851746463150957473253899821019421342552091338365357017748742821451767352420328276163005698272017204771807428933429417340619373269170581813206653190286582334483827342338454461627946086922006705360281421384249860374825149668002500611584152958000206147344275567898096476692898681393229095674001876869497249423498186867190630700665116613171171985
enc=14151986355027540236877811729876734276410473157789551074684191809631364271052357249861862424614207635605041553420473293592242919606316628442514124449901660763278200999279517540020047022360186952956318844301844675024175636253509419780669989143178706203706350138854046573467948881219084764605132312446701967740275650109903208220772228525117766500225573404421894020148747991820530966508849170593946661068452445685905577771836515980941955814291933511646362511812580324895180140431064196870852032763940873198931010750588123937360585160510295014722360134758829576304291022740315244570633962516612490451736612193602659033973


kphi = (e1-e2)-1024*e2*e1
dd = gmpy2.invert(e1, kphi)
msg = pow(enc, dd, n)
print(bytes.fromhex(hex(msg)[2:]))
#flag{wh47_1F_1_H4V3_pr1v473_K3Y+X???}

1024_密码系统

提示:

Unlock Hint for 50 points

ECB模式对两个相同的明文分组加密后得到的密文分组是一样的

Unlock Hint for 50 points

FLAG长度为38位,由1024这四个数字组成,经一定的转换后得到flag,最终flag需要包上flag{}提交

DES-ECB模式攻击,参考:https://www.jianshu.com/p/8aef410a2eae

查看代码
 # -*- coding:utf-8 -*-
# Author:airrudder

from Crypto.Cipher import DES
from binascii import b2a_hex, a2b_hex
from secret import FLAG,KEY,HINT
from itertools import *
import random

def Encode_1024sys(data,key):
    data_list = [data[i:i+8] for i in range(0,len(data),8)]
    k1 = DES.new(key.encode(), DES.MODE_ECB)
    k2 = DES.new(key[::-1].encode(), DES.MODE_ECB)
    data_res = ''
    for i in range(0,len(data_list)):
        k = random.choice([k1,k2])
        c = k.encrypt(data_list[i].encode())
        data_res += b2a_hex(c).decode()
    return data_res

def Encode_1024(data,key):
    len_data=len(data)
    choices = cycle('1024')
    while len_data%8!=0:
        data += next(choices)
        len_data=len(data)
    data_res = Encode_1024sys(data,key)
    data_out = hex(int(data_res,16)**12 + random.randint(10**1023,10**1024))[2:]
    return data_out

def main():
    menu = '''
1. Encode
2. Verify your FLAG
3. Exit
'''
    try:
        while True:
            print(menu)
            choice = input("> ")
            if choice == "1":
                msg=input("Please input your msg: ")
                data_out = Encode_1024(msg+FLAG,KEY)
                print("hex(Encode_1024(msg+flag)) is :",data_out)
            elif choice == "2":
                yourFLAG = input('Please input your FLAG: ')
                if yourFLAG == FLAG:
                    print(HINT)
                else:
                    print('1024, nonono..., come on!!!')
            elif choice == "3":
                print("Bye!")
                return
            else:
                print("Invalid choice!")
                continue
        
    except:
        print('error')
        
if __name__ == "__main__":
    main()

EXP

#解题脚本
from pwn import *
from string import printable
import gmpy2
p=remote('pwn.challenge.ctf.show',28128)
list=printable
payload=''
k=0
pad=['','1024102','102410','10241','1024','102','10','1']

def check(m):
    t=k//8
    if t==0:
    	m1=m[:16]
    	m2=m[-(t+1)*16:]
    else:
    	m1=m[:16]
    	m2=m[-(t+1)*16:-t*16]
    if m1==m2:
        return 1
    else:
        return 0
def repeated():
    p.recvuntil('> ')
    p.sendline('1')
    payload1= j + payload + pad[len(j + payload) % 8] + 'a' * (len(payload) + 1) + 'aa'
    p.recvuntil('msg: ')
    p.sendline(payload1)
    p.recvuntil('is : ')
    ic = p.recvuntil('\n')[:-1]
    c = int(gmpy2.iroot(int(ic, 16), 12)[0])
    m = hex(c)[2:]
    return check(m)

for i in range(38):
    print(i)
    for j in list:
        a=0
        a+=repeated()
        a+=repeated()
        a+=repeated()
        a+=repeated()
        a+=repeated()
        a+=repeated()
        a+=repeated()
        print(a)
        if a>0:
            payload=j+payload
            k+=1
            break
print(payload)
p.interactive()
#44414440122401244401404424404421440414

云影密码解密:

# 云影密码
a="44414440122401244401404424404421440414"
s=a.split('0')
l=[]
print(s)
for i in s:
    sum=0
    for j in i:
        sum+=eval(j)
    l.append(chr(sum+64))
print(l)
#['Y', 'I', 'O', 'E', 'R', 'S', 'I']

 得到flag:flag{yioersi}

1024_麻辣兔头第七锅

提示:

小白兔,白又白,跳出栅栏进锅来

<TH CTIW yhty,fEDLINhh ae  oEAODeufv sLuRNEnmoeahinA P ar nobdOEin cdueaFNn oo lrt D ennedtiEtvenq yoNhe eud,nCenpcae  E tetlcao>Csoe lnno,pdsad u l tr srietaetust ht hce teiteh bomoh  oe  neppfcdw  uroiitcrimstoasnesh uucso wsii lahetpnvnis leeoc oec thwfseth h  shetiHaserhcana ,ehpdrp   p oaLiiolnamnridwpegt sesait lsncoo .ia ftfzla hli sNeanbsamggout { nmut8iderocts e 5s a t6 wmahdphone4oind awcg sbeh oe3r tfpesh ad eNr8i aa4nPttf oui8swroeueenbcr'.7hssWd   e2foG bofohcr do7mt l3,hed6 en 7a tt2seih8 ate1trls4oteed h  5t,tt}h hrTeteuhmhmta e,hts  s hsa tae tolpdo lae s rcbesaeecen uetsrm ee rl meftos-hspeetevs cieltd i erktnieotgl ,hyt t htsteh,o a  otGep ofiavfnleeilrco ntnmm seet nnho tefasi r rmea a rSnceakr fieienantdtsy et rdiae tnqeuduqt iueHradael ps,ap  mittonhhneaagstt s  M.tte hhnPee,ry u ddaeerrneic veei,nn dgio nwtdehedee idbr,y   jwtuihsletli  rpd oiCwcreteraastt eof rrt ohwmai ttt hhG eoc vecerortnnasmieennn ttu sno afll oitnehgne a ebgsloteva ebRrlinigeshdht.eshd,a  tst hhwoahutel ndae mvnoeonrtg   abtnehy e csfheoa rnamgr eeod f L fiGoforev elringmhetn ta nbde ctormaenss ideenstt rcuacutsievse;  oafn dt haecsceo rednidnsg,l yi ta lils  etxhpee rRiiegnhcte  ohfa st hseh oPweno,p lteh atto  maalntkeirn do ra rteo  maobroel idsihs piots,e da ntdo  tsou fifnesrt,i twuhtiel en eewv iGlosv earrnem esnutf,f elraaybilneg,  itthsa n to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and usurpations, pursuing invariably the same Object, evinces a design to reduce them under absolute Despotism, it is their ri

提示栅栏密码,仔细看密文发现只有一对{},且{前30个字节内有f/l/a/g四个字母,且间隔相等,截取f开头到}结尾的字符串,尝试按6位一行取出并观察每行首字母,flag部分为0-f字符,调整第15行之后为5位一行,最后每行首字母连成flag。

flag{8c56d4ab3ed84f8eb7d2bc73672814d5}

ROARCTF复现

Crypto_System

查看代码
 # These three are constants
p =
12039102490128509125925019010000012423515617235219127649182470182570195018265927223
g =
10729072579307052184848302322451332192456229619044181105063011741516558110216720725

# random generation
m1 = "test1"
m2 = "test2"

# Initialization
r1, s1 = sign(m1)
# r1 R1 will be provided to player

def int2str(data, mode="big"):
	if mode == "little":
		return sum([ord(data[_]) * 2 ** (8 * _) for _ in range(len(data))])
	elif mode == "big":
		return sum([ord(data[::-1][_]) * 2 ** (8 * _) for _ in range(len(data))])

def get_parameter(m):
	x = int2str(m, 'little')
	y = powmod(g, x, p)
	a = bytes_to_long(hashlib.sha256(long_to_bytes(y).rjust(128, "\0")).digest())
	b = powmod(a, a, p - 1)
	h = powmod(g, b, p)
	
	return y, h, b

def sign(m):
	y, h, b = get_parameter(m)
	r = getStrongPrime(512)
	s = (y * powmod(h, r, p)) % p
	
	return str(r),str(s)

def verify(m, r, s):
	y, h, b = get_parameter(m)
	if s == ((y * powmod(h, r, p)) % p):
		return True
	else:
		return False

# Give me the (r2,s2)
if r2 != r1 and s2 == s1 and verify(m2, r2, s2):
	print("Congratulation!Here is your flag: %s" % flag)

参考:一道CyBRICS 2020 - Too Secure魔改的Pedersen加密,算法如下图

EXP:

p =12039102490128509125925019010000012423515617235219127649182470182570195018265927223
g =10729072579307052184848302322451332192456229619044181105063011741516558110216720725
G=GF(p)
g=G(g)
print(g.multiplicative_order())
#q=1039300813886545966418005631983853921163721828798787466771912919828750891
import hashlib
import gmpy2
from Crypto.Util.number import *
import string
from signal import alarm
from Crypto.Util.number import *
from string import digits, ascii_letters
from pwn import *
io=remote('pwn.challenge.ctf.show',28171)
table = digits+ascii_letters
def proof_of_work():
	rev = io.recvuntil("sha256(XXXX+")
	suffix = io.recv(16).decode()
	io.recvuntil(" == ")
	res = io.recv(64).decode()
	def f(x):
		hashresult = hashlib.sha256((x+suffix).encode()).hexdigest()
		if hashresult == res:
			return 1
		else:
			return 0
	prefix = util.iters.mbruteforce(f,table,4,'upto')
	io.sendline(str(prefix))
def int2str(data, mode="big"):
    if mode == "little":
        return sum([ord(data[_]) * 2 ** (8 * _) for _ in range(len(data))])
    elif mode == "big":
        return sum([ord(data[::-1][_]) * 2 ** (8 * _) for _ in range(len(data))])
def get_parameter(m):
    x = int2str(m, 'little')
    y = pow(g, x, p)
    a = bytes_to_long(hashlib.sha256(long_to_bytes(y).rjust(128, b"\0")).digest())
    b = pow(a, a, p - 1)
    h = pow(g, b, p)
    return [x,y, h, b,a]
def verify(m, r, s):
    y=get_parameter(m)[1]
    h=get_parameter(m)[2]
    if s == (y * pow(h, r, p)) % p:
        return True
    else:
        return False
def sign(m,r):
    y= get_parameter(m)[1]
    h=get_parameter(m)[2]
    s = (y * pow(h, r, p)) % p
    return s
proof_of_work()    
p=12039102490128509125925019010000012423515617235219127649182470182570195018265927223
g=10729072579307052184848302322451332192456229619044181105063011741516558110216720725
q=1039300813886545966418005631983853921163721828798787466771912919828750891
io.recvuntil('Here is the frist message(64 bytes):')
m1=str(io.recvuntil('\n')[:-1])[2:-1]
m1=str(long_to_bytes(int(m1,16)))[2:-1]
io.recvuntil('Here is the second message(64 bytes):')
m2=str(io.recvuntil('\n')[:-1])[2:-1]
m2=str(long_to_bytes(int(m2,16)))[2:-1]
io.recvuntil(':')
a=io.recvuntil('\n')[:-1]
r1=int(a)
b1=get_parameter(m1)[3]
s1=sign(m1,r1)
x1=get_parameter(m1)[0]
b2=get_parameter(m2)[3]
x2=get_parameter(m2)[0]
r2=(b1*r1+x1-x2)*gmpy2.invert(b2,q)%q
s2=sign(m2,r2)
io.recvuntil('Please choice your options:')
io.sendline('3')
io.sendline('('+str(r2)+','+str(s1)+')')
io.interactive()

EASYRSA

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

assert(flag.startwith('flag{')) and (flag.endwith('}'))
assert(is_prime(beta) and len(bin(beta)[2:]) == 512) 
assert(len(bin(x)[2:]) == len(bin(y)[2:]))
# This is tip!!!
assert(tip == 2*x*y*beta + x + y)

p = 2*x*beta + 1
q = 2*y*beta + 1

assert(is_prime(p) and is_prime(q))

n = p*q
e = 65537
m = bytes_to_long(flag)
enc = powmod(m,e,n)
#n=17986052241518124152579698727005505088573670763293762110375836247355612011054569717338676781772224186355540833136105641118789391002684013237464006860953174190278718294774874590936823847040556879723368745745863499521381501281961534965719063185861101706333863256855553691578381034302217163536137697146370869852180388385732050177505306982196493799420954022912860262710497234529008765582379823928557307038782793649826879316617865012433973899266322533955187594070215597700782682186705964842947435512183808651329554499897644733096933800570431036589775974437965028894251544530715336418443795864241340792616415926241778326529055663
#e=65537
#enc=10760807485718247466823893305767047250503197383143218026814141719093776781403513881079114556890534223832352132446445237573389249010880862460738448945011264928270648357652595432015646424427464523486856294998582949173459779764873664665361437483861277508734208729366952221351049574873831620714889674755106545281174797387906705765430764314845841490492038801926675266705606453163826755694482549401843247482172026764635778484644547733877083368527255145572732954216461334217963127783632702980064435718785556011795841651015143521512315148320334442235923393757396733821710592667519724592789856065414299022191871582955584644441117223
#beta=11864389277042761216996641604675717452843530574016671576684180662096506094587545173005905433938758559675517932481818900399893444422743930613073261450555599

已知tip =  2 ∗ x ∗ y ∗ b e t a + x + y , p h i ( n ) = 4 ∗ x ∗ y ∗ b e t a

所以可以通过 t i p / b e t a 爆破 x ∗ y求出 p h i

EXP

from Crypto.Util.number import *
from  gmpy2 import invert
n=17986052241518124152579698727005505088573670763293762110375836247355612011054569717338676781772224186355540833136105641118789391002684013237464006860953174190278718294774874590936823847040556879723368745745863499521381501281961534965719063185861101706333863256855553691578381034302217163536137697146370869852180388385732050177505306982196493799420954022912860262710497234529008765582379823928557307038782793649826879316617865012433973899266322533955187594070215597700782682186705964842947435512183808651329554499897644733096933800570431036589775974437965028894251544530715336418443795864241340792616415926241778326529055663
e=65537
enc=10760807485718247466823893305767047250503197383143218026814141719093776781403513881079114556890534223832352132446445237573389249010880862460738448945011264928270648357652595432015646424427464523486856294998582949173459779764873664665361437483861277508734208729366952221351049574873831620714889674755106545281174797387906705765430764314845841490492038801926675266705606453163826755694482549401843247482172026764635778484644547733877083368527255145572732954216461334217963127783632702980064435718785556011795841651015143521512315148320334442235923393757396733821710592667519724592789856065414299022191871582955584644441117223
beta=11864389277042761216996641604675717452843530574016671576684180662096506094587545173005905433938758559675517932481818900399893444422743930613073261450555599
tip = (n-1)//(2*beta)  
xy1=tip//beta
def attack(xy1):
    while True:
        try:
            xy1=xy1-2
            d=invert(e,2*xy1*pow(beta,2))
            c=pow(3,e,n)
            if pow(c,d,n)==3:
                return d
            else:
                continue
        except:
            continue
d=attack(xy1)
print (long_to_bytes(pow(enc,d,n)))
#flag{21824349-25bb-4f7f-b551-f13d4abba2e2}

Reverse

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

assert(flag.decode().startswith('flag{')) and (flag.decode().endswith('}'))
def reverse(x):
	y = 0
	while x != 0:
		y = y*2 + x%2
		x = x // 2
	return y


while True:
	p = getStrongPrime(512)
	q = reverse(p)
	if is_prime(q):
		break

n = p*q
e = 65537
m = bytes_to_long(flag)
enc = powmod(m,e,n)
#n = 158985980192501034004997692253209315116841431063210516613522548452327355222295231366801286879768949611058043390843949610463241574886852164907094966008463721486557469253652940169060186477803255769516068561042756903927308078335838348784208212701919950712557406983012026654876481867000537670622886437968839524889
#enc = 103728452309804750381455306214814700768557462686461157761076359181984554990431665209165298725569861567865645228742739676539208228770740802323555281253638825837621845841771677911598039696705908004858472132222470347720085501572979109563593281375095145984000628623881592799662103680478967594601571867412886606745

参考 https://kt.gy/blog/2015/10/asis-2015-finals-rsasr/

因为p和q是顺序相反的素数,所以p的每一位都和q有关系。所以我们可以尝试遍历p,通过判断生成的p与q再进行迭代。从而得到p和q,进而求flag

EXP

n = 158985980192501034004997692253209315116841431063210516613522548452327355222295231366801286879768949611058043390843949610463241574886852164907094966008463721486557469253652940169060186477803255769516068561042756903927308078335838348784208212701919950712557406983012026654876481867000537670622886437968839524889

def Brute_force(a,b,k):
    if k == 256:
        if a*b==n:
            print (a,b)
        return 0
  
    for i in range(2):
        for j in range(2):
            
            a1=a+i*(2**(511-k))+j*(2**k)
            b1=b+j*(2**(511-k))+i*(2**k)
            
            if a1*b1>n:
                continue 
                
            if  (a1+2**(511-k))*((b1+2**(511-k)))< n: 
                continue 
                
            if (a1*b1)%(2**(k+1)) != n%(2**(k+1)):
                continue

            Brute_force(a1,b1,k+1)

    return 0

Brute_force(0,0,0)        
#11954360020159164180709939019047385560179850436770100207193049651260543609501871575909448998378290922795824941066935928157032997160163537467165365731882943 13299413764048930133302138749466137829470129709829516069778014310838093114516400589047888072065037035007023741009041669893387899867083575829855377403280423
#13299413764048930133302138749466137829470129709829516069778014310838093114516400589047888072065037035007023741009041669893387899867083575829855377403280423 11954360020159164180709939019047385560179850436770100207193049651260543609501871575909448998378290922795824941066935928157032997160163537467165365731882943
#解密脚本:
import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
p=11954360020159164180709939019047385560179850436770100207193049651260543609501871575909448998378290922795824941066935928157032997160163537467165365731882943 
q=13299413764048930133302138749466137829470129709829516069778014310838093114516400589047888072065037035007023741009041669893387899867083575829855377403280423 
c = 103728452309804750381455306214814700768557462686461157761076359181984554990431665209165298725569861567865645228742739676539208228770740802323555281253638825837621845841771677911598039696705908004858472132222470347720085501572979109563593281375095145984000628623881592799662103680478967594601571867412886606745


phi = (p-1) * (q-1)
n = p * q
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))
#flag{b92d9b6c-e75d-4cbb-bc39-bf39a2f57c3f}

大吉大利杯(部分)

easysignin

查看代码
 from Crypto.Util.number import getPrime, isPrime, bytes_to_long
from random import getrandbits
from secret import flag

def genpq(k):
    while True:
        p = getPrime((k + 3) // 4)
        q = getPrime((k + 3) // 4)
        if ((p ** 2) * (q ** 2)).bit_length() == k:
            return (p, q)

def genseq(t, k):
	x = getrandbits(k)
	y = getrandbits(k)
	r = []
	r += [pow(x * getrandbits(k)+y, pow(getrandbits(k), t - 1, t), t)]
	for i in range(len(flag)):
		r += [pow(x * r[i] +y, pow(getrandbits(k), t - 1, t), t)]
	return r

(p, q) = genpq(2021)
e = getPrime(0x0123)
r = [genseq(p, p.bit_length() // 4), genseq(q, q.bit_length() // 4), genseq(e, e.bit_length() // 4)]
c = pow(bytes_to_long(flag), e, 2021 * p * q)

out = open('output.txt','w')
out.write(str(r) + "\n")
out.write(str(c) + "\n")
out.close()
[[52410740454341322584968668119249347590637310744053575667199658377254616720, 645233054655774190743329734650633925675658559407235845892000719418629264735950925156778060047916782135118939609, 7943518660704895786672594284269647711181509726633514226380530196425485458539625694575495231887385619012015881286882728587606040595061922764546504652, 88914058098690563261741069739196350367736459872642989654182096322219071679192700322294625591039910568014594162793682719562807511893126265269018965631844, 21848556616661858554457567702772141873495700440964466396641152668611914726571047215318351614761015187840557741595013435098462212054082613351365353879971, 30981990147740324963531127581242040452010812929397936350977330949621677682914852118175610889739709323337510806201042485424717012639070029274069982697770, 86391152218016366813847004247404056131417771687236374092616383814217301192122912423701248555978593644222324385731750478659656390099667206731986826034783, 11919788822817325862607995189694676040563253448913899451812469694262245578863190210002110273555634880385761984875510033893001873388959689185144905903209, 113172562380439676720883790279148843121957456418188815624366983390069987176782078966213846939157552371083567965339468376209438408527447055279432563530293, 53639431322349477360106465790490257401135940987536122273392905439789302677727263369595453217090741732679101465032774237786279512056854438308525173657159, 66494591146164538399359207417261107297618965139951036147349388185500471848417939882942051000401169375606555137676945793825997569250321049050064328504686, 68140755777619578564543055029117317295128399240486821374257706188512954130154120098052147911199011456619478205381967508904616755976025013771737828736712, 108937156773321279370931816069281780172829105656866216917516598661018254865761711673453882295854673659374303771527203182421483883387191105457655039518598, 23851657909638071121522950452985193121203677553882352681904178324157544934072951198267420469049884225406011127813710965228771378971223671119499320807527, 73593420351924535735583383759106213752911143688405196033083181161847427289244164307112764704106027032275168673202117613094614344445994185733167048206528, 45149231454111577928491035214773110610124553323394642764742046515465337002110008680672172596244297975180829797354612671475605687567668633260989146225109, 116595530380208734174324933018691232247236449545224536610877958513488572395417607779848679300427540247845082936159111075084099286531721388893818985053741, 19184570673197822395630076591747812314740067696017031829688067440093395269633819900129824384419564803863978782409207577313654883568996185370309615089861, 25053641421607032412936267237167725716755999385160231284419862285097826856694410270421890957270689086653085525341558101625176940863016775431803134278503, 41834644301798766586022917842507064432100240754373142283841634039601045968196848660974947416021443814036134492045552003431910969249042558378746090903740, 42360644234440625880638052651286919014389438067342750959116570502193321560916125003972414759569882508574236473191565962375571182326447121493190045921270, 64154129476091746233508446729279257596903523952542574303253450285299398583980541526259161563202739149004027272968609086796202499698823078817922156242997, 99743770056582602741303337738692194013086027384260039696324929460010638859447328004451799213553786836333122482774819971466325395235923612135604232226628, 76016751544879152402468315780586583194677362762856804802274327372452749909986720770385321555358806909857936245178757512784557916380481731086991902054287, 15290970738221187280390322268161848800499662337983876912254205399494853703975899722962615773380166218671937854689533200852650284347709468624816742506301, 67706974286610751556509787688743881517790029217389913481852566524040229236517365403017047098395951124264255110450504690606926248507428249271556983456901, 93639585966460526678788701909900876014525038540391772469992121354765056693895744954209300307081001946602586071602887248893957063725982565677570972746179, 116294621911461475477765026959041413149677852360214402280735648748333959155194969755168263936256009261138274595240480200664019902568187683340477743969899, 5600077388578735042597674074656979994549617482972881863164687525745536334190390401329680675467385619222535929475803379568900871335069384301033734714233, 14950370510302209746655108744292059719774565235701177358607157704462080787582712898381047410531181256769171281519411806803555715962755361346294970645323, 62016127245313515166454506817734613861723408949410899879216139989641932810248154680978274902855232651990299832297039642288310178403863342787840550299197, 95333439043968773649754476810195845118762991943266271403726184079242047672417932848967803488781971181275041399864016152589549446967782464066482170680045, 17892190659451591126424119305367671928739240611597727166543577571172322192576331228580357825811249660239169745390013910560069896203797045063231158722853, 47343585379646662714119978325645155712476914243757156114505021559030784519828048323795389199684946739451189942398561417829509539613791387644014640880892, 107633502313698058424938275622569640009485699854002361851653372416279664993830018051561865544743074946977906999458321566411251984151075748983779536801656, 101301834848265959280691115298109056299094420476120335636075492785328213139655230146061664228486248771534280699591814762729915638378841230330876525933001, 100833383873897711880618620396289395792480753105857884143070890861779172346713570088651208648247678032376842604846315923312830531728252064463150986767877, 110832079086180425600051267498601847526388754584982689270788472799404147017261513262539159424820032777910677631796771424828022748042489660903717952947232], [2447835208216480089797117166098772864739983439147154550843410133502162338263, 90343453249141616309012786446354427397838634661038147051928857871447909510509540184081882802706067411363905232391, 3334350089247517867244794106926436317086273858623518082485947115508154733111001565093191192674670220618972600184165291699923904558749567306156634412295, 10773127238350735566139610265473489634284355749344684347913928639165091011956627111779426812064973544315989779523475733083567151499479793829671206141097, 106073688178033729190829682109679728245170052489478284990130508152039157863313154674078420619615011691032124222115566415769268517103742200043347846746310, 96864656966701608190452551924897023075560536848477610188768188296307194880004203630087264191421619540332532988322143583373922117130397679868254621842062, 90007570555125944092169218313738703993888121021783637142913909308099775085919518984873236408360228986382651525244328621860786089655176559888337945973265, 107604402646950221603694740182904829452610405361494187112972298194020162739490546852179057650360974702490340526819923399009740841491688354483369514169504, 106563280130150122326814032245025170948640642468357539265829858841580809022713867834571254297385660279367044782111285768058114284965175416454533853149098, 34006794372719255946701440846013876868985083446980545795344603308580913114300387951211231095472417358606631528579058832071833342645392417576288348171281, 80528690688989385531407273709213599547356208780618772147048236656262530606555256335153687882045380456243914208416285214393577589279953053395148801048043, 25252035922809872666372710839612084651799975462368368568421254228924839144802392424596779526739759011515745889793921767279843129898429087648706961214380, 15441075054379206603678761656461990005728026633190896788589499872488783507420374230165723864117983219469482787021780166107230849440690930291658692943884, 15730255840343160294128109470006774677678596243801516284827627241776907423825237162176372972699529694206547624329200148008905292241372763696643556851248, 15929374919958330762187534489183857327423262543417435665674052288372574077203981789863180537536922526152815069819616552018951188431418135256962942313150, 16820416513541190327907989962230541088691747266081952862738221010557935254064045592670849585275377539144509827653431170474288972399346359112627171936199, 62613123636486933874885881624168137103745407796444871779926315982802027799075166745074790838012194635812853433064138182942124531618582978708688026203712, 103390317097626211538390057925702534478424865400956004756449501914108837524902468766472576617059468680745338232757547345497585919880616072977553233278603, 106855090961917607608766903030826427305834559006355051082927925151921938627824191628649167300491312597092422279212561689251186535550087727802277317012637, 78550566353218314794723213322674271780550941969941432645092204751089489784529040122660556916516795686398814802277195824477145440164288404226182667432413, 27234374989834250512863591479223580820709377656219659243546791666422683600672138485672126972130292224970890443705416445427654052263167668188984214509496, 89073500384217027637576686609574923520864474465437796981228200517382920934009159891695058762467754821583073917774195612915842601271956467375250874741115, 81523221328096138331223676561475793372150203835133425580501094268867250067873677785078977441798107146380161414152017043957710432372886446496269471249870, 69426635873092086451473939772373894337793035157602866886753621226137855012060402481656332348663588598120734258884064385818693263157949512108768237653037, 27038496127031393485308453098136903958592822859537990682349040311778748501331008447014951690343425476063063582655448477055880499291781315998134395062551, 86563190395140161836966058609094941013946825669471943800850341447296711952143605563471041765702929391516506170236643633037511742900440430412347138373811, 92654519757605791295431607106260304699360787251056766515059747102627521170620749248095214607497002308663852187075958446074495640666063038994344066529674, 47978472743885278893083282341878167737725647616340703972452890584651298269018115725710882998002541867355534242320731285507237225498136712897684035221694, 33937234952409141712999986890445630797610786424992916483378338039398873916932446399890479122582956874435985731634172335771866950539140459057793782237502, 53536716653947884337358943672946218345105772801556349741322007215929226375220858833185514799016429985979192211191664179249403984470298515297769983151764, 15571885519410418984279068975979417469158262995629377377010899727496518373589643663028156863791907436837054446354508286361951842342722672331011023846114, 8566869430523038374329005968331909880668039196226700509945801110864252361948997146164771896223981284735805514278445995598366675322977971551419425480644, 87201260842977762054169640055047984836895338107976452298751798557901196013452620843946503586203236027871183035720513488012632267170999498276073312805571, 93478630791498129840635935563160804999341438068212212075961484875554801063436616116564312106399142481823172612186464441144737797880760682581757444561694, 49399628737188601660367894914908547591976252279392032109588827791264737386179351022649986152248431169393115396754709411287013944596327999564120047443685, 401770084546389936795883960043586247087806968600408302529922285961914019164988332998528995717095956973083747814499516267750284263835592854038001543364, 46910295459783203906544465622227903475837618852453968036856768892034422511892075866806031498301570602549864578109096480551648362399275135770250479266764, 48705341969973174964195737555908215932127208480896065769947732952516004887948769345944422825151845846335939723147282687407339303320406462649862333812892], [6763996718934951285742307562806923397006813, 12234833447991510153841494781985313133191586854789667980564533023, 22130576894138701986742918639431233979778270965194566122306861346111716828577556403873, 767648503612570945278792619619046535101078814202096337589566648572901378566441587067065, 1534503080514914991237881845264698854398689474324594013087679222396116209460382272347120, 2150152040945137216175051477345156832872965887696888090617763887196376039836211151684155, 1519134084444926105081859598135660300537196230332783741163873836023160842189452416751204, 1347961026269871555909121507968616952100851882185690586872363417766328195659354367286160, 442978203022900661788725058674237344919172289937224290573991574448751808619506704123728, 434277065671750016380827889451816552550232352950909430034013985469154609260218730764780, 979776898630843046146074197140740184861751729514455753655622904091278621814340310325052, 873700620112565719323179396419879070723310944684570011051348198205453537590517739575294, 1256514485942478003559638390025523283241250878990443282316967845337571713994674756627249, 2201413023234946734277012190477530998161056783942361564091571454780425152722167887757333, 15845440233510397242131879469914499447138153273633842521183302623397377025857347058355, 719557135712047144341175773587928323041035301800224566640992208827132114843710118060603, 1872194680805780497350808471632655890088399919927439303351392835028632946050942049128363, 739802156645251387441611149162232326760167809822024988834688224156162966157182526727210, 1842345264759627182982545223023325564813297247358347573262929227611626782102112032498792, 1942056684591589139535850561429570147021382203103121319949566652649463471174580278445972, 1897401671012077468168242201956275317342401618250346254943410859299471001683176665446266, 1299697210304599531296837763293611409445703982993464696432211710136915756408352763838420, 6339661487999740913576932261380541287960678716377148820725064627689077214923145744267, 206550580254594047163709231196572177167911612047377521986355302588778287613331054094422, 2095017194382050543451996020322766986862239168048229828922060511851698524762340797229358, 38154091093834482476428418031816301638508654861013053691521551593888386192530215738249, 2312527000380201589293545236295238368648424299462645212556813668113451665892155924195549, 1148055457422644367319939159612923263814575289811148258779972071041630980150900639103033, 2491032359438353539795070569649180009224077260857699946936305612971624383446047213147218, 2502865604540348808929226301472051722005592649019284150593000357524824393775392671519130, 1039938101331801857780518763744667966269026413223284682004343257200589049680488254035897, 316947919834210211954441725158411391798247265696200080865972078867990121934703299224598, 1191200775168680784071665067183230700343262160056248368421562785231813797955113569864397, 517875043776615303660143356495634794257910735766828738806709874383193521216795724710570, 177783588672600341630231835251624651899982858825356048074013206591129692021093027549523, 1181655045918151017173609506041984644632154476633196738728202200703641104893529622554198, 1943728872455114467893276648701066972260927692980375525686315254866764954534482612584812, 841323196734187035327534237852681191366390226431490238525430672327199713070166890155539]]
1499341850116033218583322015832654376326982200720069022052964940686970117688218295301399005244875933100636608594036976589026918517646244220826168516373612155557984806411945784862108964553911520434368098212111129654894447128360717210621466898152738161667124194644244479881039031313468828783882375812512993823

根据bits长度信息,可知每个genseq函数的前面三个数据都够不到模数,故前面所给的都是实际的计算数据,根据前三个数据计算出p,q,e

 EXP

import gmpy2
import sympy
from Crypto.Util.number import long_to_bytes

pc=[52410740454341322584968668119249347590637310744053575667199658377254616720, 645233054655774190743329734650633925675658559407235845892000719418629264735950925156778060047916782135118939609, 7943518660704895786672594284269647711181509726633514226380530196425485458539625694575495231887385619012015881286882728587606040595061922764546504652, 88914058098690563261741069739196350367736459872642989654182096322219071679192700322294625591039910568014594162793682719562807511893126265269018965631844, 21848556616661858554457567702772141873495700440964466396641152668611914726571047215318351614761015187840557741595013435098462212054082613351365353879971, 30981990147740324963531127581242040452010812929397936350977330949621677682914852118175610889739709323337510806201042485424717012639070029274069982697770, 86391152218016366813847004247404056131417771687236374092616383814217301192122912423701248555978593644222324385731750478659656390099667206731986826034783, 11919788822817325862607995189694676040563253448913899451812469694262245578863190210002110273555634880385761984875510033893001873388959689185144905903209, 113172562380439676720883790279148843121957456418188815624366983390069987176782078966213846939157552371083567965339468376209438408527447055279432563530293, 53639431322349477360106465790490257401135940987536122273392905439789302677727263369595453217090741732679101465032774237786279512056854438308525173657159, 66494591146164538399359207417261107297618965139951036147349388185500471848417939882942051000401169375606555137676945793825997569250321049050064328504686, 68140755777619578564543055029117317295128399240486821374257706188512954130154120098052147911199011456619478205381967508904616755976025013771737828736712, 108937156773321279370931816069281780172829105656866216917516598661018254865761711673453882295854673659374303771527203182421483883387191105457655039518598, 23851657909638071121522950452985193121203677553882352681904178324157544934072951198267420469049884225406011127813710965228771378971223671119499320807527, 73593420351924535735583383759106213752911143688405196033083181161847427289244164307112764704106027032275168673202117613094614344445994185733167048206528, 45149231454111577928491035214773110610124553323394642764742046515465337002110008680672172596244297975180829797354612671475605687567668633260989146225109, 116595530380208734174324933018691232247236449545224536610877958513488572395417607779848679300427540247845082936159111075084099286531721388893818985053741, 19184570673197822395630076591747812314740067696017031829688067440093395269633819900129824384419564803863978782409207577313654883568996185370309615089861, 25053641421607032412936267237167725716755999385160231284419862285097826856694410270421890957270689086653085525341558101625176940863016775431803134278503, 41834644301798766586022917842507064432100240754373142283841634039601045968196848660974947416021443814036134492045552003431910969249042558378746090903740, 42360644234440625880638052651286919014389438067342750959116570502193321560916125003972414759569882508574236473191565962375571182326447121493190045921270, 64154129476091746233508446729279257596903523952542574303253450285299398583980541526259161563202739149004027272968609086796202499698823078817922156242997, 99743770056582602741303337738692194013086027384260039696324929460010638859447328004451799213553786836333122482774819971466325395235923612135604232226628, 76016751544879152402468315780586583194677362762856804802274327372452749909986720770385321555358806909857936245178757512784557916380481731086991902054287, 15290970738221187280390322268161848800499662337983876912254205399494853703975899722962615773380166218671937854689533200852650284347709468624816742506301, 67706974286610751556509787688743881517790029217389913481852566524040229236517365403017047098395951124264255110450504690606926248507428249271556983456901, 93639585966460526678788701909900876014525038540391772469992121354765056693895744954209300307081001946602586071602887248893957063725982565677570972746179, 116294621911461475477765026959041413149677852360214402280735648748333959155194969755168263936256009261138274595240480200664019902568187683340477743969899, 5600077388578735042597674074656979994549617482972881863164687525745536334190390401329680675467385619222535929475803379568900871335069384301033734714233, 14950370510302209746655108744292059719774565235701177358607157704462080787582712898381047410531181256769171281519411806803555715962755361346294970645323, 62016127245313515166454506817734613861723408949410899879216139989641932810248154680978274902855232651990299832297039642288310178403863342787840550299197, 95333439043968773649754476810195845118762991943266271403726184079242047672417932848967803488781971181275041399864016152589549446967782464066482170680045, 17892190659451591126424119305367671928739240611597727166543577571172322192576331228580357825811249660239169745390013910560069896203797045063231158722853, 47343585379646662714119978325645155712476914243757156114505021559030784519828048323795389199684946739451189942398561417829509539613791387644014640880892, 107633502313698058424938275622569640009485699854002361851653372416279664993830018051561865544743074946977906999458321566411251984151075748983779536801656, 101301834848265959280691115298109056299094420476120335636075492785328213139655230146061664228486248771534280699591814762729915638378841230330876525933001, 100833383873897711880618620396289395792480753105857884143070890861779172346713570088651208648247678032376842604846315923312830531728252064463150986767877, 110832079086180425600051267498601847526388754584982689270788472799404147017261513262539159424820032777910677631796771424828022748042489660903717952947232]
qc=[2447835208216480089797117166098772864739983439147154550843410133502162338263, 90343453249141616309012786446354427397838634661038147051928857871447909510509540184081882802706067411363905232391, 3334350089247517867244794106926436317086273858623518082485947115508154733111001565093191192674670220618972600184165291699923904558749567306156634412295, 10773127238350735566139610265473489634284355749344684347913928639165091011956627111779426812064973544315989779523475733083567151499479793829671206141097, 106073688178033729190829682109679728245170052489478284990130508152039157863313154674078420619615011691032124222115566415769268517103742200043347846746310, 96864656966701608190452551924897023075560536848477610188768188296307194880004203630087264191421619540332532988322143583373922117130397679868254621842062, 90007570555125944092169218313738703993888121021783637142913909308099775085919518984873236408360228986382651525244328621860786089655176559888337945973265, 107604402646950221603694740182904829452610405361494187112972298194020162739490546852179057650360974702490340526819923399009740841491688354483369514169504, 106563280130150122326814032245025170948640642468357539265829858841580809022713867834571254297385660279367044782111285768058114284965175416454533853149098, 34006794372719255946701440846013876868985083446980545795344603308580913114300387951211231095472417358606631528579058832071833342645392417576288348171281, 80528690688989385531407273709213599547356208780618772147048236656262530606555256335153687882045380456243914208416285214393577589279953053395148801048043, 25252035922809872666372710839612084651799975462368368568421254228924839144802392424596779526739759011515745889793921767279843129898429087648706961214380, 15441075054379206603678761656461990005728026633190896788589499872488783507420374230165723864117983219469482787021780166107230849440690930291658692943884, 15730255840343160294128109470006774677678596243801516284827627241776907423825237162176372972699529694206547624329200148008905292241372763696643556851248, 15929374919958330762187534489183857327423262543417435665674052288372574077203981789863180537536922526152815069819616552018951188431418135256962942313150, 16820416513541190327907989962230541088691747266081952862738221010557935254064045592670849585275377539144509827653431170474288972399346359112627171936199, 62613123636486933874885881624168137103745407796444871779926315982802027799075166745074790838012194635812853433064138182942124531618582978708688026203712, 103390317097626211538390057925702534478424865400956004756449501914108837524902468766472576617059468680745338232757547345497585919880616072977553233278603, 106855090961917607608766903030826427305834559006355051082927925151921938627824191628649167300491312597092422279212561689251186535550087727802277317012637, 78550566353218314794723213322674271780550941969941432645092204751089489784529040122660556916516795686398814802277195824477145440164288404226182667432413, 27234374989834250512863591479223580820709377656219659243546791666422683600672138485672126972130292224970890443705416445427654052263167668188984214509496, 89073500384217027637576686609574923520864474465437796981228200517382920934009159891695058762467754821583073917774195612915842601271956467375250874741115, 81523221328096138331223676561475793372150203835133425580501094268867250067873677785078977441798107146380161414152017043957710432372886446496269471249870, 69426635873092086451473939772373894337793035157602866886753621226137855012060402481656332348663588598120734258884064385818693263157949512108768237653037, 27038496127031393485308453098136903958592822859537990682349040311778748501331008447014951690343425476063063582655448477055880499291781315998134395062551, 86563190395140161836966058609094941013946825669471943800850341447296711952143605563471041765702929391516506170236643633037511742900440430412347138373811, 92654519757605791295431607106260304699360787251056766515059747102627521170620749248095214607497002308663852187075958446074495640666063038994344066529674, 47978472743885278893083282341878167737725647616340703972452890584651298269018115725710882998002541867355534242320731285507237225498136712897684035221694, 33937234952409141712999986890445630797610786424992916483378338039398873916932446399890479122582956874435985731634172335771866950539140459057793782237502,53536716653947884337358943672946218345105772801556349741322007215929226375220858833185514799016429985979192211191664179249403984470298515297769983151764, 15571885519410418984279068975979417469158262995629377377010899727496518373589643663028156863791907436837054446354508286361951842342722672331011023846114, 8566869430523038374329005968331909880668039196226700509945801110864252361948997146164771896223981284735805514278445995598366675322977971551419425480644, 87201260842977762054169640055047984836895338107976452298751798557901196013452620843946503586203236027871183035720513488012632267170999498276073312805571, 93478630791498129840635935563160804999341438068212212075961484875554801063436616116564312106399142481823172612186464441144737797880760682581757444561694, 49399628737188601660367894914908547591976252279392032109588827791264737386179351022649986152248431169393115396754709411287013944596327999564120047443685, 401770084546389936795883960043586247087806968600408302529922285961914019164988332998528995717095956973083747814499516267750284263835592854038001543364, 46910295459783203906544465622227903475837618852453968036856768892034422511892075866806031498301570602549864578109096480551648362399275135770250479266764, 48705341969973174964195737555908215932127208480896065769947732952516004887948769345944422825151845846335939723147282687407339303320406462649862333812892]
ec=[6763996718934951285742307562806923397006813, 12234833447991510153841494781985313133191586854789667980564533023, 22130576894138701986742918639431233979778270965194566122306861346111716828577556403873, 767648503612570945278792619619046535101078814202096337589566648572901378566441587067065, 1534503080514914991237881845264698854398689474324594013087679222396116209460382272347120, 2150152040945137216175051477345156832872965887696888090617763887196376039836211151684155, 1519134084444926105081859598135660300537196230332783741163873836023160842189452416751204, 1347961026269871555909121507968616952100851882185690586872363417766328195659354367286160, 442978203022900661788725058674237344919172289937224290573991574448751808619506704123728, 434277065671750016380827889451816552550232352950909430034013985469154609260218730764780, 979776898630843046146074197140740184861751729514455753655622904091278621814340310325052, 873700620112565719323179396419879070723310944684570011051348198205453537590517739575294, 1256514485942478003559638390025523283241250878990443282316967845337571713994674756627249, 2201413023234946734277012190477530998161056783942361564091571454780425152722167887757333, 15845440233510397242131879469914499447138153273633842521183302623397377025857347058355, 719557135712047144341175773587928323041035301800224566640992208827132114843710118060603, 1872194680805780497350808471632655890088399919927439303351392835028632946050942049128363, 739802156645251387441611149162232326760167809822024988834688224156162966157182526727210, 1842345264759627182982545223023325564813297247358347573262929227611626782102112032498792, 1942056684591589139535850561429570147021382203103121319949566652649463471174580278445972, 1897401671012077468168242201956275317342401618250346254943410859299471001683176665446266, 1299697210304599531296837763293611409445703982993464696432211710136915756408352763838420, 6339661487999740913576932261380541287960678716377148820725064627689077214923145744267, 206550580254594047163709231196572177167911612047377521986355302588778287613331054094422, 2095017194382050543451996020322766986862239168048229828922060511851698524762340797229358, 38154091093834482476428418031816301638508654861013053691521551593888386192530215738249, 2312527000380201589293545236295238368648424299462645212556813668113451665892155924195549, 1148055457422644367319939159612923263814575289811148258779972071041630980150900639103033, 2491032359438353539795070569649180009224077260857699946936305612971624383446047213147218, 2502865604540348808929226301472051722005592649019284150593000357524824393775392671519130, 1039938101331801857780518763744667966269026413223284682004343257200589049680488254035897, 316947919834210211954441725158411391798247265696200080865972078867990121934703299224598, 1191200775168680784071665067183230700343262160056248368421562785231813797955113569864397, 517875043776615303660143356495634794257910735766828738806709874383193521216795724710570, 177783588672600341630231835251624651899982858825356048074013206591129692021093027549523, 1181655045918151017173609506041984644632154476633196738728202200703641104893529622554198, 1943728872455114467893276648701066972260927692980375525686315254866764954534482612584812, 841323196734187035327534237852681191366390226431490238525430672327199713070166890155539]
c=1499341850116033218583322015832654376326982200720069022052964940686970117688218295301399005244875933100636608594036976589026918517646244220826168516373612155557984806411945784862108964553911520434368098212111129654894447128360717210621466898152738161667124194644244479881039031313468828783882375812512993823
def decry(l):
    x=(l[1]-l[2])//(l[0]-l[1])
    y=l[1]-x*l[0]
    deta1=x*l[2]+y-l[3]
    deta2=x*l[3]+y-l[4]
    s=gmpy2.gcd(deta1,deta2)
    if(sympy.isprime(s)):
        return s
p=decry(pc)
q=decry(qc)
e=decry(ec)
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,p*q)
print(m)
print(long_to_bytes(m))
#flag{S0_3a5y_LC9_w17H_r5a_8y_lAZzar0}

eccsimiscce

初探ecc。Be patient!

@⎝Lazzaro⎠师傅供题

Unlock Hint for 0 points

注意看一下题目名字

查看代码
 from Crypto.Util.number import getPrime, bytes_to_long, long_to_bytes
from random import getrandbits
from secret import flag

def gen(n):
	g = []
	while len(g) < 2:
		r = getrandbits(128)
		if r < n:
			g += [r]
	return g[0], g[1]

pt = b'\x00' * 6 + long_to_bytes(int(flag,2))
assert len(pt) % 8 == 0

o = open('output','w')

n = getPrime(64) * getPrime(64)
o.write(str(n) + '\n')
a, b = gen(n)

p = []
E = EllipticCurve(IntegerModRing(n), [a, b^2])
P = E((0, b))
p += [P.xy()]
for k in range(len(pt) // 8):
	Q = bytes_to_long(pt[8 * k : 8 * k + 8]) * P
	p += [Q.xy()]
	P = Q	
o.write(str(p))
201492777506371326551006292162895653617
[(0, 154553451869009922605508373989284771822), (88616290719340836648857804296244968700, 22603596038037813828025847642456635051), (93049590652914002916072013246419392372, 137199196724328872030657157326044759116), (90504554645872969284842245684193590955, 41085539112859386953867623315532884248), (201470498611975659190005854763400515404, 64191581174422289236912066954245567085), (95353516874755887887702372525108884476, 7737354438632049985162662207414784698), (46558095374707668218128218417661442327, 50395055339637218037739313006852673881), (27557642975987610870806318078344273671, 106554598618404373483063353073616842068), (67490015212769804762358707644071695931, 2829547492220721396081219933869634011), (134833651759761101911038211140014120838, 140214987038715243857923351244445627159), (144729647989077321365412311727592405212, 171877873650580107879446967491884124521), (91011912896324051058410934647113540420, 11948495195231170051728364853524225317), (181108298338223034531948203063235422079, 19177436837706094245148356894606465354), (107582843727047795304305796220682849149, 159169058629919803898141586730030184366), (170175582267331010638388394323069288277, 171649574866570736973399293285781600181), (122410602084524728816454663819716762608, 108776844316597519725339786491824948719), (42394494259609533111956239880946272217, 108268813408748289408423779637060355010), (79639036417974291078392459766187624198, 79217719478877440880824313283551313870), (7127911591285230873983540547881893524, 152863993182703065557955462839510468389), (22739508784616070830272453332618348770, 38750200609084354038482850711935585278), (20523317532764826749994535487335357948, 116783409934667792621711285171652650345), (199137093720319834859140498155101050647, 115690563187505212455496797673334694588), (134331279168171723803955002303470444124, 106077647498541211477185980193153170493), (93731917077281317737604069940912376440, 180551371734798861648595897382742769808), (104782114770154946122472078700489919915, 198177652463807773812760014995768778442), (104037515302310538127785109924298041022, 192704143958540796693586228780059424784), (148672031731087121767548750787945751205, 175643499719872591538177362259418737024), (84419739958947530748258067321477753819, 55399721491814500284881022849716793482), (80504818528115483875804372106921690219, 89908440116955236739010431118040540130), (74158943256476863268747294312337779943, 190802181121824943213451650987549187860), (190621980002558170913455675797953654497, 104932843467686605324894358455990416830), (5699538716613196660456029077887305260, 71629942215221870637383372114551071661), (29503013197027907443038868705874490719, 50490371177421515474092161086547459567), (164162782383643433266078732698701000083, 40720673898961024217013930650237646435), (195087346552236750119573215730620855017, 3406969574444811941320954764057634809), (108897534000036208749439175992905654236, 115939952395029844444330026351851526250), (43927951012518300690531185183619840466, 112825638270591097607885623851528142214), (179366512609702248788986148977289825715, 114138582680892287375942034021196915431), (153888319592336573028607735849321554163, 86390317487977015428284572180296071603), (80434001439737566246288717921395384186, 4397811545049664045600054100063749922), (195873371048126153114909185978284094416, 193115660461365988302714066623285460283), (101453164554709833581057486270411897055, 151407831292032357811520115405330292416), (192004312844337675849192431750177465488, 26395275144826308993595023456029909771), (129066953017524406256471393011469177416, 99905468937250509014679946748899662385), (174806522273205069001672122171347503204, 65693113224530406309438969477050383538), (41286029180329754467362444775709892398, 69873018394408832038392897488884621181), (7670085371324250366584832604465846892, 197069929622631176279051436405705547830), (126919497812056279838057955573065861266, 149184789807194982158177314362940283014), (130030009513930706324136737792272068151, 184840463898859155265783000769472089625), (70952356619919961627037289003454430428, 38255524116826487819862786433958374460), (108084672953398381871661027992419434823, 111933410313391701524593492671665694957), (114556891194916386079568805592793221178, 90297854846298205088062333787133361607), (139241299794900746304492644681663095380, 8180434712026637995449044367473702221), (31644151458859014877295959675357311119, 108115085829236664465173791413986267367), (48767855737550247238690527430241726418, 80250274128252237603954568198594470045), (82687674076328630391090172209645390931, 103197466494156217429167953743122217442), (78572787975726146231078515956340762646, 54326812616658377987015790865876069988), (14919212303940645432179701806684509830, 102872879782789532080737892364648960453), (95076476409084340316985821195452817845, 6903511898043894010494659244439531179), (174807559558846502422827477723903123284, 182841618497710641745197682101360047028), (44231934333544628104340745611297812607, 174945840425753984305452240165675801771), (9951128760949146035126158466953039768, 33562905834212426945174240030617584800), (29524726788195282290801407961954905441, 158046644143719281002918986608075717767), (46893397677223300407229545065911859689, 113013442040204568591637008454479706992), (162822802720646705029249983810089931901, 70148068132718844202943838057902579858), (127064482401082045686365374210021838751, 123210783307248676952193798242706259621), (77420618754056698566745619803186222045, 90027007554720468740470347230227220250), (198689835601349165745502216377274031485, 76767655887489532543505018040395276597), (141610762571929665234361729931911846665, 53800755018944335245873535528655779802), (87887400352955556085798426121748798354, 162583073338079168960246278303270848372), (197680197415718131637623743858520833634, 146298527441441290109842764489335989295), (175787346983005685864203524866753215399, 65123792190788752166131812162179922442), (159145345651780263379077298114094958342, 42490164043651736092924067069103851242), (139604896451159283162025524733789967189, 12767135150054003710884126744879826915), (127476453454903602511065420954553044585, 169379768151138459109089773304827140999), (147931281339194176559023214761506171361, 41407421858860894820152301418345788328), (192781153148228018841190652762534623715, 176197010428617268551337355585956489349), (87609546078597545172013127836259395574, 86396892207906751645393926649419265541), (190585950633164774806236438678773817934, 21938437652934465995189873186588424645), (121892450723254202386553180385991724184, 166315065425831856327580664596730353732), (116331659807380220433206641989381008946, 160418208095507197503972176121584951806), (118907681308148253998267072609547064940, 59989483191045358060306039528712725357), (143604650726573391152569841485152844274, 108479789957755412054265202802324530664), (182321556869145745847151748823688085411, 1026613215229969660470626771740718444), (127136396146210758115860272983530246579, 159425711525611388902406096136295280423), (154546226978012502277247849751786128353, 15199525186240553451394948345343015511), (156544878685811211974048645073214724152, 930293477819154269667563027525667945), (145393404075151622902314952141377351583, 156602927420058733260260205927394878025), (186417680433255370521769726763523441610, 134493104496513688265847195751048372088), (94821642506999513521325661536417984952, 72925604723868600257924707976146942608), (155652401152788435579545641570162505922, 173603556418261860879870988409694262322), (84924836309149469467322272707610763869, 38427241973055807547031153356855912340), (158177078542082297881618564481055653633, 98252786453896032026184278709975334126), (94197491293370829471888006901269128854, 189211892464926005387971260744419861335), (30311222434723611910342181570536115640, 127023641533809249771802466485272704138), (69128190453441173314760475001999323986, 163422811574062054157076714179532148392), (197985604378089794789966974793345411725, 129470210936013694634458337797089556864), (147921964487625283571170872232198391285, 134410619047945925303657322133078961572), (99379138414936137567839695501373101066, 87016295087973278950030523986228301173), (7293218977202930082241179577272425659, 104615574545072612186772554122312193065), (29904044300517741188828007304685227906, 13004645044794399955459218631370954456), (189330558144212998891667863863710024906, 95792601388006528397423152595026095273), (84387192498524097038420695207208454745, 44942406022779552167824640447356409593), (110266410837970607969596740850133659287, 170321590028946154759757277580333304027), (177875733872086641843910873412549290544, 17569498495780840944104593288708294490), (79118118676315289003410655824542888120, 83158892511860792477691506873408753805), (2231236589084688707827697906143427356, 165453368318489889455478588218266197527), (49083707511243467521970416640852950673, 182165447285507242561199724809200789179), (82646397386687556579500592012542879997, 19605612523517342059710858327243337846), (137251604434056721968993179863462021431, 164935894994664622307544503549089219708), (93673177200583118315846920817392811990, 112392265520273645653616195347605632512), (86048090813756748401256103167640525646, 5984502821804898749774024400181893584), (195039047853381722164226392552505956045, 159130967448730973660285029269040450427), (166358245884026640657136401784383633008, 165676673553581584233610334650108924661), (61503129240347357409665742222367715944, 199061075817424435878262192490670263733), (74762109832831622638998818211121189799, 135805713144264142787568492392732701755), (161915035337762161113235578251057570274, 22254742775679109208189412116860956304), (140220556333734722024681487946409258803, 69801985366904114784318481136945075464), (24027839753135415648991774038204144222, 52234839790793943313528794873357344341), (62715873254762922128546267031054706497, 3291964195975962060291515307650608934), (14065156429865187920150481361672461403, 108500009404125374052818070666547472463), (77695972806821012955930396994523349201, 7235683574801402291160641852564059645), (143394412072781630636990718293539651999, 150741148679006235753368334631121526650), (170327318045511092474722703448766408360, 73408345135196826148075328465604245615), (99570304909982109914375676919840420240, 65213449023322115529779451944973608422), (82876103629132053298984840343260824418, 5410111819153023355606462263367660433), (26489882102118234923183284738986488085, 129911893426972190031856399189412428997), (79789966891162970480693537197273737254, 119252873522450512665372704772936378299), (151076975899032636591119666503700993951, 22584944098045880435446184215930255551), (95024037086073534531004905664299106073, 166451641272957109804521706827021349933), (102039375202326330019305974698076759610, 45496869200401901890478046135545272651), (105582341463503554500269575907887765214, 116951232055783186675800186295339431107), (86539666847544195449592336355564881232, 79559447843643922001283339799335180170), (177746529554017081437988014530858133304, 172413675871220969619284029936688982920), (169300625126273322720066847488964691712, 59822142603762939971377584549383026711), (2334879335596641742919161619949629360, 101261414074163702977011156280222632504), (89106826017451302062832545153227914180, 30368834919392795847751059263931210618), (44834241475091531542506664173835073156, 105012687120544168098519237887413129514), (114649104171599851358437467809373347428, 111803694008496059100514049575741596437), (45258929194759417291086466672299894344, 118563597827110731732855948887896156983), (85838482398529241992227052670313471049, 41322260966196982258593020079375943099), (62095100078711778642733412188421628453, 131655731200090425585530765140302663326), (36971453437015169807492702137476470869, 124394222505496959647295972905913631581), (111384919725450899218810635187079188252, 109618187231976605277986062652723681845), (40787957273499839692735825803029552492, 165757971046764785826865674195548395614), (50066030898052409838616047750310309053, 189197509766856611972196819344068904447), (57463179609056913661321065977633946184, 46665047755909805222202865980900852692), (118694377311484278150812301539009177309, 134370037271908275214929231277599931823), (12468178226834968186208345332796110321, 100088430540589909284547216910104973708), (12728554091014794452698183406675946303, 188672683530838594764378072631719270596), (156305683921635616146179541242685306629, 151562716542099689109077992744491657930), (198095691806418319615399990429740096787, 114565303870756721778611691134450556801), (153055442943767746551930198148619752944, 56013434274399812181926779860740286621), (96507322094247350673705527297217660297, 93125183741496514427703149588522026818), (385837214329645591316881081462661390, 11071316354808066435439060490079474994), (52325312143355775644621929886514445755, 148984971350682233140120897819283514310), (156382026098238871514178035574779468185, 199904237973448114138071544206539280824), (111841505256857551502757544790016643851, 16966084375483691896602185882830081696), (143741430426325573559983579456534299977, 84065075673113964745572741386643520881), (87995750754630431047686548310265968687, 115323258074235587278618523772536404494), (129133864199104421442162980200400278060, 53274473901606702516183282630650033259), (43195981273792666858400611228375960932, 38496682676512311495136322843918233805), (19794208972146907997659461744970668924, 141747911979150601486600464868939986894), (160108042432206280464694535815648043597, 187410853434154817202634808902097548321), (185013698381469864736213461786255179292, 27843951296459317652778160154786246742), (77367456207501567888805548295661116542, 29743195967793931137267858137985109841), (121435135244367098937647924059218105398, 146965522975338999784636865540911488858), (183670390957174555116069624194375458059, 17852591813234185272698324630937035713), (108624092873725923584358597092020822323, 67017825311903616028882994196484935823), (52938995896384717066470533638373236620, 29724574209644737648797036577949413271), (92729931753755205628446757553192255073, 170737642768752241861740293165287828587), (74561763225660752519068056634070792515, 140077463197293140459179465985168152106), (183200287807056885556420900076244194037, 38551455335788955665608751399294149322), (14743965270321355258671955082448532303, 66072833807195380830895484562137632802), (122229357368837264586031783353667493471, 82592539990193775163070724184990065067), (159545241204360988852519155033370331372, 19620150651804517865842879728622140720), (22328883182228539747784645346203156746, 66888758960294530195906536051504544778), (82184369453659896961113215442549923898, 25506145437074763894370222188599490812), (116324177679861180696583729427319419655, 61401265155082285596612629265126779879), (1259596979951672625461622210646468052, 32203255019533818331669138782962211300), (136925479091060213987249508619871642743, 126154912533305446454086821370400971746), (129382255003617589730233777160322110570, 183157304180958486745582157843166291728), (10336967686610024926000447344807233770, 117858377612822045678586800818888216126), (41285154390712976536906649808067770858, 20481579420536031555158993522914470660), (15665672567972666594482986210438856495, 118305604012956189677773340863065258300), (49214061832579691436789077222249978158, 125254033620713270530347582668760640304), (169357910424219037829699124137522394324, 164800688687404652290423144674871060857), (17308334879877061918002100756689880654, 112167871084599920014427288268916748263), (37333749823733707426240917625012984265, 148482644365647452766125316757036572900), (107849485458400783172068496408298033917, 48947136606829902808409567810561978518), (31599922858216231772133114142967350604, 194837565749649073002358335061509500892), (155040995291966461348586345357449415763, 187061042279413920534108161221339125571), (156459530034757406913331663534424655444, 189420296212921908211580467283026633884), (137243687162288577608215370762691259102, 52117585127409283463493458755943600830), (40488287377294917427359733515896009266, 182322417627559364218049319338821196091), (65628373339598710230056653712098258467, 106974137668852592905357406269134842864), (136789479565990831265587627683352577898, 90356204281127373297307206293097827953), (13508224019724576137543529965431938079, 199448647458946857026057645649232307552), (1534353694641182724923355995797218312, 65155249151635664843802109098598971230), (155064369126528202083208711710310741763, 105818563254159707519930350029341994661), (12747615412058632203218254663227655118, 117597953316468542290832862489965335532), (136269927617854855965005313339885989252, 14548585221222446571481154694920728339), (47504042684080079683494088204864487299, 131192211853660993721710467461242868194), (72709384280241454035189387123411550519, 2317956837671210548005072077846567881), (3117051322064932157972362181704368250, 70689099550163900713710097847130981036), (48700947279669376191057826320375745035, 180002492474372107782113970511835717973), (139571130467895100018531275839874524492, 67716798007506528290184015888098189804), (61381093609484301470184780905020547490, 57314552577533280965025428757751376466), (197674001745862031889401597574782885908, 151068340007286383122796878476039147521), (166515123101927139275271446246539584980, 31327365556246022954878299212949742877), (64985825306640078269192610826332129625, 180754211802860170508632710604361360591), (111174025336210356296675273453282656652, 57386259555095187294881467689225634049)]

考点:ECDLP

EXP

#sage

n=
point=[]

x1,y1=point[0]
x2,y2=point[1]
a=(((y2^2-y1^2)-(x2^3-x1^3))%n*inverse_mod(x2-x1,n))%n
b=y1

#factor(n)
p=12117702104890171579
q=16627969210850438723

flag01=''

for i in range(1,len(point)):
	print(i-1,i)
	G=point[i-1]
	K=point[i]
	Ep=EllipticCurve(GF(p),[a,b^2])
	Eq=EllipticCurve(GF(q),[a,b^2])
	xp=discrete_log(Ep(K),Ep(G),operation='+')
	xq=discrete_log(Eq(K),Eq(G),operation='+')
	x=crt([ZZ(xp),ZZ(xq)],[ZZ(Ep(K).order()),ZZ(Eq(K).order())])
	m=bin(x)[2:].rjust(64,'0')
	print(m)
	flag01+=m
	
print(flag01)

 解出来是01字符串,数据整理一下转为二维码即可,可以说也是个小misc题,扫描即可获得flag,哎!你们猜跑了多久。下午一点多出去玩一直挂着五点多回来还在跑哈哈。。。

数据较多,时间较长耐心等待吧哎。。。01转二维码就不说了网上有脚本。

0 1
0000000000000000000000000000000000000000000000001111111111111111
1 2
1111111111110000111100001111111100001111000011111111000011110000
2 3
0000000011111111111111111111111111111111111111111111111111111111
3 4
0000111100001111111100001111000011111111000011110000000000001111
4 5
1111111111111111111111111111111111111111111111111111000011110000
5 6
1111111100001111000011111111000011110000000000001111111111111111
6 7
1111111111111111111111111111111111111111000011110000111111110000
7 8
1111000011111111000011110000000000001111111111111111111111111111
8 9
1111000000000000000000001111000011110000000011111111111100001111
9 10
1111000000000000111100001111000000000000000000001111111100000000
10 11
0000000000001111000011110000000011111111111100001111111100000000
11 12
0000111100001111000000000000000000001111111100000000000000000000
.......

大佬们帮我看看我这个Python脚本为什么运行不了啊

fROM CRYPTO.utIL.NuMBER IMPORT BYteS_TO_LoNG, long_TO_BYTES

A_Fake_FLaG = B'FLag{I_AM_the_TRUE_Flag_trUST_me}'
nuMBER = bYTEs_tO_long(a_FAKE_FLAG)

KeY1 = B'DO yOU WAnT A DAJIBEI?'
KEY1 = Bytes_to_lONG(KEY1)

KEY2 = 0XBCD2deE7E7114B5C856F8DAECeD0782BD891200B4D8264D854A13D53cF1F0c481b
iv = 10800
KEY3 = KeY2 * IV

IS_THIS_rEAL_FlAG = (NUmber + kEY3) // KEy1
print(long_tO_bytes(IS_THis_REAl_flag))
菜鸡 9:36:27
菜鸡上传了文件 新建文本文档.py

菜鸡 9:37:02
key1: Do you want a DaJiBei?

菜鸡 9:37:61
大佬们帮我看看我这个Python脚本为什么运行不了啊

感谢匿名师傅供题

Unlock Hint for 0 points

最终结果是自带flag格式的,可以据此判断结果是否正确,不必浪费时间尝试提交格式

Unlock Hint for 0 points

为什么运行结果里好好的3,也要写成大小写混乱的样子?

Unlock Hint for 0 points

如果某个方向已经找不到更多的线索,不妨回头看看来时的道路

Unlock Hint for 3 points

本题的加密方式来源于对以下问题的思考:如何在同一个载体上加密两段信息,且读取其中一种信息的过程会令另一种信息被破坏;并且,如果前一种信息的读取方式足够显而易见,是否可以在有限的短时间内尽可能转移注意力,减少非预期接收者发现另一段信息的可能性? 为了降低难度,本题在选择每一种信息的加密方式时,尽可能选择了复杂度较低的做法;同时,将其中一段信息(相信大家都已经找到这一段了)设计为另一段信息加密方式的提示。

Unlock Hint for 3 points

hint.png

 

 修正脚本字母大小后,运行得到

thrEE_means_3

 猜测flag有可能是这种形式:

英文_means_数字

逐一尝试,最终试出flag

后来看大佬WP发现将代码全文大小写分别转换为.-后解密得flag。妙啊!!!

单表加密

感谢@不要署名师傅供题

替换式密码,又名取代加密法,是密码学中按规律将文字加密的一种方式。替换式密码仅对明文中字符组成的单元进行替换,但密文中单元的位置没有改变。如果每一个字符为一单元进行加密操作,就称之为“简易替换密码”或“单表加密”。一种单表加密的做法是事先约定一份文本作为密码本,并根据文本内容和特征对明文进行替换加密。由于密码本仅提供给非常重要的人士,在一定程度上增加了密码的安全性。据称,在我国古代,苏州一带的当铺曾经大量使用此类密码。注意:古代苏州当铺的伙计不认识拉丁字母、阿拉伯数字和标点符号,所以当时的密码本仅使用汉字

Unlock Hint for 0 points

1、做题时不要老是上外部网站。

Unlock Hint for 0 points

2、密码本可能会在2月10日进行一次较大的更新。

Unlock Hint for 0 points

3、想一想,那个把数字加密成汉字的替换密码的实质是什么?

Unlock Hint for 2 points

密码本:请点击页面最上方的VIP

 考点:苏州码子+ctfshow vip页密码本+当铺密码。

第一步,将word中苏州码子替换为数字。

第二步,到https://vip.ctf.show/,将上一步每行数字按照`模块数+行数+第几个字`方式取出对应的字。

第三步,数每个汉字有多少笔画出头,就是转化成16进制的数字几。

最后得到的16进制串转字符串即为flag。

 EXP

dic={'11':'什么是会员','12':'平台自开通以来凭借着众多优秀的原创题目与活跃和谐的社区环境受到了广大的一致好评但是近几','21':'会员有什么特权','22':'会员目前针对平台入门系列题目开通会员后可以解锁全部道题目同时由平台技术','41':'题目有哪些内容','42':'入门系列题目采用循序渐进的方式逐步开放题栈如下','61':'会员开通价格','62':'平台题目绝大部分都是原创题目出题师傅们付出了辛勤的劳动考虑到学习的大部分还是以学生为主','71':'会员价格元还是感觉贵了怎么办','72':'这个确实还是个问题所以笔者建议经济实力不够的同学可以联系两三个好友合买一个号目前支付宝支持分期和花呗','81':'如何支付开通会员'}

x=[613,613,613,225,613,2231,613,6239,6239,7235,4223,723,421,4223,613,6224,813,2222,4223,225,421,2231,813,2222,4223,4223,813,813,813,2222,4223,6239,6239,813,421,1219,813,2222,4223,6239,613,2231,4223,2222,6239,7249]

word=''

for k in x:
	s=str(k)
	key=s[:2]
	index=int(s[2:])
	print(index)
	word+=dic[key][index-1]
	
print(word)
#开开开针开由开以以买下确入下开勤支解下针入由支解下下支支支解下以以支入目支解下以开由下解以花
#666c61677b48346e5f4c315f44555f4775305f47614f7d

RealSimpleAlgorithm

from Crypto.Util.number import *
from secret import flag

def findPrime(k):
	return k if isPrime(k) else findPrime(k+1)
	
p = getPrime(256)
q = findPrime(20210123 * p * p)
r = findPrime(p * q * q)
s = findPrime(p * q * r)
n = p * q * r * s
e = 0x10001
m = bytes_to_long(flag)

w = open('output','wb')
w.write(long_to_bytes(n))
w.write(b'\n\n')
w.write(long_to_bytes(pow(m, e, n)))

EXP

需要先把output里n c转化一下

from gmpy2 import *
from libnum import *
from Crypto.Util.number import *
def findPrime(k):
	return k if isPrime(k) else findPrime(k+1)
n = s2n(b'\x14r\xa6\xc3\xc1\xd1\xcd\xbf\xe7m8Q\x19*\xb5\x8f~\xd9\x08iD\xc6W\xca)_4\xd8tR\xd0_\xfd\xfb\xcb\xb1\x9cRc\xff\x18\x93\x8b\x1f\xe3\x07\xfe\xe2\xa1\x8d\xfa\xe4D\xe1qv]\xc3\x8808as\n\xac8S\xb7\xe1\x1b*\xde\xf5\x16\x02\xecv\xe2\x83*\x89g\x17\x9f\xe5\xe2U,\xb1\x94+\x17\xf0\x99\xa4%\xb9~^7_\x84\x0b\xa0\x98\xf8\xb2\xcf\x8c<\xc4\x1a\x87f\xcaZ\x8f\xbb\x1a\xb8\xddh\xd3mL\x85\x87\xb6dfv\x01G\x9aX\xa5[\xff\x1e\xea\xfc5o\x9co\xad\xd5\xa6\xae\xffg!\xee\x9c\xaa\\\xdate\xf4\xea\x1a\xe2*\xbd\xa0\x1e\xcd\xf1j;\xa8\xd0^(d1`\xeb\xa43I\xfb\x8e4P!\xa9\xcd\x86\x95\x0e\xc1l\x96\xfc\x8f*\xb5$6\x03l\xbd\xf9\xbe\x0cBm\nm4\xa6aa9?pK]Y\x01:\xfaM\xc6\x1f\xe83\x0c\xe7\xfeW\xba\xa2\xf5\x88\x18h\xb5?+\x04\xb6@\xdf\x85\x15\x8c\xe5!8-&\xc7FCfw\xba\x1d\xb2(\xe026?\xa3\x0b\x19\xf6\x9f\x1cB2\xee\x87\x02y\xc5\x95\x9a\xeb\t1E5x\x08\x0f\xafF\x96a\xe8\xa73P5*\xe4Y\\\xcaa\xfcy\xb0\x97DHm\xeb>;\xfadfu\xec\x90\xa4x\xc8\\\x87\xbf\xcdz(\x96^\x10\xd2\xe2\xc0\xd6\xe1\xb1\x9dk&\xfb\x06J\x8c\x9f\x0c%\x97 \xd4i\xbbo\x1ft\x89Q-\x11\xf8\x9e\xce\xc2\x143\x1a\xf6\x05\x11\x9cn\xc9]o\xb40\xfa\x8c\xb8\xee\xaa\xc7\xf2_\x80\x81=ry\xb5\xc3\x1d\xcd\x1f\xc1)\x0b\xe8/[\xc3\x19\xb1\x1b`\x15\x07\xb2\x87\xce\xe6J1\xe6\xbcC<\xd7\x99\x10:U\x92\x00d\x9eE3\xa7\xb0\x89\x180\xb6$pCWU)\x14\xb3\x11\x8c\x86V0>JQ\xf2h/\xcf\x15\xd2\x02\x0e\x9c\xab\xb3H\xf4\xe7\xd4\xd9\xe8<Pk\x05qRN\xf8-\xa9=)J\xf4\x01j\x81\xc6\x99X\xf2\x87_\xaenl\xf3\xfb\xf6P\xa3_p\xc7\xc0a\xc1\xd4e<\xc0\x8ei#Y\xeb\xb1\xa9z\xe0;I3U\x89\x84\xe9"S\x87?')
c = s2n(b'\r\xf3\xeb\xf3\x96\x9aGc\x10\xb8\xe7\x88P\xa9\x1f/\xfb\xf7;z \xc9\xca\xb3=\x9c\xee\x95vL\xd2y\x05\xafm\x18 \x7f\x1b\x8c\xfe#\x17\xc1+#\xf0\xa7\xbf\xe1\xc6\xf7\xb76L\xf7\xb0n\xf7(\xd5\xe59E\xfbp4\xe1\xa2w\xe5\xe5\xe5\xf2@%\xab\xfe@\xc8#^T\xa3\xb1w\xfb\xd9\x8bp\x0bxoR)\x9a\xc6\xe1\x9dT\xbd\xe7{\xef\xbc\xba\xa8\x0c\x8e\xbc/\xc9}\xcd\xd6\xc2\xdd\x16\xf1Qa\xed\x1a\x86\x1c)\x9e\xf0,\xf2\x11\xccD\t\x02M\x12\x85\xd6\xe1\x15"\xbd\x8b\xc4\x92\x94Y\x1d:\xc1\x17\x1c\x92\xd3>c\xc0BG\t\xac(#\x7f\\\xd6\x10Y\xdd\xf2\x06Nf\xac\x97 \xc3$\xd1\x06*\xf0\t\xcbM\xe4\x92\xa1,\xf0\x97\x86\x1e\xc2\x10gM\xe7\xf1L\x00b\xc6\xbeH|\xba\xa1o\x81\xf6\xe3\x87\xaa\xd3\xde\xbd\xafa\x81|\x8c\xb8\x91\xed\xca\x80\xf4\xf3\x91\x189\x0ciH\xdf\xcfj\x9eK\x83\x7f)d\xa8\x08\xe7F\\\xaa8\x1c\x96N\xb0\xb1\xabvP\'\xd4\xea\x02E:\xe0\xe9\x96\xc6\xdc\xd2\xd6\xce\xb7e\xcd\x8b\x1b\xc5\x9a/\xdd\x98\x94\x00\x18NC\x9e\xb2z\x9e\x0f\xffol\xc2\xf43\xbd\x1b\xea\xdf$\xc4\xe3\x96\x03_\x16a\x15\x13\xc7_g!\x11\xb2\xb9=\xe5?\x0b\xc0\xdf6!U\x06\xb2i\x94\xed0\xe8\xd8\xaf\x9f\'z\x02\xa1\x17\x8e\xdb@\xd9R\x9c&\xed\x97&\x9f\x82Y\nXS@\x976!\x19\x17c|Rv\xfc4@\xad\xed\x92U\xe2T\xed8qbn\xdf\xd8\xe06\xcf\xa0\x87;X\xe3:0\xa3Z\x98\x89\xbe\x8eJ\xd0\xd5rV\xea2\xa4\xc6\xaf\xdeBi\xd1`QR\x90W\x83\xb7Yy\xba\xaa\x08\x81\xe7|U\xde\xf5\xaeF\xb6K\x13\xa4]\xec\x931\xfb\xb0\xf4\xc5\x9e,\x8d\x138\x8c~\x03\xa9\xf2/dCw\xf6\xb7\x1d\xc9b\xdc\xc1\xde+.{PK\x17:\xa8\xd6\xcc\x9a\xee06\x00\x04\xbf\xcfXN\xb4\xcc\x03qQ/\x9e\x95\xf0\xa3\x0b\x08f\x0f\x03\x8e\xb7\xb1\xc4\x1avo\xbb\x9dGF\xb7.\t\xdd#\xf72 \xa8\x9f2b!')
#print(n)
#print(c)

p = iroot(n//(20210123**6), 16)[0]
q = findPrime(20210123 * p * p)
r = findPrime(p * q * q)
s = findPrime(p * q * r)
n = p * q * r * s
e = 0x10001
phi = (p-1)*(q-1)*(r-1)*(s-1)
d = gmpy2.invert(e, phi)
print(long_to_bytes(pow(c, d, n)))
#flag{we11_y0U_aRe_n07_AFra1d_0F_nA1VE_R5A_NOw~}

F5杯

网络是有记忆的

提示: 1.题目既提示 2.flag包括小写字母,单词,下划线。

查看代码
 IDEgOChWMyVNM1wtGVhbI1NeMCE0Vy9RHVBZHVc1UiFRHU1WJ1c0Mx1IVloyWiFMHk1aI1BY
IDEgdW5pdmVyc2FsIGRlY2xhcmF0aW9uIG9mIGh1bWFuIHJpZ2h0cyB3aGVyZWFzIHJlY29n
IDIgIC5TFFVbGEpWWhxWLyhbMlovNBxaVidRKUs5HV9RWx4vWR5LVyUdW041XiweXlEkHlZR
IDIgaW9uIG9mIHRoZSBpbmhlcmVudCBkaWduaXR5IGFuZCBvZiB0aGUgZXF1YWwgYW5kIGlu
IDMgLSpdIFMlFklSWlc2MhtRWBxfLFMdUlotXSUyMxxRWB1KVloeVzVSIVEeWV4tKVM5HlYz
IDMgZW5hYmxlIHJpZ2h0cyBvZiBhbGwgbWVtYmVycyBvZiB0aGUgaHVtYW4gZmFtaWx5IGlz
IDQgLBBeL0tRJFw2KVAuGVNbG1tNWiVbLi0RG1ZLTUtWXCUdX1EkHU5aXiNaHlYuHktXWh83
IDQgZSBmb3VuZGF0aW9uIG9mIGZyZWVkb20sIGp1c3RpY2UgYW5kIHBlYWNlIGluIHRoZSB3
IDUgLRhKVSVMWiAzGF9XM01aJl4wJBxcUVseXC4uNFotTzQdWFAyHVZKUiFRHk1WWCg0M1ks
IDUgZCx3aGVyZWFzIGRpc3JlZ2FyZCBhbmQgY29udGVtcHQgZm9yIGh1bWFuIHJpZ2h0c2Zs
IDYgOi4qM2QnUyFZYCoxYCEvNUxXNCRaPB1WXjclHUxbM0osS1okHVdRHl1eMiJeMi9KMx5f
IDYgdGloc19mbGFnX2lzX2NvdXNodWRlfSBoYXZlIHJlc3VsdGVkIGluIGJhcmJhcm91cyBh
IDcgEzZUKV8pFlJdNlscUDU0TV4mWiQcSlZaHlwvLkxcKSVRXCUeUFkeUl4uK1YuWxMeX1Fb
IDcgIHdoaWNoIGhhdmUgb3V0cmFnZWQgdGhlIGNvbnNjaWVuY2Ugb2YgbWFua2luZCwgYW5k
IDggLxJYWzMkUTUZUlgaXBtJUU0sWh1XLhxJVlZcKR1XNVIhUR1cWikuWDMeTFdeLCweWlEq
IDggZSBhZHZlbnQgb2YgYSB3b3JsZCBpbiB3aGljaCBodW1hbiBiZWluZ3Mgc2hhbGwgZW5q
IDkgLTQlWSRRLRZUWhlOTlslXSgbXFFbHl0lLFZaJh1fLlseWTJaJVsvLR5YTS9SHllaIU0e
IDkgZnJlZWRvbSBvZiBzcGVlY2ggYW5kIGJlbGllZiBhbmQgZnJlZWRvbSBmcm9tIGZlYXIg
MTAgFjNdKjUVUlozGFlYWi8cTk0vXSxeKC1aJBxcTB1LV1oeVylYKFozNB5fM09WMiFLVi8u
MTAgIHdhbnQgaGFzIGJlZW4gcHJvY2xhaW1lZCBhcyB0aGUgaGlnaGVzdCBhc3BpcmF0aW9u
MTEgFjdXJxVaUS1TL1EbTlsvMFNaEkhXJU1aITMdV0sdV0wdW0wzWi40ViFTEh1XWB1TX1Ee
MTEgIHRoZSBjb21tb24gcGVvcGxlLHdoZXJlYXMgaXQgaXMgZXNzZW50aWFsLCBpZiBtYW4g
MTIgPyIxFE9SF1hYGl4vUjBaLFMlWx1LLxxVXzZaHk1aIy9KMkxaEh1fTB1fHVJeM0seTVoz
MTIgbm90IHRvIGJlIGNvbXBlbGxlZCB0byBoYXZlIHJlY291cnNlLCBhcyBhIGxhc3QgcmVz
MTMgFw9OUxRJXlwkUy1WLi4aXVleKC4zSxxKRk1eLi45HV9RWx4vTzBNWjMzVi8uEh1KVl9L
MTMgLCB0byByZWJlbGxpb24gYWdhaW5zdCB0eXJhbm55IGFuZCBvcHByZXNzaW9uLCB0aGF0
MTQgPCgrFElVWSk0TBpOVi9KUyQbX1odTzJQNFojS1okHVw5HUpWWh5NNVNaHy9ZHlNeNxNI
MTQgbWFuIHJpZ2h0cyBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IHRoZSBydWxlIG9mIGxhdyx3
MTUgKiQxEV5JFVNOF19NTFovNFYhUx1LUB1PTS9SL0taHjRXJR1aWjZaLC9PLVouNB5QWR5Z
MTUgZWFzIGl0IGlzIGVzc2VudGlhbCB0byBwcm9tb3RlIHRoZSBkZXZlbG9wbWVudCBvZiBm
MTYgPC4qPRZOWCxfNilQLkwbX1o1NiVbLhxQXzRWLy5MElhTXic7XDQmYDMoUDdgJixeJ2Ap
MTYgbmRseSByZWxhdGlvbnMgYmV0d2VlbiBuYXRpb25zLGZsYWd7Y3RmX3Nob3dfZmxhZ19p
MTcgPDoZKFkwWzkaSFYlTVogMxtJVVsdT1ovMFMlTB1RWR1LV1oeWSxeJzs0YCVgMx80PR5K
MTcgb3RfaGVyZX0gd2hlcmVhcyB0aGUgcGVvcGxlcyBvZiB0aGUgZmxhZ3t0X2Vfc190fSB1
MTggNS0WUF8xKy9QMxlUXDZaHFYuG0pWWh1dKF4yNFoyHk1aIVkmVjItWiQdS1daKU0eWV4p
MTggZWQgbmF0aW9ucyBoYXZlIGluIHRoZSBjaGFydGVyIHJlYWZmaXJtZWQgdGhlaXIgZmFp
MTkgOCIUXTcuWV4uJFE1Xi4cVjVSIVEcTFZYKDQzERtVUxxJVVsdWldYLlY0OR5eUSQeSFBN
MTkgaW4gZnVuZGFtZW50YWwgaHVtYW4gcmlnaHRzLCBpbiB0aGUgZGlnbml0eSBhbmQgd29y
MjAgPiwWS1cnF1NLUl4tHE9aMDIvURxfLlsdVi4cSlZaHloxNV4sHU1WWCg0TB5QWR5SWi4e
MjAgb2YgdGhlIGh1bWFuIHBlcnNvbiBhbmQgaW4gdGhlIGVxdWFsIHJpZ2h0cyBvZiBtZW4g
MjEgFzJQL1stGFpRJBlUXDZbHFolS1ozLVYuWiQdS1AdTk1QLVA0Wh5ML1wpXiweT00vWDJa
MjEgIHdvbWVuIGFuZCBoYXZlIGRldGVybWluZWQgdG8gcHJvbW90ZSBzb2NpYWwgcHJvZ3Jl
MjIgLCZbGVwnNUtaMRtMNF8uWyEyWjMcUVgdUlYmWh5WLh1SXzJYJU0eWTJaJVsvUhNIV1oy
MjIgYW5kIGJldHRlciBzdGFuZGFyZHMgb2YgbGlmZSBpbiBsYXJnZXIgZnJlZWRvbSx3aGVy
MjMgFy5YLlwmMxdPSlw1WjEcVl40JRxOUlokWCVbHktXJVIzWiw2WjMeSy8dX1woViVJWhMe
MjMgIG1lbWJlciBzdGF0ZXMgaGF2ZSBwbGVkZ2VkIHRoZW1zZWx2ZXMgdG8gYWNoaWV2ZSwg
MjQgPSgjOTRVKU1hJCxfJ2EoM2EmXiolPRwbX1ERUk5bTV40KVAuHUhWS1ceS1clHkpRVjQl
MjQgbGFne3RoaXNfZmxhZ19pc19mYWtlfSAgY28tb3BlcmF0aW9uIHdpdGggdGhlIHVuaXRl
MjUgLz8vKy5NFBNMUV4YS09SUi9LVi4uHFFYHEtRVjZaMzNeLR5NWjMwWiM0HlhQMh5fUVsf
MjUgYXRpb25zLCB0aGUgcHJvbW90aW9uIG9mIHVuaXZlcnNhbCByZXNwZWN0IGZvciBhbmQg
MjYgKjsxIVBcJxlSWBtWNVJeLB1NVidXNTMdXy5bHVk1USReLVouNF4sHlkyWiVbLy1MEkhX
MjYgZXJ2YW5jZSBvZiBodW1hbiByaWdodHMgYW5kIGZ1bmRhbWVudGFsIGZyZWVkb21zLHdo
MjcgLzgXXRhfLVIsL1AaS1BaJU0zNF8uWykuWB1QWR5LVyUzWh5NVidXNDMeX1EkHlhNWiVb
MjcgYXMgYSBjb21tb24gdW5kZXJzdGFuZGluZyBvZiB0aGVzZSByaWdodHMgYW5kIGZyZWVk
MjggGSozEFhcFk9UWxtZMlohS1oyNRxXUjAvTTReLlwlHVhQMh1LV1oeWTUsUx5NWiFTKTpe
MjggIGlzIG9mIHRoZSBncmVhdGVzdCBpbXBvcnRhbmNlIGZvciB0aGUgZnVsbCByZWFsaXph
MjkgPRorWBhLVygzGExRW1smJRdTUUgQGkhUWExbWS8yWh40V1oeWCUuWjJeLB5ZLF4nO1ks
MjkgbiBvZiB0aGlzIHBsZWRnZSxub3csIHRoZXJlZm9yZSB0aGUgZ2VuZXJhbCBmbGFne2Zs
MzAgJjQfUy9LYSolTVo+HF8yM1osXS04HU9NL1wsXiktTB1LVylMHUpRVjZaMjNeLB5bJVws
MzAgaXNfbm90X2hlcmV9IGFzc2VtYmx5IHByb2NsYWltcyB0aGlzIHVuaXZlcnNhbCBkZWNs
MzEgJywtUBZTWxlVNVJeLBxNVidXNTMcXzMcXBxeUFItUC4dTEteLlshMlseUFkeXiNXKVo2
MzEgdGlvbiBvZiBodW1hbiByaWdodHMgYXMgYSBjb21tb24gc3RhbmRhcmQgb2YgYWNoaWV2
MzIgPzoaJlEzFlhRUxtOWy4wUyVMHFxRWx5eLSwdUF80Vi8uTBIcSlEcSlZbHVtRWx5LVyFL
MzIgbnQgZm9yIGFsbCBwZW9wbGVzIGFuZCBhbGwgbmF0aW9ucywgdG8gdGhlIGVuZCB0aGF0
MzMgKjsxFVJRJFQ3ViRKXi4cXy5bHVo3JU05HFFNWCFRHVBZHkxQXCklSzkSHVVbWk8pUVgf
MzMgZXJ5IGluZGl2aWR1YWwgYW5kIGV2ZXJ5IG9yZ2FuIG9mIHNvY2lldHksIGtlZXBpbmcg
MzQgJxRfJF4uXjYgNFcvURtdL1EzNF8uNFM5HVdRHVJWLlsTHU1WXiwsHU1LTVY2Wh9dOR5L
MzQgcyBkZWNsYXJhdGlvbiBjb25zdGFudGx5IGluIG1pbmQsIHNoYWxsIHN0cml2ZSBieSB0
MzUgOCIqWRhdL1sbWyQ1XSFLVi4uG0lRG01MUVIvS1oeTVoyMFojNB1YUDIeS1daM1ofMlYn
MzUgaGluZyBhbmQgZWR1Y2F0aW9uIHRvIHByb21vdGUgcmVzcGVjdCBmb3IgdGhlc2Ugcmln
MzYgGSBTWxpYMSVYWy0sMxpdUFsdXTgdTzJQWDMlTDNWNloeUiVeMzUyWjMSHVBfS1YvUV4s
MzYgIGFuZCBmcmVlZG9tcyBhbmQgYnkgcHJvZ3Jlc3NpdmUgbWVhc3VyZXMsIG5hdGlvbmFs
MzcgNBgpUzVbMS9fNilQLl8tEBlIUxpPWV5KMlodS1clVjIdSlFWNiVNM14sHl9RJB5bWSZa
MzcgZCBpbnRlcm5hdGlvbmFsLCB0byBzZWN1cmUgdGhlaXIgdW5pdmVyc2FsIGFuZCBlZmZl
MzggICEQSlxeLVgsKUtWLi4aXVFbHVBdMiUySV4vI1oSHF9QS1ceXi1QLlgeS1clHk9aL08s
MzggdmUgcmVjb2duaXRpb24gYW5kIG9ic2VydmFuY2UsIGJvdGggYW1vbmcgdGhlIHBlb3Bs
MzkgOyoXUiVTXSczGU5KXzUlTBtKVlosM1osNlozHV8uWx5eLVAuWB5LVyUeT1ovTyxaMx5Q
Mzkgb2YgbWVtYmVyIHN0YXRlcyB0aGVtc2VsdmVzIGFuZCBhbW9uZyB0aGUgcGVvcGxlcyBv
NDAgKzs0KzRRMlclTBpLUFslMhtJVVspTRxUSjJWM1spXDUpUC4QSlZaHlksXiceUVA0HlZa
NDAgZXJyaXRvcmllcyB1bmRlciB0aGVpciBqdXJpc2RpY3Rpb24udGhlIGZsYWcgbm90IGhl
NDEgPScVUisUUF9NWhxWMhtHUTVNHFhTXiYQTlNaITNaHkteK1oeVjQeXF4yJVk1LFM5HlksXic7S1clYC4lSzdQMlQfV14zH1Y0M2AtJVIvTTlgKWAtKTNMYCZeJiE9

是base64编码,先解码看看是啥玩意:

 

可以看到里面有一些假flag,这里行数都是成双出现的,一排密文对应一排明文,只有第41行没有,猜测第41行的明文为真flag
先进行异或一下

for i in range(0,len(c)-1,2) :
    print (xor(c[i],c[i+1]))

得到一堆很多包含"?@>="的字符串,先用几个最常出现的字符来猜一下明文:

for t in c[-1]:    
    tmp=''    
    for i in '?@>=':       
        if xor(t,i) in 'abcdefghijklmnopqrstuvwxyz{}_':tmp+=xor(t,i)    
print (tmp)

得到的结果并不是flag,但里面已经包含flag了,再用?@两个字符试试:

for t in c[-1]:    
    tmp=''    
    for i in '?@':       
        if xor(t,i) in 'abcdefghijklmnopqrstuvwxyz{}_':tmp+=xor(t,i)    
print (tmp)

 得到

flag{the_network_has_its_memory_i_miss_fafa}

简单的古典密码

最豪帝王家,被子十层呀,掀开数兔兔,一二三五八

hint:请自行添加ctfshow{}包皮

pY&.+8HJb0xoTy[t$`%sxv/?G2u01@uDVp4>WK[`81f/_v,xh2DlucVZ[VuuT+HHGYs/A$2@E5r<gL&E^oUj;<P7S6;smLrxG,^iD}[*s2|}UCEo*AFmS??JrB9gnk$wS#HTj;|f"XGrUPpvzm=0e6}!CIL~3nYZu5):`,&6)l1=^]aeJVmR}7X;C&gQ^OzrWmy3}7x[n%]_F,|I}[p,bqVT>&pyPONE~D[lK,wYt&fTeBmp}7?<~2R*UW~#~8~J4GS<<Kp1$BD<LZlb1V4lNb=Z43OVTy&Esg/iheWqo1j!U_srqdt.06RviV$+Yi7o:xTo?mCg>R}>gm(r]1(mq^+6N57c8vim&+#LQuhh;D/U)n^a*_,<81F*qUHlL.7bj2dk&:A:V6Z6kg;m8,TV$8]!=UqTdADoAjvp&!*TD8n7D_DaY`*0"5VZB4w|~)"q.fms9=f`2T~,8KYz`/)Tv`a00F57RLTzxfiPNKH57X6jmjAA{?!,*.vpSZ<#~i>u9POnm>BFMBboS/dG=iVlP8m)O21rDCZy^%/;xo)6h#rrO9_b__)RU5^/ME;Qa,=Gbr_RC0tbh8}>3^2avGWst,FFMSh/jw,r9xniD}}0+CM)W[1Bciqo`hp;4W1om9Vma:jl/yH19Bq6KBbeQa~qoa{{mG6^c9@uC5o:U?.04AY*0.laZm.LJr(*%V0vE*SEqJi/w`;Z9Es{EOGI;!_3+pEKQCByYn)K+)*<n@rh=Ae<EO;zcV2/ovd``F,I{jOLaGokR.oEz9y!v]5B4moTz9Z#yWwnhA[GR2Dq0z$Sz0wH]LSK|4:p/^0O+TG<nv*E5X(Ry26E}G/&,7Eo+i3SA[O+E$ljmyxKqP!/#pXL7X:+rP%dCxTV:!Eaj#LSz+AH`1,V;3m0>8"LF]5BENJo@:5#>k0_AOVEu:.S~a|pxW$=+NAm$71,=!"SES"=V8NE~A#/m&60q4<#aBpDKSFU2eRTyT2E5QxrbD4jn>eaK3a/@wwy3o%2"ov*1lB)i7oDqVI0]7m@XG3*"Ztc"u]p${"!v9/N#AQD]I"ps&~J*29B]ZKC@(*m{K/T@ki4?m$J0AGWLaJpS0|}D[oqwg3SelrTqU&EP6NDo8~lt>V#B5P>g9Bma:X:Q!:E$8)1.whzii.jf6fTDl.sB]#xhVgrZ:])QWo?R[ct@oR<u9TZIG&/^h4I%+pW:y0K)5~F.vcFGBJj5_`fv9_YxwSY2V(=Outpx9,:@h^usl<,zo@u7H/s.hhz|1Z3jJ_!^$H*pwoDgd`0ImYUP5"([wbYK2i2W5egXD2|3AhB^f^iEkWgb0}>#gSy[r_m|`8afX*_:5&rb,ZkQ:TZC&t7uy^HMHH:([t;wl80**cGt%3SwjNZD&zAwP/FL:=0~hb*F5af{[&D*zHW.uogN8(7/ZXzhG:n$?8Y12%E#+EB%o@j?5GU@#D?txhB$<Yk|2j505Yr,A>mJYxT;m}!g4eA<h+d/!x<HfMc9UA{HRdy?]z0bvx`xTK*.wMqAQ3SAi[Ty9C)#AcFXa_,W$=5jSwo{*mbwlx0M}3b[&5jjZwqxr|jx;5`S91Nvm^G/+&ltx,`%2x&7O6w/)`W;i!Ef1Nqv]!w}IK2Bi&)H24#%.aY&)ZT(?agnHF;HQKcIsDP2xc$.03@sPMrD]X:yhmEiVXS*.7C1Yfow>mabT|:l]lI_u*r?^*hq7~kd6=t57x0]fN1bD_:SRzxp5aq/5wa.%APpiwdj"*8~J(VNnvvOcaZ][<7$xms4ny7D#>1n.6yYmqg+LO*(TgU)78@tK3DyQ#:wqx3W?AO#Cx,CP|>`?KG,j,gxLb!&Pw&_ua9tijKemiP]l2=;f,%[N%CCz/okUH*!E"!I^[*EzUmr2V{;bsV++^^DB.+4V4gl?5T#=Mi!EddIVEmfN$VZrJOlG1DDitq/Ta0i0L.yy;r#L%?m)yl/==i8ISm1T&_=5VGt7ohgFa,sVVKZpXU:jHL,LjJOU*i,DjBs.bKXy(!]U/<~NG$Z?)BUy)]+,v9YUd7Lu>[XLh2WismuE;Ac0GQKHxpd1dvi6[EHDh6dGwi_kg+&MAQ=^rbH(@[;mFBSgOPs9S6@#:[*5fz+!eW{<,Z@8_+ER(K#!8,H/C$<%W!c9gZG:&ikz"SwlD!}iRqJ:/s).;?@V=(PAweq)&;,dO{<!Vx^OXZU#qjX{X`GFK<8Q{ac)un(3v;(V*(%@lu/!nWvjl5rV~+sh]tz}Vs"aLh$V1LHwEugD<1G`ZLRCio+LUEL:(WQKiagB!7MPyx$/r<%*`JI6YJyZCn[Ss2om,p2ZB!E]]AMBWs1.*Z;%YiG,^b@)>QJ^np@Ra"zF>8oS`@wygl]R>KNZc%9=`j`INJ^W%bB[W!B9XnXYMl4L*K}6QW}8]jKC{uPp7{p543vbehbZS&32K^B#u2nHM77oJVYm/8${SGtyExnpAJ_=c)6EDla|o.aY!lqt4x6OPY*NjKVzNa5ibjv[,6rWQ^CBdpsjov:u@1,s>[kHQ5{hY[EYk#%7_7#XI#f0ZdZ[P8]:0.Zn3SBoJ/#l#B%_Ok@a,f<=AkRpg#}$.hFujSA3S3N7MB(8ti@u{wx,B0{!M#=+R9cA2%foD0t`ZXOuIjSyM`A001PFI0gr/wuD{<`:Jo7hPYg/6+hH0a}/hqO@*${>#+"bz:8pVuNZrHz0=L@ngmW4JrC{[Vt*q],LKx+<Ck%TTT}s&j/EefR0tqA$Y!P>~[CB52sq(uHN6!Ku7+~u1c&lI/z#u5XVjw.z%<%Ub4~XUW9/rAUr^r/.5L]@yFF~hB^nw2CjSy+q^F[4xw}Crm!L(:ygYArWw^zZ_XJjd#rvjSLbe,^bS8M//y>SmT;U1w5o{+u;>fo0fXoGS*WroaI/6_]{j#?L+*eF6igjUw.g)ZgoT6mpX#`mFmIg53=IivsdFlZQSnW0wl4+a81oHu@q[^H#0$v"}KDSQ~vh5JXva>.b[bDEs<?^Uz>%23A3k660yo;m$q}(6pzJLTtV}+Sy&qTVq0#d]0vY6H&*/myfsVK$sYS6y!p*}C5Xbn^>{)f#&B7y2Is2+Vh]RbkY/I|gZG2)[S3z3blCp6KCHIfp^.6.^`=1)(hy=a1iS3w>Aw?HX]CwOY0ilkf4xJs#I<LKVz@_v.txWq;X(8pR^aCx=:P}SUFY5Q}vLwHu"sUi1N>Bz{h7$DeV3+&K7pzC?89w)r>_`:QwM@QWZ?!x[H!L9Wj%cgQSW)yx9DS:~S1?%pEl?kuR%KC51,ye5#?4f!)Kwd=xmn4icO2Tb<jC0A#]Z<#d<6@8BD2NzE{|^Wx;i@JZCKcZnC{/l=/dE6cU0<KPXyUJ`:0#8u,3J.tw}u/o_,f4Ea.Ge<;gspcr.2G$wEQCPhn]NKPpztp`hFLT",c]QekYn=x]k6wS"U#Anqqu5l5+{aQZAK58SE{!{TuqY{gE,gbZLo^<hj}>=f0C&I<BTFkAZky)tNPFT]&6<AIdlU|>aaY1`}2O)x%!zqj=PbAE>}`*Au%)U2r;k:BBE.).Pq8Dy,mcvvzCX3_PxewS3Vn^<6aZ7+_77JwPoWbhjhQ5gEqZFadVorj%hlFZN?P]IvA=a+de3F]Fri(]nJ1cy,]7|l?8i+**@t`7$Sk+tbf43<i7PL|_+o%b:YP(;(}i2a%LxT|&(l$H]=v^LCOdd.5#`N87z?gj<y&V7sc/}MYpF&2Y[BJZ:ZpdXlBQ:p]g94~$+A)K1}_:$[1Zu#x*Y_}JGaKlKv@){W=(my}p22vk5gE@RZZJVCgm+L^RMz)Eo4tfZ_NDj,<p*w(vs1ACKnXFGV6phxhNj2b@.Y]b9Xhjg6$63%X)4Csxu%AV5_v*:0a^]jlnP&L;e#IUKZm6!yEo/Up,yj$64Ady,mXL2!x,c+)074r!ZKjobS2<!:9#K3a^Nw!qg]1r.bTNR2=8[82IrVnmk1RZ12FlonbGN&WnZ0b`{6L%<h2b><(=!{;v`9a<AZcrJSp<m7mUW!xD~isxj<Wipj&uX4Ci&+LC$%4nH/wKyW9y1i?A(iKj_,pTV6OlNZ<A"P7if=OU6Un&bw#cri,QD0b;b6%_NR}C2/y0Z:UEv5AS`Q{Cw!s;:kiq%FYl&x*sK2/;~7:uBBBlV9YZlPj2Wwmas1U?JOOJ>f/P`mgE9Ai&1Cln[rpkj=/J|CmH/."Irgq3<K#bt2_(A]nwI8Wl#w_)u8hr|+VEy!N>izlTsV*7d68DU5!08=W:~G}:Xn@oM#A,c4.YG(P?aP5uwu4Vm`&{74:+SmjoGxkPbq/?F$6g%@Ztmaq,+<0q=A9_6*srYYR<_7Qwm!Tn@njGymYRy7~ZgE#1mAdFio{h=["E#B)pi7it{|i2oc|?8E9H=wIHk!Vq^}/pYUO]y+~p~4LlAyhlAXr*|ATZH:uR4?c:x68Bqxjb~7l..3/Zs5f#1CuK9GmsO3^v3%nlC8Od4]tlvv&E*C}k^ParM0G:X{HZAX]$bKnbh2Dlv9wU6%6jw.PyNaZo*.JbwC6<gNlt"?t2`0waoA.#:L+m&x^.|&iY"!y<%5Go7/_=3_gg.%/+uZ7wn%;mfv7h&B$I;61IT=aL16<q:X^5PyoIrxgT5ul`uS`:?m5I3DaL@:^JHIm{)iCz[usqa/i:.3.gZQHn@+!0w`e{46q?;AdtQBxTH`#?Z&k+<PTr8%J2b/2a9&4+>jay/GIo[5OgO$2v7O%x7PkU&wH;CEE~Kiwq)r$2j_y@[V1|}.4uF`i/CK&S[&_1{5_nGx?Q_<a0/0l*UBqqPEAt|f&gvC+@CCoKRB=,e6(vXH(_pC4u@ASrh9:6B5*+i7rpyu$PM:Q@jBm.YirE:7prS[PFWGW%|JhBJs`Tt0NTmUK!|BmvuVgQM_>uRSh/k*_Hzme3}m}!.0{[avND,/.Vc]=fJG:[1QrJQHJt5%i{"G@pcZxLP:DSeJ^Na9q6PPqqb%NPw9X;7GGDsB3BE2IjYi40XDb<~xnq?I4Pbx&)5!b@Ox.Y92yjHm2Ey0mf"*]bEuXR"<Og|3~F/@9J[P%2:k(`eX*@}^emC#!0~k*vvF@(Axjn;G$L(uegdGYDP]Xyym0R?0%hvVN>i@pw3Psn|>}KG6@_JO7c+J%SYr;`w$c!XOXttPE;b4DvN5]_"j?z)<snf_G+u$6XAjJu62Bocq8qRWRlD[TLF)Gp~0R[{9|=TBdyH){/41ZL3WkT/8oJ5]o3@kr#4T>Id+fZ_lMnPdD;FSH3GhtD9VL>as#5lSsy6ZFu{cZ3_tCYC&#QMP*y^4Dq~k#ZeD2jsKQx+AWs$!2{2T.Lb.jz6r[qwjXbHFg0"+8vI8~2U8VTKAM``wwYXd5.Mz*5/A&86gaF~!{hMd|5>#Y)rvfH`+^if;_ubA%0.PZFg]El2zcY8AAS<^fF^G=kVw`vwZHicR}Inp/+V3dpPI:cUz)KWxQ:HrP*b!,8^m.x5a|jM}1l+F;vKnOqi/10C^HvXG]$4h;L;7zj9%@q4ZUG%8wx<G)W/KF#=E:jG_pDefe:+1+E}AaWSxEz4,2<Z$P|CY}+^gPY7mf3.85#U9t7^O!X)ffrH<:)2l}_Vj=GVj;sg@GY[&<[Lw5bG%ds|>EU&#k*7mIb}zC2l#wO/6BDk*WZ{f)T1.S$TC`Ri^]op`:UI0[*V3eXzyxr;LBqDm?l4T:Q6L$w_18W"/Zvh&:4KP&KJE&s!_I6PFC*]Z(wtp#Ls7KwDIxu;g2C=u;pgc%l1F&H7]Hb65`,|t75|3ubOjio|1xm0L+g7Uhv#+Vz8%><<0?/rBa3{[[t*lqT,{d*>UN2CCrK3Pi/`5ZZeDyHQBDHed=TS1|NdA]|;7YGT:h/Yr(JJTQh;7Db9|IVk_5Dm3=wl]XGi}k1}fzN~A@X=w{CCuA<Dw#*7XY%{glo~!u._0C69XorQzpC%rw:T^I69EvGNoUY1,sVj%RT^5GrSZMx!GXRx)PN;G:Uy9}cL]<r_<|Do!biXhdGC5v=6{/lo%0_}BVYfr3oKk~#[#.j@hsccuk;=i#ltl(cA[ezA,f<^<$Of&z/#PgH>/P1bxiq<1$0FARx!?]PAfLb_CF~]A?m1msPcv=5x99Us,)r#)GRg#2qz61*hmxy2Y_k)(BF]C@QkZ8bv)Z3t|r[M2)cJA)r])MnD3OKXGl+/CrC~Ani/}l?ZBD;ZLAH?r@/{2z5s&f@gLuElP(=%(p#EBJ?E[%J=P$jJya:x2}[GCvKyBFm]^X;<!m%m+yYel]1{oQwH$2#P6Nwl2csKmK$U!77BBvF,z30)8xl;72+i7ULn8`,lsXFg82H~K)FA%Zkh9m{J%PeQ,%J>U3QCf.YWG2yiP1a7JTopa9lKALTLKpxi%H::!F5w2x?Ij6pJYr2r`AK;UGDTy!X]1$j"0^?pUkD^y4C>r7iAfA6qXaPOZRdJJnszvd5WA&j+*&w^%RW"</N0CL<K_ocXvpo~h2EmU;j08<AX)!<u]wOPYI6}8wL=LrtKk1v;4>13yvrBu?oX3=ZbXB*vBYGXQt.Q8U$9E[8=w_bl%=Wgc;;wFy/GC%Yf)C/I&4!RZ5L7y[aw8^:to%?D&Wx=i^I~P6.Gtl*kY_,V[bFPQ[;(!zF,$f!"6bYFSV;Qw=f8%O>fjHp<rWPmmu:t26<BkzyXJAT?yUgI$s7>m}b}D&sIy#b>EoT/K_H6cdp!1i)i&,+8K)E(JzjJ5T[#YeTO9pq25ZoKk*#xSyvV_/mQgA3W}F1=A77jxSrGVXRH5=p*3z/nm(F`w#Qcx6gG$ni1CAsK86inatTIl)(|7kBMHSTKvVv"GIxmLHnJgRQ%bBvy9T`2j&K.)2TllLTI0jof8bZ8cd=04sS_F>|gLQET8DP{hSKFSz.TmpvaYrQtqg6T9U.E6CHkuR<H<R5DSl=QP%K]DCqT*V[)CQ2^vMJ"DDn6uv5~D7Al]Eujfg3:!;feDNOSxvwb77=|<YEQ5Rh5x$cmdXRe6TN(F07;n[uGaMlCdu{!B"RCPeG1a#j2?:{h5@4kZ#X^zYR#8OUMVf<ExNLsutSL/TTJT$j/@CAi7!TO[0KFZ=XwP}HG,"s`tph,0"Y0^OL$cor6lQY(FaPp@>z=iCSi_WE$V">sh$r3]T<:}*pGF/I[Ygu1cO;Yi<g2FUCaP3BU&=Q:{`DyFk"ME9H<gwwrcx"ZC:m;oV>@<)YW7K6RKAmd)_mjL+gm!e/>y,s^z:=16K6TGg|[[/mY:poas2@gYw|*NKBFE0:^<!@VGkL+*AZ8!*QW*WOQ$=j4PbePS#+;31h<DzDn6gu%o?S]dw)t&[NbC(X;4J<>!@o94fLtK(r^?q/#wf5!BVn=@SZiAA3l18@}!}>vh&DPmO13_nvUD+&]5vDEaLiqq,hD&qW[8dzLp?L>}4!4T47yA6p8Dl:Ky3Nkl;1xZko9G8WW*HpeD]:+5[na,S07=a6_Z<[ti.r,!}qof<Sl5}>[YLo=?i/Am[Tn16/sPULP:JSi;wE<7T%W+lb!%><BrOYMEto6LzETgYm+i]6YA%=ExseQVUl^^dhx2hy[8Fb+PWXbLH#.6QSrk@aZ5^slL3ZN2{t^O;L;"GhQrbY$j{f!6O$We7yoJqs/sc2u$v8o{+NQdwdni_5]g#Y]Bm[Ym{f20>56OHFd!;ACt57x0]f1ZvFW.9jEb3V;:U<!YRWSS>j]tsp3S:K&K`Wi|?g3u^(fWb+e6t#=+,^8q<)KSQK_!T3RGo,/mJBMlG&I@~7uH}7{HW#h2+beuy3@}B7aF"Atn~9n[6DW)ORaFz<OUc#}Y26j*tQ*rEQqj/f?Z_Vq<tj]H<S6.E<FFwVh*l6Et!P(p"`uE0Wh*8Q3HF2Uq[0[Z3$hDi^%E}zi>=f,Dn7;RjCsD[+5UM.mwQF(X:Lcr?xU>[f3T:0V)nO;G:AoT!gd*`3h^y6Ba&79QKy{)S(`=lk%xypvmo,,`DI_:ckym^x2r,8@Ku25H@BEns%(p+1T;&YS{Fk!Xh2I/9lS0Y&l7in4c+28R=wB5IFQS![9X+/an)uGwuS!80@>s{D~;j=`ZA#r3/Y<yg/wk,!)0%EG?zBndT)anBy|vES[g[Z}vw,8kq&N;BH)g*i]t&JH:T^Nb<4m.BA8JNph0z4(f(F++gk7dV=F=41m@@26^iBqE<<2T|*#hHT_8"*WL9/^:i|7?>R.gL.0H$+BQ@[%#(Cb7m6YFJd(pV<<qq75LPO/y{!vs`5yKKDo<hvhn&VI/dlUYKZ>[`8kA>1/P%p_M,Vdv=*2$O?s7(D3xy,]^*5BB"$7+}o4m!0Pr}urU#c$,+x+XS3K7SgpAU9GBEuouZ3scGgV3K7%Z~wASK>R!FpV0!vVCBHbG(i[<KaS6t*ihxY)7jPW?+qjY7gRx/m+%vW2#y@l2T9~wobC29rr9%vEYo%(7FALV.Pk=xJc0L<O9{cAQH3+wJhp7~(k[!d:XCqWf^lsBuHE9Db(L_rp7vvs2HSb8Rd)]^s`tphKDUuC7@aF2@j1=3lGWtny[Tx4f,2wqs)ZXb|Oy#qv,|jJktvAHo^tjsJc7_RFykg}WE{iPyx!f>Vf|^N!ECJXOUFQa%.,^XNWTCb#m*rB:YR:(q$lVBiZLUEC?:=#g3pE$nl,n)EX`kR8p*5f4Q2v],xW#kpZ:4Kr4?jQKku*cQWr26$77&APk>Gb)!3/y2:,ZLTji1aAEOsK&=vZEED{x[o.4>r`!{Eb%qTsP,m)fsS=}ya*6ivBOLpp,Gp(*j[{G94gyyFa2XkP!!Yb!_L~KHI[cUqm`UOfUufP69pY#A,D^QKNS!j9*4CeuB/S*{a@Y2+/5xdQE.+A,H1f4E;5L{v:S?VBk+EnUKW?OnbJdgrc|JFA8ziDKLw|u&1s47#pUv<Vw_be%9o1zEa+FPl}vja!!0mnf@Y<4#I3]mv1!(UI$Npk2ri8POwFYdWH<J1yTs0MQXz8mlsS:wY67)/Y.^tK=B<E>TTh&w!}7}p^4[sB^xvk#s7#m2ac%sn:f(Z(2qbin[GoNtq,p1`?Yb3`Y=mw8ERu0iqXX|5xL3o?JBt*?Hbr#|})Ydz97~Sf_l*#H?EfCGId:Y:sJ<KAYTD]LOetBfo{7uY[FjQBmOr>%Z0n&I+:7+&*wgut<uU[0?v]B=j9KIC;4G:9ixZAUVWH@IHr:&l+pw)uYl0>gcy5a<m%gf;bDVq{x@zc5%lZt!!<HX3;+!DCaz+o,B[<kG.;^CB<o$/L7[lvV*s6LUzK5f:hL"u6UhDuj7b^I9:^>(ps85v;+5wlr:.?d267!D)OA]o@!Xpfj6Oz6r?p9:YbB#2L2k@,$|>D.Ne2f|0uhg@G6Q`GPoJ#i=<=w"4dU"k?+!x1)G1,bySRT8A(]qx2%S3GK,`(F?glPWmwVATVrH*_$O2zn7b5D?VZ$7?94x?@h5wkMWR>GS5Gk^t/*=ByPZ8bmk,IQ:ii{u$y^[QGuOvcl.([*V3L!<vOd5lU2I5Xh~3K%MwaF/o];oo6E$#Xlb8#qlSIQ#1jv0lX!`K[m?JT2?[YKb0M.YCgu@/Itfvo)Y44<#A%KIiSjJ7hNU%r!r7lbxicnO:M$A1/gY.]o#D2TDduK77W%&5XzF8_m?:G$&lzyEL5B5SZ,Q8o$%#%T9itdSvB/rjYO3C*Idg}J`fMnhsy0QZv/OyDuh,U2>Kug`$B6][zyRsj+l4dFrVr!E[;tM5HoL7Xb8DPVUP/s`i@qHtDTf1~kznTyp]upe4a:K6!&ChWy]rWir&0@60rAX]}pQ`HWT.JJK3Z)9Z9c<l@lZ:MUm3?pfQTyQxhoy]COvSi^*[SyVSsSK&:a>1TJ7+gzm%bqBf7hRWS]T+HHYj(Uo@wK*2!Q:LPdT,yV#%lN9&c7^hTxIJ>Qza{Kq4mn*.)E5G]s^hw{i5/|pR+rS8PRcjP1Z&R](ncY:]LnLkO{kFH]}PGbolfkr>hZg8*&A6$ERY1k_>I:;Ay^h6WLK#l.ZiAY?E,&**!CiM#y4cdA.+A5W6{G;:5.5p;LBo_>i)h8K6LifA(VDP6u?#(FHbLwiu;X5i&w<K=&=:*.0C3rL>7i8a<4s^7P&J"cY=>:Tv?HuKkxDzMa|<h+Z[ABq0JO6b~[Q1>f;?[Bp7ZL[zo:3tFh[J|GIx6N}blMN.|Cj2[UZr0SY&y&!L1IENoWYwVFlV*4C8pIAsw1%Kdv!Uq%<.|p8D1WR:^vqX$sah1Ipr^WVbl*70T2@8RLJ57:*:L5:DQ3?+:y52AQ~tblJ6/wEZfn1u2V(*)6[#riovSLk?/i1?OKMSs7!g3vZ=+<Iy0u]B/(jZ]I7J><be.u~G3A{xyyK!Zo16Th5X}_|PTya?Z<+yGU?8a7ww=GGs20:3%bt#uTL..yWv].7uE$n1::c[ju)/F1l#r;m0$sVCNx(7{T}mV#qEyWRi:t=<AtU^QUt2[Y=.ncfPk1yhuY!89gaQjHUSOpj4+S4Z"5$Y7qv,^=YmlTTG8s~){CEpD;moYw)Z(=dg6CX`S03b5v_Fecfi3vJ?:n^,mYH(!|xKEBR:Nnk6oYW3=w#+TZVp:iv@mqW3_1eCcA$XZoQ:e$hY4*_KLcYJgVB!hZ2GQnW*>ANd{0s&|bc7l@[8kG>+%Pa4rJLDZ~7Pmv87?+a)?;|6vP,g+Fq8a+]^$uQZg0FknJHY]PHmv5{9BnkLdF6VDS_h8O_9@BuZzFWQ!/:dAwjY$L@ncLFVqQwvWaN#PV5QHH}LxWo7T*30:@%iaFwDXRT:Z5<&s7w,gtiaKtrtnNh1D<5LjAHJ%q|0IUTD7|@@qwGuepR?CK|$TGcLVe,l<m{70EN5[8a7~JZllkdvtTOBGq+ZJb7`(k5=CgbA$|cNVFja9m6l7va3bcnm4oxib;@:7v>ECWGn(YnVUXuoew*2vPPOPx]G$+tx;TTG<[V.*L<X+Q[[3htY}wsn.zAjUtB>vTiVIl%5YL$`dp/{_@D#W!S]GnadKn>wbbe!R%Fz[m(|$q(gR#n4h<Fvln9J>r=^?bGI!g7yzFtrhLy`x*C&g"lb`WC<mxsJlupWb/nZo!{U$77XZsEpWpk08!1T<h7qKid:;pR|wZ.oB+it!`{Q+*Qw5Aw?q6Qy.)e=s21JYXPe87iaMYEpt,+SP5sy9@:sMTOXe9dhJ6lvZ8iAlr5l6=X*NF80IOqdqPOp}kHvbGlj]NKc,G>088BZ<Hdia.`I_l<W{*_orV3=Bm>H.f+V.<WU*FQPo,IB[%(W!?8um%x!P,br_o*05sn1]#",k]Kv+"6LTej?JoFkkq:T6QMnPy3/M>(}eK$5^_)K$J;/&.`7E@XDdjjL?tCj>o:82O8U7_B6LIQ50Wc=EYPYn{JA*q9<9r5=vvOFicgxRek"rOkB++7=`>=DJGBGdgTZ55?jv)6$MBNh%8"Jn![PFtu{y6:8`NFbu8Yr@wk0kC54iCSy%fzjT1Kqw5H?hA5u]l@PUu%*rHw0}@hH5ukst@.!y$M,*w!EHS;k#p1TUWSJPO9w4Pzo5z:qcT{Y$BfHC=`<cJO0G(Fy$78cuuIr3?%DnX#/fjbEx)*3ot4atY+IbioKFE@/Q:=`x6K7+LYASEWPw>]{`9+g0^LC{42,K^l`?RDJ_75pZs(m0+BN%EU~lh(yiP7pw]=JL!$("LrxL%42,^uOyZ/=zy7IFu6Pu)d5tYur~@&DbAlU{7.!$SOba7Wm*zdsR1]S#B+8|,aLfGToU?rNMVwiXhqC3!qj(3)0p1<:e7tx9u3QR:ll*C+8{jcZ6iTq6p"uBHg&fQ.y}?o=4.jvz6KAB6qJrPknjLp1&F@pEZVFkaBSZ<1vE5K.@v9J~rt.7{TT>1u!JPGnu`{h>pZ`[V3jmk*x%D=Q:{k0*Sp%_@=syPVqevw)V3J<R*rw!S?<58TZmUcyTm;tTVkp<<dN9!_+c9)Y;UmpyvE@a%vWM,]bOJh2;y6@CISl/[Gu~oPi9pXhrBOxXO<mGpLl6saSO$t7hy8d9oV4WK%l&#|=4Kqd4G1,ahMq$YZ%=jgu]XR,{mN;,T;[2LnDPQ4jI<dp`9QusB,K{A?LTKC$i160"+{HMN}/b@MYaTo?|yvK[i,jp7,Za9H%M,vq%At;sqvvxSVn2Zio/)|o1?AaQ5tvXmtq/X+<S:dh/3_:wK5cuS:i8wR[qY@+.KoqgY_p,KYYA&:vQ^oclc$nbewg]Bl7})IC7mO40;m:&Fs*h]Hb$me=s2WE!U==$nzy.zo,R1>YRl)&e^)F2P23+i15,TeAV_sx,Syj#!)K*W0XhO=m{PE1clYO<7pPI9XnuB=0Gmi@]Cqu%.*q$fjq8.<Y4Go6*iFn}U2Lvq.a7GjKL.HHl/KnVf_umX67vAaFji!0q@gq^$,(Pkcmtmd1C:eOhEZGHiBtz%#<31gY)VSPj.*rT::ik1uw"4T!o^eFwpP1*u|TD(nfbC/semHmh6#l=BGiLLaLdD_pBfw{eARVyZnD,iToh]Sg39HTm[WL4aP1;Kuwa%gv)nCu|f#0Q1~bJWnr!*#rV}sSsq,`"45y)B~pJ],0)w*pW!b^Ay^nE=ijCtbh#1=1XAQE1dilApCg(YNCy[(rNdp0|0nbp72jEk0b6xu;Q3i)#1(H*.xr!,Y:/kQ06!!H`@;t^!sqD7yq,GX!4BtrruerkjDp(lGnV_Iu^l1<hJLhylf<j.rxH2iS*?XbrHHK=i^AkmZmv/66uFQ?5Z*xyVGmZ$|pY4G<anEbSNP1ItsgD&yD8BAHIu[q(?1bxWEDoP,m)uyVG$wOtE;U(6HIyi:RZkAY_VK6o7TZ:/LiOK>{CEr%:NJcpJ+Q_*"4NY}wlOBz+r;izx3v2TZ?|]yxCP$V*K(vz$FKH8[bEu(1Sk7Zq&pf8,Qe<A*<p>jN7%P%^]eGy!;Wl%~5HFGfDC4I9/<m{7{KO2@LViLchr%i[[>{ABvrYPpC@SU2^<<q>#Vn}7KC]LUj>}zv<Au{.KXG"13+1z{6v8F~2AiH9Gtql6DFp#V*~@Ur2<un}7db:%U;L8TL]u"lF^>6xTR)J^az.!t;d]/bfU3rS*HpT5+Qd4`5T6h!yj1aG`#L@7b5@ky{/K}C"!$l@5")81J7vBRe4|42",LvYHJ<DwjBpJ&.98xF2GJ<Lx*r%4!<_k#TkF~,V9uYu5mRr,1*RZm6hgDGp%U2Pnn5+TOJ!xYmJlZkm,%vfUmW%@gtca8:GtsY/Tj*2]UF3aKPW*?vLWC]#]Qq$7b+$.sYFlG^QC{c;/7:*iD#a6c/XASr/omPF^hv"D2c^gYzgG%nV{@{9H:12m~uuaeW?,H;97unCzvqYGIr?})Y53?8hAxx(Vb.iq}:`$QJ/8ZyS`h/OkW0NVYJjC+XTJ!0}0FT7Uu7cO,raasVq/cqq&]B,+uenP?Q}`h`/Xr.RRVs(!%P8sD[Q5vWDK}I@%Kj86":D8Q.jCBaO]03bo)@=4EijQ6BY:T05=eKL7HGovfFdr?VLaSU>#.do,.FiPpTL/HJ&29/8Qby#LRQ#3HZyTxP"juD<DxWdjLL6!&:K8Yajo$q>w^/^F1s[Y/sj7OphxK$7Dyicxqp~IjU~2%vK0hrE[.YU2#LB:{g_2iK%K7oe!g/_>UgQ$vbehpDdA):u@3bME}dy*lIbYztf=LF)FF3{Lmw>!~SqhPFE5,L:LqD9A$PZ^^TrHnS1Q8qQg3Lo7U{/!Z.T]rc>1<kB!BFsBZ6*Z7pwlhVd6O0kBSxMByZmdY:UKIUy$f*.nYnjSCP{<?v]Bb"4q"Ua<+*!Kei@q3=G:r#Zl^P?u3fC/+8GK[8"s9wAHPYKP866E67Q6r,6ca`[;rvrpx$0<"Z`uQlrtjq[DP8|,=QhGmgIra40uSC<[)nkH(|vm>3LLE2Ni7v"cGxE.V8D*WGV!/Q&D12]pNpV5tl;@>mXz&r!<eLWgp!54?OVs]|QW9_&6lS?8y*Lo$lqrm5th0S#70wfzGP6lph$a(CTS5.*r+S42r>mOXDUiTzfmsp.L,uf5n4W!C,HA%osnD[2{Z1G!ukbY%oNn$%iEU0)N@v{auGb>7gI)p#)gIj:Lhxe1gxFLkV#4fibzhP4P0loYuV(NHwcerlYr>fNF,634=KSr9`):s&!qRljyNK?AtuSQUw8Oy3xr~Q6IlJ20bL=*fEbjfR8qfuY=6=aq:4r"k$$8.wdO|IU@bS3]zJmDTh:6$qjr3>ev3pkS)+(7dn1c*0`kr#_6C{zOnC]_YkY^406U#QovezbJ.2_^LT{Cf&G_6waS@L4(n*Y%_}Tz~JHEt2EkW6qEm"p5c3p!XAXn#<#S>,]{pBBSlg_I{?Rkw]N*QZ)7!*AaUg1T/ux[;R^pz]/m(rPUU3``O(}>uZjappnk::`T@1ADu*+m.S9r(8iOv$&H,65p%JJo$_hZFYzPg9tw759,[wmO=XM,zAuKQsZm(8R1@&d@)w7D^cq3B:G{uVN9#h;mh%ZkMu%NF8D*kNgabae1U?*TDB|(;Ofn$rQ,x#w)_CD)%jTZFVGrFy#vy0,=.7Wr,/nkBi|J!#:kjiim[G~lclYOcTd!t.|cD#y/S.#5m0VudmVF^?liJ<T1YA0rH8KBkl_klul;V3JeYB0o?1bU?dIg[kv7NZlGxSA0zx7pnAYZO*4uhfGrUd.:8XW?]jen_ilkQ!<aR$Cipj(Dauhjyh;DtVX2&L:t4PU/,do@+TVx9w"I4JwpW{uEC8N,F,Dzko?QjqFTQSKyPm)Yl<G30lKYw9fTe^^b%7(Wh#B194Kr?+2cbGaSB,vpL6w!j.Dz%J#Spc?Z=AdWT+}I1?eTy4=#Q$A)8PmJf5,/#:M{u2N>H@ez(!4nR5_gKTv?Y^ow+%0,:^@MQp686Sk2~N$BOLoaNnXp>q|D"$iKSm|(`T,<VLyW2NpKjH:cW=vvYO8X{$#A}p<z6.AK@65Ar&hkLBZaUq<5UO*$@8O]HH4)V2H7E:u8t?|O^uh,wmesv529wT;mzy^45>d+1J|3?w3mFBz!_TbjY+hHIZrOPyP,l=(K.KFZH._n[GUv%iyvmECSV2RxlBW]617+W+]BISX]7bwlTVccZLOlLHyxiH^(@;Ypp;R$H!O6dt>reTw4.g<%J~;7iu`A,/7?uES9Ru76Rd^"=K5u)!3j#8VTv5A!"]Hoop#/Kk*J!HX!qjWyH?5i!ib`@B((HQXzg5S338iS.!]4I[cm|!Qp%(DL579=xwRr2AokoyvFD#<cZ.2BPjU;9.DpA1bTq[!JAs23Zy&uaDUOAZzrw?}/9:UwH31oHiOEd:bq%_r5zG:j.,Oq4<{0acRbK0R)p_^bqxUqAtF5iSx^8i<yef>Tq2Wg87b@dgQeBsw=m^zJ26Wi$@yr8/[nQk=N6DD^uxpdvM&Z3a|/EpzcX[Z43<[j,L}o7U1_c$g#M6j8:Ysgks.}YKSG;#_hYyfx_me4))<kb7w^:zvfUP9%`?yW{4SL+X`zl:D^/5+9jjgjtwVmAQ5gf`gEy!8vXt;)Ln91[fG(nnKBrwU&3>&KSEKDJ*dh^I)V5nyv+0F5U.d7In?)0p;k6EiE3<iBmDV:SQK^xT[&f4FODA(<CVOw}EHFe<a,6p]<H3:(jh$5/jy+[zu?hqv`:@HlG<gyJBiA$l7(_@[BX{R*wqB#clM!|`;RKnux:L=L9Qjs*5jl8E<h.Gosa/N_R5zWDyWRqvk%(pf@=Zjl0*:L9Dti=341k6?1EK$^oIC2jlm>=;ZXO~Im?ANdOsSwhF9#@$)CNDM27WA^=p%V>@@@&xKGb2=5L5)6E.biln$ca2&b"a>kX3L8&J0}uU^y}!"D:weB#w>/6lWie{SWA;*jbrTJO.c;p[I0|$UPmIUgUqm`I0d4<19i^Hbp=kW:=#/3x"9NIlbPC,0ue,NXvcP#$VRZ;m=HX53oJm0)/X_Y)7yrQmit:wsET6!o~w4v?!LlO:/#2GQSNo2CWJ32)!}!I3Dx#gHb1a>,;[Zpo%go7g_oGE3VwJ|l136v<BLIeYY=([LJ"A!0fZxr6u*:~&3`74k!WZ5v/J]l5uI:2TeX`QDmN2>Q!i7buB<BBADHju{,YdkK|C64^7qCH#~SBp%JtB<:Vw"q0l*kNgN;h1G0*jyy/4hL7:x5P9r*g9nbh]@j`o~X&2$+G8BmHua2h)w@G6)+HLOK8?tS<flNqXf3f.oJ`?"nTilN^2^Ib.FtE2(mR.U+TT$E/YpxxdO=deWw2FC<{Aze&!aV8.rb]8jswv4wNV^pt`BbHlV**.)Er<>0Bk>acGPuMzkA*Dr/+.U:dD)+4Q,L|P<3bvPF5A=:D8Wmq`}nP.&6pB<LWjxeZ`H:^>Ag5!;kw,?u*<*rv|9lq7X)"miti]Rm@36gq&}U!*Kv27r2O:{Mf3i=YYJGKiFyfG_7dkuaFFaDtb{xMJ%o!o0gj5MVk&@wYmPg1kH7VLSF(&0h1oz2$q3sn;yTE62ZqEZssP2%3`nUy?ELREW)2LD:WUd0L.}@!Xg"]LoqC#4Vl1$gM5TJ}J%df5L.3b!{94#0&+Ym!SnW26;b(SD<~[(D[xclH`&@<U`_=j}Ju]`h|>IK&8D%w,DB_o&;0x;ZxFh!QC&q&f@LGrph1Z}s.7xy32}S<p)))2+N5K"q2`(k%*HFG5|YnA%rDaclg4UqR667m[}uLlBq@>;?{Z2Q8P9CCQS,uJr#;0o<`LIa1`O;_>TvE(p/,A"wu56lvjdh&2H;fCsxTJ8r5i])?B&NL8kG=7=0T.@E$YPncZSeq5qQvx&6I0^4"ObylJRm"5Q$=ALu`.Aty}<mj1qg_68fGBDB)uM2T8%vhE~$Rx[aCSy3i_n1T6!#mZGIogU/L^~X[B6&S/jt%)jS:pFvN8I0&6wLhfZ,3LMc"Xbov+4J|o#S#%WEq#uibCtJ02XWp,lpAX8od+UeC=3/3x#N>Rb{sP<G/<+oDrN#$E*88iez!]t2"0@u636@<@XF!S93[,E:h1!T=@hn7<l:[fHpT$v{Uh+K0f,SQ1eY$Y5NwP(x%Jj;?tOw$1vr7+GaYvtq[!KOTWeiNC<Gn=m=:<&a^8=sYBfH^]l1VKuqcA;=4hZtgmmU|y":RllKKhIv67Ds#uN5C5ioGh<AYjZ:nJXhE8t%aPZy4J3j_dD[BB"$c9.L6D=kl.T53%aiL.mCzrv1;yv*xSSDfQVs?+fQ`^Xb!7,_$vcmYa;s`/R1W!|B>jbzepr2_<KE46&&cZkA/4rtM3OgbG3=5L_bbpu=l6=;Q9$|U^.Fjac;Jt>:81*+`*;ttxr0k6Bhf!t{v,Nr^PPRxvlZo70!ckbZ5V2LP{&KbW(/iPkt"4,Lfe<aV3fi|]wdil01b]zF+0"Bw^"IQpdRIh*`^Fpr&Zpdn%$/+:BZyZH]nPdL(`q</<{@Y%l&[iIc|D>,uq%hJ$./PkjGOdkl7z0u6Ut@&L6Io5#2)[R5p&I?k6XsH,lp}2Ogr#6v_P2B[If:!1Xvm08Ae^pw&+zjxL/`TWr%G@LbCdO=vtlhCH$&WA(Fnm.L.:q$YA}$|A@u2D<,wq)Y[517L.*E4/AVy4]!.%~NMzFH]%)rq)fpY7%sOjLJVl<TU3@6,%|>(^TL{AP:u|8EITm<Vi"C;A*<|&"a16z7:LRYr?H:wxc{l9.I=Q&JySr0o&Q@x2H3j.@oRQun5#}0AU%&oinwJ8po3(,p"XB;BP;tmu[2{y7JBE6/NxIbCjT/U!_@wl;s_vRY#a4+O8Wc&F2"wSXASD:L(E`Pw,UuHL`9L{:6:A)o1TfvQ6fUw*bRtr7<#q/k%v=U<=5jlu_f.;blz[qY^}mATZw%U2+y/*19LW9w0A_/m1{5R[sYY*rP|CL}*TH5JFX1$QC7;Yjmq3@wN[Z1O.m[gnw2BQ81LL6!c4?7Ib=zvpD04!o47Xb@RL6M,]xr5Y=r7?(v}%1_+L3ui<61kzC0>XyW&[oc`1C>zo@K)2b@Gn)x(`(W"<7*Hl"`XOyZ$!FW,!2@c3l<RwOx%?7.{fjF05K7k*[zji=kg+k@YHDP$v&qbrn=X^pToH@5POjzcuOU,8z[R$Ptj.*s:i#/`<[TsB%(>[!q^i=T:iq@##1^.K0asu{,uq=5tY|g}vmoZBmn"59vC5xKfCHA(2j2dvCOd7*_JB2c8SJjFh(?,$Lu0Bbe`XdUY!Zhz3o7}iiGCxJQ{`M$81AP?A3uju6.BtnFj#yfdmyd%iwmz`(l.Ti/Fm5IUJqj?yygJTVi]N8I|4CSn/8Ss#4X/CAa3G#L!.JJNS+:FB,r%Xo:o9]Kv2",cm|c4!:Rr$a:dD~+QidFi]71]a8OFV3&CPyEIDk.PggSQC}dE[/GOd[qx#@g0C^ISZwxSm_rm&5#<4"`Wm=AF:&.S{,NvV+gPA"wHgYp9g6$P9Q]c9fnT,+<vxa@E$?+iwjoqG1ryj?#30tos7&DXlH<*5a:77)s+[Vr_/i/,b8E16sbsh!w3r]i}kZF6AN9F+ncY]fkYyvJx9P.yxLv;M3+,FYu!r+inZxZo<(yYZ2r*:lx5p4AJT#y,yE#n:q$"So4Wx$PTZf:Z0B,=5!#]UvkqqE=X:j]7b23cc}^4bIBTSYp~*BYk+K8.y>z2og@]"1:!=X;W3p"]0:3W)Q_qDplWXP.A0@HD?CBHbbJt2x@{S"4r!Im#J]%(sz/U6W3R]BnkoXEFm.?mKtBOxH.^ti%NlCpOg&Yz&zkTyWjhSRkD#!Y`s~iGIu2x,f+3hHlT~)CXyzSfo8="4cX`[XPzrH%OR7u*ZaGB*l^_aEPo=F$WU*S!4QCGbnSJ0p9ggrHGWQ7VtN8J>;3&KcX%87veze79kn$LF$8.wmjvrnxN>T<sU#EW)l7:Y<lS3!pign1#(..dn,_unP!/f:GHedgTyY`h>ks~pZU)=Tzez@ink?^%N!XlsD_7IMTATwoI$@1A*{[Ym{X7::<+!BVxibZpKlis;/5u{e&,+iw_vV5x3o9|la0yf&[)L4x;Ug@*pF8WJ#yDH7D3Vz9DvZ7K7bx!d,MR._n`z52bevN$1WlZ8DtfV4S^al5"D8^T,2C|L,<[foYC2)1zAvF@x,QIklJx2Le"[kHa2AjF5Lp02_EQBRY%!RQ(d"6qE?#PkuDkSjUp0ME$5Xrti$r7uj>zx$!H3K!]L5J<<32k+nTY%O9xRnp}fU>$z^5Q5orz68KzxsS@,6ugBMJ`QjB~17U0]wKEYj3wh.sM`,2{`S6K39_xKFtkx;.+{=*lCuH#6SY^PEp_<%*o&=N=.*rw,90f6Aw{G2EGh>tf5~;W:+OX45E~K1IE=sS*3KUKA@_|7%rVp<,j%ME=HS`#h|bK,93$uEE>X~g2LLJ?Lz2Z3Jb.098`8nJ5rIVFKI:_$70LRMdsD$2o@bldD#T@v%rF#>3m@Jvw9Y%&Olbj7gQhJA+26MSPy2HV%|QU<9J5XC!ThHouix,"yJF>YoWAj(FsBy0fLOqWXj!:*/z3rmn"<DL;XU~Zj3bgu1kXp.am%sb)BrD9a<T88e0GZe@fL>tHdb;&.jl74#7CQoDIJ_m"/9N@&gLihUFWaGR2xYU`F}$OkiA}fJQB^;pj55N9Q&x2oNXL0aa02qZh6zx<+5.XbDNC5?5;7xLHdX.Ctw$?8&oC,vyjiksJr#5VTy&j[cL<fs>1lH[$24rd6PD+rDS>!,`@8|=8n@oJ!$POgrJzTlH<70oyY#VB$3Fx3H?29rcbG/;W3`l81b&YKuEf2+Q!1qULDCx3g*rO,qQZ56EY&zjA9:LAg$/16I0$&?kX^npQs{r_dbFG5v<T^;Lj2htD<GYk#KPkx2HqSZTYrP#($4<2xCZ.Du1.<55/W3*TO0BS8xQJm?5oAfQGvdF,Syj5(_0rEE~OmsJ|4{jHfXL*FuTxw`Cr)&sX85*D(`kp[Oq!rSQfx4:lY4HbC`n=uxTf|A6e&O`MCrq)|JV{&HZ5G,=CnxL4lVq{K!O?4x*XO:r<+*WQ3WUH3I]0wbFSsG,[k+)GZjrdg(Ed)%nF7W:D5K*&6]tAE<3GaGO.0g|^O)DrxB<X3sKNBf7Kw=G>]Io$bZ`}6!QC,dG5lgoyqX|L%(_dPSy62w3]^x50$uc/@_vad2o^5ea,GJT_P)KTEe3&!@oPSrHA[|ue}cRI,zp6G7LBkFoia>0!z2YsHF*O])YIiAjl10{j8D^]+gZA)1ouq_6g8F]L.qxJS3o!bFpvZ"$873viP_:[[b#PYQ.uLHCK#X.+{,#J$6vu*fn&7+<I0Gg$B0+j*.zG%{jjJK6LD6_ZL_bL}lknJ)0{WH.PkVLQp<1hzYOPVp!2NQY`cYmU?gwTCuP!*{pXdY:<pA@o1D)3B_A}fSTKyb`xlf<w^YAw8Lsp/V[8X~g[wGuJg0m@auSm4J*oi_a~oBtEyb5z3K.wKwL,7CSXi(Tf4p..,mqh5Kq,8lFRFHqV_twNEEiV555BE|sbwAH^X6=@dOYg4(@bNopaSGTbJP1ZUMqVQ%w_Li+Hh$E"UJG/8ye1P:;)i,f=4.@:m7b.+322bUEuYwWOLNJGi7RBm~DtF?4VxTZimq3;*xJt5@FcZPY`o=Q&:?/p&,XV8)rNdyQtty)w$E*hPhmT)J>n&Lh,3y<CCFaN5B/vv|f!Ew?A*"IemkRj#@67A=:e,Azp89WYd86RFiW`Y#x<)tq3%3beXd/Oyqqf:pQWd`Z7Ga7]Z^ANjzjH5C6gY)s][.z67b+N.$@S(@wa,1b#x$2Wy#v<U:s][)F6G~l)}5ZuF"5DZ!Xi/qVch,D;%ruORHb4!C>Xy"g9B?#h+NY*oPp:wguV%L*F7OrHxE;4#HbeXRO8vXs^cV.l1/JMEMO9wKBgM?g>t3chQH<uO<DP;=L:AXaB0c4,?}%KA0^+sm!$l#!)@B#.s2N+KI2SV58/DDY[phAkG+)%nRg5`:4BusP)DBgm.Vb;Zt8<[Nw5wu]"U"a(*vFSxChlGt%2j06+:*$/d&Z(d0rw3}^)EX0?4Tm&E5S2T@kN#pE<RM^iuGgT<XpoK,Db4V.xFo`w=;[Kw6DA.ARlAwlx09+l?wlK!yObzGS]Px&X#UT^I7yft9,Cj~v,`=&N.R[%wv2)pZ<KY$E)BTO_I9)c;jlG0z6=QMzpp35e:X<0K[FHSyLbe?z?Vl#Nvc42=2LUy7u/sR1C@vS^X{ZHu<xkUecCKa900Z82nluCq%p/?w$c!n+`okMVwMcCEF1zhsYeDQ;fL2CVS0ri#(Za%"gR_%r250W`>hF?Y%=+mOe/]$P(uP*5Ae^^OOYcrE.Ir3F30^gvP0IyGyT<3:EW3z@U,FvPS:lR*jvIZ^Uen+y^<J2jxWq@8I.Z.XmQHcUA,~#O5.(rhIC@]*oQ<kYq17=XO*rngrq}ylbAH}mOjdnL!c;Xfh`PFqn,mGCRQg3Ow@u9HZ%5i5Ce)jso^HpMYW{,gKo<+EP(?8SDS9jz,tLPV*r]0<6XUHlKn]tP&[PS<+g7Xi+H.9CZ#$jxaD`36rGCB1AEpITh=npA8`:*.7b%rF.M?zT>#}+nAJJ@JbS3%uOQ$$AXmUe9/`QG`8!k2%4G.9CpN]nz#O0403&Qn9vllItXbq66%k|gmzmPmpoM8g$&8},$KWe>iVl"9;T)96&XOCGWp;:$bRL0lXr/w9CEa<:<mk)W!Z;6+^GHBXW6{_a6%xKFyFtjmH0qJ#vLWj7?,:AWj*mv>W:IFdA`i;tEP03_<;TXXP%|B~CD24>vx%bQZD)I[3b7]/S^5xTU%K7Z[by:%x0}m;De1H!LxaZ4%5s(:>@395"4qW3nfHi(F*ibqt>;b19t?YwjGS#p3IhxTI$>g{[be@P5n]!k0b76/~[Sy;u!,1ly:u2xjbC4HQ5T0a;+{uVH?V8Bz}%8Tz)6:w$/g|v7pZ]b2I$t*IW}N1K&wKas>esuUIFcT,gMdw2J<P14Y(l24LxSmPQDib2$q(8X;=ZtK0Y;Ri);N`6y*.YYL2V5+c9HZT6K6V8_Ix]&R){T5Z#n%|niBA,nUzc6@8EX?{yWZ6uAjy)gY,Zp&n6rwv5itY,dTBHB)[igadra;}>WqYEQhp[OD4,?Lo@^ZFYr6%CyYDEQp4uRZ<HV2LQRLE22oEwk6~AYJoh/Ge%0=I<PF~6y{[YGtf!+roos:#1l|T7Lpoanm):F1:Dy@qmYtU,f3/<v;g#+UA9NL}+BQS<YqlC0+G8?aCmerBwZ5GSIx1@mI1%NSg_&YTGfW07Tr_?Ijjg:6]29&GimDZ2KlLyu$1la<YClHWjOle64:ME4HoPRd8MBmWyffc;MKa$p4@UKhSdl`%+~h]geX(U!ZcypmZT(}lJ4%0r2jlG=iYpA<g{sEx^zm~Cw5ti(*lNsVE!@KHH6J=0vJB#E$X)N*/mfm[lQ(*Z;%Z]ZZCHj2+jR1>gY%$XlyFBeiKPX}ThtYB9gy{HKg=0yv>{lCLSXAhn8fP4$p~NtV9&hPgZ(u0W0?Z;bT:UUP#p?r0TKr8)KG%="6imPV9k)3Z|)SEljKAZ"MN>M?r1Z&"U_B_Cg]^s`tOY/D&0FA/y4"*i^A6PKn_Kq$1SLG`iSdq<}n|<0)=k1"IOIW}+yO?m(L/2vjsELX$41KQDsGB0Jt6Oi&@Nz]4B:Sf3;:nFe&"p9CwL@(k;@</ZkF>}=*5uT%2LeLG@1$3g,+np54{Vfv<K@52=X]Ga<1135i[Tr87yxwMd7aDnZ5(#&8>R>*TenpepfeUg&$^gf8zZ^/_3dsA6=!CbgxFHMEyQP{{Ks&UC]xhz@LL>@3D1(2dW3y@aC:FsmhWwTDVusnhZy<Vsk1V[J%/:~x&ET@+VZ5P*eHi#uLlt9uJS8sWa9X:g5QGo#<1,)g8@D2qy][?m)GAT;bXbvV,#fQFow,fr@a3;gUS;OyJp#+0:FkzlmG`+RR1ueiH0xv~5G5zvihyZ9)KnbjS{JGq7;nUL=1z/ahV;Q5;g@QBt_%%;9bcOU0q/(6dGU#RoC}jJ<1(7M7%J]/@jz#b`NBF.L.gFqGn.;^0{2T=RV.ZZ,SM>~h1*QSDZXAJc]S%ld@"EK!{N"*qc`SZW7.a@3%2y(m%Y1?yjw;!6XXv*Ox)dZ`$+b+,N0ln*bKaxz!Q3OuVN05U%%QaF<]].a+a{@E0#X6YFUj.Vm^8aG2DlXz/zL?Qp9gME1C.@?BJuFVy0jqS{h5GDsh2H&`Q=JhI6}!}LdmCz>ltlCw.KN2Z3d6)X;7ily4mqq4]1jxKC0)r<b4igHW8f(yJa<!z/J`)Y3T8Bmx~ce]lp"he):G}>`5pJ)x>0R{T[;%Krbi*r{r3>qox[&C77S[sws<Kj`0*hm0n*S90H8%:n%*{)a0I"d`:G64D9|a8X*rI`#Z!#,B`8Ez+|vmMu`J5A>L1ioc)4m=)KaSZ!:jPz&YZV*0z]c@iE3f|+*qXQ3Vf]8:>RI{)K0alm_k"fh#LT_U&*dyulToP!#v4G.=Ox*Ln)yV^,Cq?42+{*/m>XJjZtB*s5"8qk7pb:WPuJ5F>7r&!]_I4i$2z&(#~Ay&WZ0H%rqoic`v/WY9rAJJ,/.S`*i$m%_8FA5I2fP=Q:L5uV90G,6b#mpo7u^Jl2:X&jaZbrV2;KuU"!Ir3A:ro!"sZ:H#hUHu![we"fxoB>cabGH]kAhZIS0kV<DvESao{5xZwrj2~ffp`6x*?BdGJxzQ"&I@e7)=Z[BZDirjM:W6V77=^BPxgaZ:T3l;M#J]_i:GO]KV#1%*.!Sbv6{v#+prZ5lFGF;+0iZa`XXi|tvldXV)}wLpEiJq_7E:wl+gPByxI2PpqcqaEBy^&[NqMveW<*gOc7L%cZKJTpq,3_9JvFWlE9`bgMG7Hb$+_T{72q<k(j>LHbAsp:z9&@<XYPP6WF5DNS8?Hpv8Duw,)Fm!e1!zpNPFc*k[dG~4,LSyqYN5ESVCLuTgW=f=6Sc4VC(OZmRQxW[>}o"7]_cO~Ib]_O@56YYEmli@]nk7Op}*s0pX=[3OAF9f3QNb#;aDv&_.6q;G^R"y!{OS`_w.,y*X&lFfOqC2N>^y5CcV]n,[3hSCL!S+srX:bS3eTZhEC;..Nr{uLU5?!{Y!5_.,;mC:p3E`M6s5[+r+NwT23/pmp*{CG^>yMxPg:.thR5vVm"Y0p764zO8q0PstQ<vp?Rk7]mMDcf8p/^XL3Dx*ARby{!.LZtE$}31<P7/zv5=Qh)3bkSI^Y.izG5v:o2XLQZGb(]DGTxO;?!Lbb0;g>LppJs#<H5lJvYY%4QnJVv/.vt~JV3~ai^sD|ct;VKr[?Eb3M7Vr8Dqj]f9hMHKiKnaY{x+o_*>0p4e*R[%D2DulAp[T?EVWCB7qa<dp&?)Y6UJ6,yHHvfqQq`lN2Wu*jK8bv)8p1.Bp2Wkf,O5cAlAt@fE08!~NwBKu{l+VBkZbCH(1:*6C<]Ron9L581/_nnRKsm4Vq>b`"7R%:5pcm),<UwrvF5mlw,tdZsXWG,hpQFt@ckbZb5+Q8segQC6QHCCm>7jPW(;T:0<[[w.y8uWn!.yaH6:=UnMr}LHmW(8g;7or3+8p(fNSNg!)>49"c@#1|kg[_nG2UqLaA69!u^ZCeyN5xrm21vZ&[NRiOq/llm@3]udUxiH8<L3rlk{f~TsVTVsP9d5,"=G0UUkVq&"L6DZa+/R.rvb!d*VR%cC5=:uqggS(a0p*LCG%(i>}3D[k`B,goJi]zQn@AO,$K7&6QsPa!,J^.6G$2gz][HSB%i$!w0fBS2p[vr)7jP={|fG5h+[w:L*l|2Cy*Z06E]5x)X!PMqr2f`2Ty!6ONxJ%Zr5puw+6t^5K<swiYRq/8EbX{Yvk8wR`v.|tnZTT=gcmCuYV&lclYOTCD.TB)Fu8"Rq>|JS(q6QiTL>AgjYp,ZfER`cO0bJ,rjNzEaiH;+Q7_oxr8:B<Cg)5JG8B6BD]hVX$zv)5F.Sm@ntggTj=?*G$2<SmUm<D$l,<0g;0XJ_vhm5G208prTmGJ*iw`CpP4/xa##YHo![QAAL!3LHrY$xSY*nzby4aq388k{I$$//YiHx%F.k6G$jF4fnmgH_zFs;^ThS6{>ALJb_/Clcx%DUA*UN.dFTEC>v#O0>1.pzO+L7cCjPK/*R91of.REnP1oA>xN7AoGp@Mraa(1Ck%5=UDnkRGI@uMnT^hb,0.gY7PqW#To4?s)qUk73^EGy%YWgx+6`Zw{*C/s8xH:}^uY;14T6*#xU%Fsf_+qEBk&(nwY:2kp;5+@:%6/{+>HVxcs/8K+dXF;$whnE:I/(gBT#4,4e.am/MKnOqm?~.7s#D1S#76m7J5YZkB[Z[T3XiuL%xhAd1Kk^lQ9H3|6owH?dWdlj`Q2I{j8`nq!goF</b"X,#MP=z{DxW9zMYgEac?y;tva:RMptF]2@Y#y}vimx,k6mqGIrGo7hGFjF1LrrpZ1bylkar3cRTKya);Xs{4^YtLVH0o>|ZEF}#c[dt7fy3">B5@BQb.BVz4]u.6%K6b3`1;n*K;rF:s4AUuB"BpKTrIi9o.}SUP5m.R/Vm_A{jIdX`Fl+_HimpH`MX(d@g;HZ?B+lB]]1:|tlN|G):G_<Fsd[qi_|lOVsv]x6c$]CVM[jTm%UC#6EIu832^k7NL6A;3g|uNaWi~v2@Z!4|X7)EXa~SqmI6v8bi)B(xM}blD5|v56%A}P!pmJ/S)32urBlcoPiu,AtiW:w6E5WnKhWy)+_W_aGK+TcT[@|px!}VV34q40fHKB>uG2[q/{aaD5<(GC2nMa%ln@#*)2x?f83p$c1Qd#8q>1q!;^ue1cKP8sC{K3k<k6sD&XRk`}uEhElysBJIB,JQ&_[T0Sq.V8UsRV(._&(?)S]4!LMD]70,}huY,0TiX^wrSvbSK`}"(kpcoYV6T9ymQDQ2OnFKv[2Z9=yANKt8c=zcmU&BwKk*fn2PCtj;Z[*9|}>Alokl`0Rk&Ee7:|_QFbH5i;Zw3l%5M2tQIazp%iOu):i#9j~i5D1uij?0ZF:7^:^g!D#<Hr%u])uCCK}v$X~(i;K7tZ<Uw{RRjH9o{h?0hlw5+@`8GCp:h2x@XN`2qD=Kez=!q</!$qTGfE)nMJVlDsLy])RZ5/?v|c8l3oV?ZFa%o?cgoDMVG1bJ5Ni&<(z+TY9u$/[`i6$#%&4Q4Cq`rt;3"!kSC3}7%xl<P=N*+0(ZQxlk;m.cDq@7kYr1J6[[8c,7%Sl1G0@2m%),qD_7vmTr%Jg&+gzy_uVEw:98.06Tx@S9,FwgqQ"^N|/7~t6*2a0PmiHte6SC2y9imCH#pWic2KtFZ*P,IaDx0msfwwP(NSz]xyS2frU}o@60PZ:*^n*D^.T<LvT3[+Dw+yUv+3q0#ZNl37lk{cO}V;O8}6tlw"f#T%WiOLcy?r&PW^BNpA,IS9dtxunsdlR|a0)gvmFb5VWPZ3CK>1Fyu*cypY~;|<c{D#MO}B2os}&=`m{6o!O%<,|pmuAQjzY0T%c&ZKxq`7m.{K#hV3Y?YnAH4,)rF`4@F2}=CBBn`L(:%1c0O5q0tQxF,+vp@}}"R3.(db_FW9W6.L=f8:?[}u<R^:v,_Iz5Vl>,M$LTVCQn;YirQr=3m0ll!oryEG,oLPV{|*vZSZDCKHJP^k=^>u71Ky8,6o`z#SW<WE>1*8DLPF}c~Sv&B[nHw*SAkoul0m.i6)CH!gwCVF7r7U:?%?+F2NmLart,4/n7/p13#|UCyF(2EPo$K0VW2c*w0H#SJ>fsLpA4$=zhOwE=+<u9GY!#Y35QsE*cork#G0Y4G~~j5bC#UXvcC@aZEiwhFB//V>BK>6+TDDtK"D]o|S{,kqT$#++Ase]|2/1gPF!&`+k9<GbpvRgJ|DHZgHX]+Kc`X=kL_uR2j4p9YGsBO4gcdT4%XSu[Eo7/_=w>7pq7{=$BAun%ini=Eg(5v?^6Gnb:^=iL<K+TorrA/s=ltnc=>6E5R%bxKJn=@jb=Thb3!_fxtEEsH03g%*:76@cxaZ(iBQ,1^TPlRhW]@H=A.+5%N7b0~g.,1BsDO1B^3FvFh!?OsrZvIQtqT[3G6@Pn<nAV3S$_G{|Zjj;,Pqe!H:{>^5RF0+c]NJPJs/sqy$##__y6vDFg7W`o+)[EL"OE*9Y.z^kBJS$LSiA@%Ex?KzDti,R3~o*Jv$7sNQ5JPH~l6(9b_$:sQB#EBgpoc|Dv/Gm%AmNDkr03.ylbP$c*HjGv1J#+~fh#%B/v:N9p>J&;?p3v?H07?^Kuvl<rG$3v%&(4H_^n0fM/.iN1eHvy@BGH{PI/}h":30ZqJk2brGpre_CKL6{Eh6WFrY2j0;ew05!cd+oDHaG=U?UUR2v!fNVZ,_eWS11bnX}:?AdtEu0p{`75`6t*m9Mc]%42v)gEulaA?O<mnx=:(}swUZr0?^UZ3/WlPb@YP$WW,mwYq:HWKaK@?R/+o_IpyBanvJj?;%&&_7ea/4slls40s8J759.szaTjj+4{eU|8n7noixXs1.+64!`8G8,FjAm.i=~X81OhnO(E!VF:vqRp(8`5av$c,_y0Z<Q0r#V6(^/mh2n1L@2q(V^gsK&X$`I<LtZ`!8NlyZEz@iNP^mpb4W=12[9ppGlR&_I@~3eX5K)E0aLng+C:BHIxxQFGWSLsdqowA&A329HuJP2<h_LpIWa/J,@ufJ1ohch;t#R;CCbr]P:pP8Lv5At!nyCGgP|jmr}uRSj*(mmBL#)pEt*5HlLDi^6b)o8=;[5#cA{1Bhdy*)(.<wzpYE]:T]mcUvK/Q1uUQZMhJh0u)7)k^K_EiY@+gZXLbaT2B!t[g18Q[wJa_%GWN1wE<7T%WOQd7aE.R?GYN&94BA.yGpvmics:m%,#,gJuyi1:p/+u_Cq.Bm5c_<,L`aoUxFVC{LWGeieW{abhY4`g1w/y|l,<%dlJ=AZqj@6D(/El0_ZZ4Dyicx$qv,NXr)AwWGm%UC]AT#V.1=LbZA}[[Z7ot%e=+3sYsBy7$.ia>7h2_*LNwC$_!m>nE,iS_*$Si#c*yj}c8ST2|fhh$5++tR!wr%4nN(VLdXW]{xLo7|:s=k[foH/IRisp~zPmm5IUt8s<hBPqO542s7~Z>7Qn>5(X{uh>HKTL|Wz3;A,xYs;k=<Yac3]d$hGI*fS3.3])YAT.<^_ooaknE0!E+Tt0W60abr=0u28Kw5trhyWtslzSu|WO.%37ER6pvrGr%p}g1lW%~iqCuM*QuYGd!rMu`Zi#Hx8^TF[%Q,N3p1}%%gTAGa>ozLXdhhwV?RZ8^nAm*WXbmU0l]kFv(D7Ms,HvQ5yj6bJp:T80/[wd<zKPB*5ZNB##h+imW%r2b/iEwSY3}7GIYJiLL@V#T9~tQnyK>SOUS<"aW!U;oinJuY9TG*RblV$+5ZOelY"R_!M{=7q6J]PLHS4nohtp?k/NfwMc{i>r!_I0%Y)1}7^AbALns>W6OC0<)BWmT)u.5le)s5XbcNPys%V.&}(v84[_dhwFNj3oyv!K>E7jUP_vNx6lZijNH2;dy[GAV5w=m>m+PCYe76YF.<Yk7LI:S$H!|hvFer[.r//fRC_kq[Nw/oC2`tS0H66#6Lhn2aor}hhp#EPCc*)K~"Ch{oG:4lF<aY}Afc+jKCu,~nbx0YNB(8bK%D^LgQ<^/bzC<}7^5cO80r>m|DVAHSwh%E$VH:f);J/!)@Ixzrcm^iua9*T$)+qApI_+Ml&%?TQ(W]?6^o`%Es_5+YT$q!xj3Iwl^:gJggt2i^,^UEk,bUJ<I:HWL"c08Xb3UhtwEuulN?yw}Z}>=w$cI8`h>p_0IZz^,B)KgGT0a]VLt5Y;ZR3vmpjl;yU$~3HxeBVEvGaLm&q$(VO]wC5BX#*,QdvT%V=jQ7CH`u&lPgG:9!J7vB!DnPt2e+rp"XF.29uJ#J^pgqlJhH`mCh[nLiG,_`BZa%,|E[bzaB2tgJCYKZ&#V8Vm7]01Uy*5<El4lyYm}iZW!:m)05S;>mEbbdzja;#*ZXgo6Z2uk7UX]fIqY7A]XmhG;4TQez86P(o!Zw^a,ApQPd46~Xxo5.aL[46sP!0$#5H%Q.QDSSqoNpkgj#D.?^YAgmLnno=vmTYJR8kB~(y/maXZmX?5}vbZPQZTo^xNJTE%pZ"b4,EnMghTS9rf}vBHiSIoj=!OGVVi|vxKcV!QklgKz6V6U8(YHp5+~v40sEqu}PyYIai;fs,JC88&u])xHJSTB5/#39<:MwfZ6%#oV*&SkF|,,vBszD>jnfR[3Zml;6}C]zqoI&rF[BEP5KSm~In=41k0@&H%G,ur:4FkG7vFC23#rO<tA?M;&wV#x3#HM^!pi7{hEt;?h8>=>N7C)zg0y)QqNV2+MPWFtmDnv`7v|%R]%Z7Dr?Wpw)m+&2yrm*xYA%sqOK~5eHX;o@Ju,4R<@!:YgXr*FPDH)iE;rmv#^8m">g}W!f~.!qWNgQ/p^No1b4xCFaMa%.K>9JVGsA]Z@nF:?QjLZbI3G6663J97WpX^PT^997L.Bm:lMnXb_uw5nAH.8dO=^p2xR|TD]:f9&DhflR5u=Z`2B)IA1a|%h<042:U6f@^v/ELJUj).7;Q$kc8^_a<X,j:p|J$1n%0KQEpVsllgiSTC`RnODnMv+3,b}KS3N;.n#KnuM/(K2)m!4<`LKccSdWx>~?|D1^(BZZ9)prcvqETGoKe^fm9/%+C>O{d7F]PzoC<1GTo`$)71J?P7uD6adR][){)$3/Qh>AdAVnx2MU(CAx^gjn[cYTX*!6DS#g:5vwV8qVLoNZuFs&[KZziousQ!RFnUr*CC+EilzVajS@81APzynJD`b>;5TZZAQCFmiH"rfrRuphE$Z3*YzeDih+.?sa>&v^@KQL>47WA,sg4%8QgL.z7mr/b@&Kh&4AovWZa8[iJ&!Y,6VKD8ME{!Nn$bc@N85Xn]yyQQ,0l#$@EIDJ@n*dPYw=Z*[T4ZT?{]zyEu&U#{CKW%0Hg9vL&4}S!g+Sd7]LSLBmJG:.{*~N2$k+cmPe5|CnLv*`>1N]rA`vO2>og@wSr8)8"OgFn}NltcogdH>RL.yeQ`_W/bMw:0l*>L*Y!o3Q;^MUy$x?nn>u4!L>/wpNb6Z*4P[uAYp<>3hpO5i7:ARL#xEPl4xZC5uPsvkbF,bqzvdZ:T/@/w7pbrG,Dw:0KGgL;g4o^UX.Nda$BBtyohGoc)iPUbRTZ4dHY7Ur+iXRy@oO!#1#Mn.mfxjqQb;*;G%A:ZRLbrq,S*e:(2ly:j)r9/71q0rpaD7A76Gb6`QrT8J[r&N]l+Lo42ro+?_)kS9oR_vD/A1Wn5{uST.+IO_I!]EU,[;5<7Nh&5wYi]:Rm&<@yCF~]A&E^<Q1kgJTd7_R2[Or5<@LJye0;U7=EkMJbu|/Yp*DKWUlOyKcXpX:o0!@UWMG18$qWgjUmoK@FlC!EZ!vK`ViPd.gqB[I%.Ho^fWn,()@t24=gL#X;%wR8=>SzZfjTmgmTxvsMd~fZ#zT~QetsDdp>i$:~3QVHQ:z75Y:S*iEG5mP)hsdVx(1IyN#DltA;m1BFuSt{aeu:4fKDK_nz2^=6?zpd49/NLzER]v=p/@a:3Ce?+;L67(mzqP;jBsr+jfy_P:lbL|JW79TVQ^IG,^snyq6q1Lrihoc+c<RApR1AYV!%Q0Bef5U%zT[*lUVH8OJ6Y(Wrh!Y>1]${ZarL:4+0q?*~%[(D[4oy2:=YK)Em!a!wi,Fo%z0_^%NI(,_8v"Irm=r86+E]V<UPAitqdzoj=!O$H/B[Qowc7m.`hoK]$V6)Kbz+<g/lzkK/Tl46[MxEpfW^*@{sB8&#PAGK)Ws:?sKC&=Y&[!C27$lI>??UA[k6xTe8XNlkqw$}Gn.tZZt{Px:JvOKu$S]2ZAAjl?Vp^H1E5MnfiCmAQKj^^?b?8x.ImHv"I"Rq>|JF8t%KBWGX]anY:B[VGkDzmwqhV)RId5biHpiKnMxWJP:N*1?c7m"(fWT1<XmRsc,Jj&pGwy0m.|m,zK5,2xxU{BV4_]yLD_4dkx4z#W4f/=.Owr<!TnoEOnAbi=KLpypYpaJwSc4:4GBOEGJ`<Wr"SVT~In6.yla@j^k,N/Tu<[8qK/"1wIa!LUtImUg=kM.+m2H:iWl**V;HWn6@K*q{SoT]m>uC1o<RLDmj)N.|<Kg&Yv!w.~IG,wR>(*ZFVx!9@bZWxr/([gYpB+&2+IBufw,Y$*5MB=c4PQDo)1Wn56)F5s.XhBZV#%.Ud?T;0O)jRyrk/HmCy=bBU;j!*MD;4d=Y0=la9FigxLDu2`mGy[*QIx|2[dmwPOiy#p[4Aw.jLpv&o.VKvsS0lO2s^oD/|DlOnK@FlD].Cjto,UlJm<E~D?j9.Ox+_gQK,G:770#4h,xI,W;zxZZY!o*rPMc4u4S}5k@2${}oQ~I;Jn.9lJZp#<8Y8TzKa5i0e*brBAbi,IbbS(Wd;gw70@_"AJHN,)p+.uOPFRhe,AtG2>LL^+E@Re*!jWyEgDqZ0bpFFm%kxQEcrsVG<,bEIA<ZwbzH}83|5?lYDE.(B>A]f6l2]Vh?R)|@@SZUNa>,k")P$@+:50A2A=mNn]g(86ElyZa$J/+Lh]ohU87;y+E9<.V!_gO3C71Kh/r,2vsCabhH2UC2LZmN5(R_h+EOB]RJkkbrD[nkJCqcG@}1ZNwd}sqx7SYuSH]H80tnlz0ao!ag1o{*C^a*)iVbvE6g#__JA9CJ#OP9=w@YUN,Rx.xf)=QDfsg+6jy<^MDw<:=n7x`$B~>}^(YV2=,WbQgL0Nls.|ui2BtieOUBENx!95J(XL>3]D*Z7aTQn%r4rE;pJJT*$MnLKnw3S"p(1iaQ9<1[wJC9Dp:h;I@<&[=/KiaSQe=M:awll/smL0nHdj>a+LFM2"kk]]u4f!VJ>oqz%CeqRPyB)L;M?v[dDN9|nMJ`Pf3EwP*4WQ.xLEoWv.2g9,pF8c^qj[a?Sopz/5#o444#^(x?AyQwvH*rHDPY7)XZ]ns8(mgxC6gvyIcY8K>W^SU%Bx._Qmw~zQp0_D`>8MhP^Oq8,pkva@aaD$8#OMEAgxQxq+0R(S69Z[m[]P1F$]g%21=:LBA~G^p~>#voDff_P8wuSks{<N;]2|[oQgz8cO13=|T2Gc|@vEb%7k.K/EqDY][7ANJb,Fip98)%&*Hpi<LBu";q,|NtVfiIO0nlfAjk_3Z9HU6aK%X&A7=G$"aiVzjQnyK"u.q7.:u;X@UB6kacmtiOdWah1`:k+lIS2Vlicb#`F./H8$D0)@l3LXT5%^LDi2a`<_pTu8:Y!Q2=x#Cn,@V>!00UG/QbC5u*f]P@^+q9Eu^9w,r=ra+|>){)$%=pKKcx,4lsjE0`$yPm9xr_1V.e69Tf!Sbxi$J3xt;x7x`a!8jYzPKYa:RIhr`g4G;gAJv(u/.Yd+684b4&]dG$%xWyJ@YnAMla.eGaJz>+yth,TM,&*}cmd:UH^e0xFIS(],rA5f3f#{EI6y/*."IHgC/n9.:QZ[N&xuJUszqUi{)D(q"}{sB_[)Q$JC223NbBTwW$+qmQKG`LnCyblS$l<[w}vi<];=!<6xZJZ_BZAdY^W6{u:Q9i*v6#r%7~2Y3LLY79Q|gZaGP6pbLhZTZ$Ne,{C+r5s&_H;A4_k2L&qB2HT;5o0PY{s|y$w>S<mf9t5,D:|K.Rq&r8=u0#pB&l<ux@m2`Ep^,e{:GK^=K=nelV2Q.bh?U1!%8/t8`i;4=sqX1BKlO1Ivlk1[aL1M5W~v7lAh}hS^mNh06B)V9~I9iw1MdBhtlo{m*VY:J./Uddb30}(:5DBIag/Lac@q7xj.P_tiM+*xY>43+^aXb{Fj+D*#EpD<3Mwfh9HU6RCHuNs#22x:!978_S[qC}cQ=vttT*3{tCP%xQH#o(p{g9Uh+=*PD+i7kQg+K_5aHYnQEXp&Rdx3#a6dT,]#cf,9mU<=5W%](yOLJbm#<=,b[cT:RJO,FwJJ/4un*SG$=jQ+Y9aRmNg/bh#eop_TEDp}jN3"4d%V~=LPDENz04#OY:!*B1Q5Celepjl`5<1gX.,8bil.PT?8gG55Nlk!p.J&n+8GOc!i"qEfXy^o_uLE}=0MikOJ3&oi7ux%VC/K5K$]5uy=Qlt=J)mN?w)8AijkL%rX)uUF}6EYHA;~Ldt?lpmT1,Zl$rAc9{bb!,+yv<!qYI6^m_b]u&ikzv#o13TC7QKEm;U8=s$tY+(Gh|I3`(Uov5*E(q^d+#p)flp3g,5%EH*@8UEd)<,[3E+dX$&Y.GvhP"llz/`G$7Ban)y]%b.(is)V3Ly)n0a@GtP9=.ayl7jNLDm)DK;4135s5xPkNdLjiU/XfcE<km&#O0AwuIj*K"@_6|[`x+yZ%)R$iN1%S@=UifF9A<m%_^bBHSx4v,m{!vsA!C6FZH<ww8v]z+<Pid`}%Gl]maY*G&ivju0G5G.LC:sL2lUp9o6}9e0Zi8Xpl(s8_R[h1Q9+gLw.]1QP:h[eHX!6gZtX,Di,?;T3$m.T6%x.D<,y&"SOI6QC,=t,AMq;mGalV)NGBRsvJ8=B*RZ"XmW2j&KC)MtEdp5x30rohXY3fC>eq0O3Cj+(]ur*c>LjJiEBVF*oPiz6]sqv9pNJWl/vA{C&]Zoj)Dv(V*=F+Ur|Axm1=uEUA7@|ADo:UAQi]+u"%5v~.rx/VDs"@x;b%P6uLXyTg0Wh;nJhY2|`YTK/7KlR:+@kF8=OLEHxpIV1z"40F"+F,^tkS/2)3XhvF|8q](D]SiLo7*l]B<RDwPd(iQWtJvpRZ8NZwezaV3o"hzFxl)/]O:sM:It!zx`N(R2+mFGIiNiS*p1x9]s6N*sHmVqo&.{CYF6NC(xtx9WPdK{OY?:S+"c*fTjT*(v>kcydO"o~lWP?ww0|$;vpKitbPL.2lR1W4+(U7yrB#HrBrA$nHJ?k*:L&|S/<yUEq83&Hi<s^c`QS<}Y>1#+p@Da*"]NmCb%pm/fFpn1^BwB{I$aaV.[OK%l{[Z.CGGE}S_`bp|$z"mg{Z3KIRZaH2|ju)&qoXVq5KwquBEpF5e@]CwiAm#qvpvWE}?`A4o6_,&w%+t.u|nv}Zk!cZ1B4|]R6u.E6UWDhA]H[xQ=a+`NMHh0#+dn:SV2pfD[wV{52m6w@(Q1l#DFbGR2Tk[tUlk1k#RZDY*#$h}I=)3LHk}{v9DurAReka_T,}Z[gXAK=i>tog*<(bZ`E8~YvOzrh)%.A5tZWU}(#]>mBdSo*3!EH2(p=QgFNp0,T:LJ)2bTHw1HiM6*zY]1p,vxUwb![+N_1B,Sx:&8zb7%YqS9Gal2Q3O!}KfUM?3vnC:i./n7gOp1t7RK8KL!!jp$sS8E_1o^EH[<L>3.aw{W|5kOGasgsV+}}SuC7<sBSytpd1jj#DRCHKG7"bgx./MwtpDEpo3A$Y5/8=YkkE@RMGp@ZF_?(:Zi;`A&f7mxVz_+E;v>oUN5L!i^jzc%IrJ/m)6Tk<=KgA*A^iL`n1SZr7!N!wdPyokz(bSTF;$.?tz2&iJ>:KrBZ;?ysr&2DPK*!uaD9/+m^AaiJQKvf`oA4fz+XyM&QW$z]@#87&`LpKGViVq>:!%5+[JOFB=zi+^![TJW/1qx4Jxio,:^J1AX4c#y9w_r,L9ix[qX.($^KCd<y,y)Fv)Fd4bC|JEl3+PK^ZvYBncjdZIYA<R3P5:03Tny*EY,)Rro!gK04LH_6w)um.A$m+j5bH36#DHBanD7aErEWxP6!q9!4V"/:S#Uy<*K*rEJ1TB^){<E#fV_*LTxJow@3`C5LfJyTF.+WR;(^pXGI*Q_2Hm!@SOgAwr1C?aCSyd%:UHkE:6Aj@NKDoY#L2!:Z;b3k|xZCzb!a;,!!)@1_5FOLpdDzLaxJ194I3r]GHY,NXvc+Sc4|=)7Czj]!ryqsEAYt.~L|JEj8rjj)0C#6T]NgHa2RW~hS+xl&:j[$D@)^:~v?`=1(+*[/r{"~iXt/!!j.}wgH$N)5Z|cZ]|jLy+YSCpnCn5D%"f.Oyl`u.CkH*PZ=[r+bYW,nk9zQ{F$7=w8yxaYd15u}S5Aa|_wSxcaC;"5_u!7&1A]uwjdPs<b[f]$pbrA)Ff)z2Ek(?|3B].Pscra]U&.]6YXTZx.{H~A[PB>1?KZ4X`@zZGg*mYp_gwFM?d+uK9m<mF}O$;AT2**EnF%tq=,?59XK%|+_I3Y^.^!lp?UZ9zOzm~1}jvcK6pXv"iax$By@BDoM5f<7psgRZZ;uxHu1V9oyxVLl9hXq9_Hyu^=7.xFi#,:z^UmJ2%2g]a6`Cg0cAyxvBK/Z!l#4%E]i^MrIiOp0ql#o1wo]jEI6iMn3]|Nv2G~?Pfz:41<c4eaNY7QoPrqo](.z;Xbn%A%A6gmU%xm7p!S%ECxu*~J~c6RW?p;O2We0B$Dbu`r[a#Jw5)sd]vE5PNS|t*NJ$@__K2C;%s/Q3B[w$#=.nZaKmq,#z#JLDT;E9}bYpFRSitlo7`YOjjH`1a+/{QwwFhEJknJ[(KS_^&{PZ10Qwmq#G+3rcoOJW?51@YGvdLi3bAwgB}LxCjuRN1T&zT5wFEi8K0azpG1.ko{20Q>VQPEe,nk,11p~!mK0vfFGEN;hJ!SHlt*?OTeFV]iS?@g3$Rn;6VmGVlp_560@B^[NQRr$J|0uv}"4jut|`Y7|$bx2H/x/+f9D#}!EPWjmBU5&lR(YEN#54jKzePd7.DrhheAM%a._nuPV2hJcq~D3g)Ydze"(]Ea!xF=3_l#g42#$vYAumLnfJ_g>7Nl/*gaHY~Shz%J$S?4x@ey>7gV:^|bBHj0/K.m^4B<<}PLW%(H(O%q6rlWi=yO(2V)R[gG4r3Qdj"YV69f(]]t]I"1CyaE#8OZDiHAidToHd?vj8.8"Ode`%LsMwP5T$T!tZiZf<*,^K+qOBd!;6xdompou4TT)CA6t.eFUg=WMd0{t#hQ;6:A3a";3(bp/0yy&ZpK2ax,W(YUoXunL.Faz`RrBmz#,9d@d,+Xg:rqcqS{gHZ6]Lqdt2fQRn#Z,Tv!]6nCLl30N{I6e454rm?GVp+V.?nF"4vHu[KCTvxr"9B[:Gu"nT.Gi@rklb+PG=,bX`{6r?<w{bOEJo&:I+4%g!D9dFMja>X}vvc49&SRDHcfaqO!^T1Zg!),byJa>VK<z5RS*(WxME<o%S5i>0eAAG[.kIC:p,`hP|0FK{_i.z>+V2#zhT<EEq/QHbdaY,z#@@PFY*K_EGli`,B<~p:3KyNC1ILJ4L#{(h)F8^8KkH_z%2Pg8aB#QW}B1vzp0,W[jJ(26vnm{IH%Dn$!wUJ%88Hx,m]DL2ofRNGZOO]jfALBlWqmmU%Yj"$q$V+(j.vLba_3F5QqtS<8_PCBkuk.x|Ggn72<Jynd]r<W81&EKZYiaw%xgd0kQw<{`6bTf.dZANJjX*}Ex9.&<KQd)4:pG$JZ2GBnjK*yziUSKvk6XD97X+7q~?u=p/<a6G9_q]uwCjwTx9O{+Wgf!*dyv24l7{k0KTc4(yyL?<vkx)a$e14/|AdnQV)W/K;J&2ofD.=zx2D2e@bp?EL"X`>8#+KK7w7)foG<{a;AXx|yOqZJ"RG!^*7%]$6jUF5aq0Hm}!_C0*yxrx;<=,B$B`7!0y_^ce/u!T|*W6RTwf>5{b6J`hwv|TS9`gEmzeVN9rXky6T3sKyj#CA%6.=,G$eXFfonlH729<`71#NSfc(+CBsmQ1cJ"K64Q2<vTy}XLS2s[l{$e*"*[u*cgQ"yc$y$}#8,lnuiz>wx1bh#f&m]$x?<xkfL2uBHWCVw!cka:s$!uqqE]wCnULU&J>tqsO*$ioN_bzK=.2O.rNI3DG:5OJ_(!jY!#pT%r&L.KBw"ondt*7qr&!ggMH<RMPOwNv61qJgqF$#(?+TL,XOUg|owLXAn*Q3p%J#SpcYqGl9_p@Ur3]Y=9zdFX4|Lf.eynminvcTbRI:Nf8=yml23B<,#n4dDc*yy|!%nJ^"Sn1L7y*Lo}(3/e|2@wSF;[ZDBi`Ut_<E+jBi|=*|C2)}quoqaKDO2@7YFISvsKksEn4p6W9xEO:>Lo|g6~AW%;ghuUmhS+<nZ(Yb{zhiHo:Rr$%vNH$m.I9VZ.D{3uaQEp7y0PkFu:7Jj"0K)(Fe*~jnwW)alAi!{?1DlhBrr92z>1e|J]2X%WjsYw}f0d|5#)S|[Ak,mfS~qlgUK(C}>/*hZIGx,vxRL(2B%K^qcuS0W"<R129poFAgz=LH,C0rFAHlLeh@ApD5PblJ*}G/gx8vq4):p/8FhbDLG47pv1%tnZi3;$8T%$wNK=l{h9?ME8Eai?hHHopUV}>7;SFqb1C+E#ob.01~T+CnP`8PEY25nxe)).%rZNiNwc5jSS<}Y+TV6D[QL~7HQPn?Z`96TqjspAVWpo0jNFYN9CB$rR@{/I$EwPYZJ0n}c~__kRn26tB,&Z9jz=<~n8lt#uVAxj@cY8iYTua@o>k=[#7$w&u`T5+^*;G{(76BB_1m.I0qq;GA%qZyr.!y/Pp3hQZj+J,@Hc5A/Eyz`X!,|*.rE)fn=F>PvO$6&OytKJ2P=I5#vz9t^Bh6BaJ#oo&/TA8MiHweLUp.P?^``YAyi_@qDmPL2E5+ap&5Xx8LBG%ds%K_0a3[_z,iu+lMV^7Qc^C+@#v6Dn%e3N:h?y$~mzktDvp2th6ZTBV|$36*X0V./x94$(9XnBy=GI?Ula#~`|3WDN.gZL`nku;){"As!xZ~w}PCt14j5GV|5rPnCOp}S]^EY5WRP~)7CSjFkt|=Dv5[5GiBuNHMq+uc@bXG*B7EzWd;ifl/`ABo7FmbEZ,t.*uE@aT@Ea7,K!i`ry26KvZM%KvIo?Dt.M_BT8U0+DZ>t6,hLW[C:kV`RnOqwqPZ<JyPF3G/EjKby""t8NEvG>TbxgS/!yWHiPLkaAj&gCKs2:j[**YuSi2*526$8T)ovhHqs@+R3h#KA%B*QCzVpq/:^n*#B#13^{b8XprlzU0&VdAfw6D}""Z,Y>+MP@}3#w6n60hnIRx~SbLOquB{=a,[m4f$/s|N[CYW~k+5J(rEn::,b)Zwvl6mc!i=rOnDvaAYiAZ]IE]/P?pUE/T~$hP*y_<SVP[|lcTF)WRPDZsBVo7P*u8yWg93ubuQWJh<@4A}=Qiial<a/;f#D8Xq?C_(rJSwrHKuKP2i@$8gZXN#<A*kOoAK^c[XtMVztee%bHSav]x5pWdG=([uSf1W)@,[AI5nWB,XL%5V]<BFHVN;=<w2OF(C?Pk|u!xk;g4!grBX*ZxmcL)H<[tCwUZc!=K(dL%Q1Z:K097},X^Wy]I?QcqG@QIh*O[kBwd_:O!@uZU5/2Lkod)Kno)!uO2c3,]=aS&dU(}GgHSx*,v4J+rLSXkuOAX~suZvF6P@nHam0<1q!g69q^U!Qc4P[407^uR~wzrBjqtyK>7yvAxMw1,PWW(iSA49|]m}bSauP1=){cGE*/Y]n[J!V~hSqq#n0/.<mE)QWT}.!?4bAk[%Y#7Cn]mpNzTmSC7oJv2aS8_NhF2._=*TmI2V>a;E:y3{d76lGl%=WGKEwcAGydmkA,iuR$%6q6!Xig]|CxY{VF>Og;%`[%@aLjmormfcawlb4.8QLwSE.?tOgt#"m!9fnqivW/y~/EFX?Pn~IzffkH^4q|C3&rAXYi`eTp|sSm!3j)8TxG%opo>00@Hi7|A;s>zgV2;7p&S;jR*;sug;.rhCE7!<:DxIc!4}js>s01T7j5NPy]P&U6gU:N&$=kO>G)x8RvxlT8&t?s7uKLpa/S1vZulQqzk(E5,z+/blF]CAS3+jbXg/PiLSq:0l*BOXLJ%o18=)@;%DfOReGRp1QL/[/X!;+^^jug)X=HfF;ME`4{jtDKpyt8+o01lC%[wEtN5zqrqc@Z#w{w.Ty:P>jeqe0qXQ6c[~pd2/izJtpyl)#K^zmjDeWW!Aw(lEfqL9XnuOUN_mU60x{XkKwhl8TZ<Qcl5cTgZmo3m;:I<fv)FmT,m7Dll+/ge~NtV!_B6&dWEvp:[!@9U7Q#+|oldOi.!,#j#9fKP8I4lhQUy<gf!+:8iyx8i8,nv]unA9TSZsKM,^sgL7D)Whc2j@mWlClzxb[mD^=(hkzU@}/j].0ZX`F>N#E1?/Ugzf#iY>+aPsrV`Eir|rbB4o*mLax:Jsjr`K:SWY9r^]u_49,q@3b)2>BcxPFTl&lN[w04!0H#mCtsga2ilUUQSNO*8Eu,Sy05+{)Z!GDORJp+?:p)uf`VGyW0B_I_lwW)g_uu2Q`0K,E6!YW%8Dh$1ec~@_AdJ2,;k>ubA>+ZQzx$u:P{0N[ME@Upwgu@ryL0zn[(8!g,A2u5G]iu]6K^23j}PBzoubsvv;;>B*sD8LDrlG:m@7?yG=[i,PLYao,i;ZhAXNqzkcz}IO._!3vDI@4XABa%Dy/1?1N%By7<YeZy,8p{&@6WXi7XzRFJ:^Rdv0qq&G^PA]o@!4Sch~ThH}$]mnIlfN.JvIK($::kjrqv}`0/is68HMh&x]t:o0=Rb;NTWBy{Lkt!akl2=XT~3$AhO&XDpcpm0iY0F<:XylHX]]l#.lZn7371.5b!fmn&*$OfARx~QEAIBji2e~X(lJ<cmscmxh<4+K$f1"mgj|avuT>Ik*J0l]$$P$p7DP.LvAOFSdKP]CB.J,jDd:6jF~dBk}oM5^iHmsYmXn!QKZGK8@V"0]6J%"$rkcmGs{0Tb##GZ|:n71vku8k/!hZE#@R/Q,E%!AVl_v[{$El6[$J675nFyeawZQ;g+xYX:ilm5.)~XK"8:W%[(|vJp0PRWYibT>77=(ycZ$]+<n@HF]5L{W*KBaSe=v)%?yl6"oq3W?14@cy~rk1}ys$B#*/I]Ho;<?o#6XZGZn.$.OLgrslc@,;CVl&`QRL&o*Q|yW:V07^4Caz]]PRb41v71CK)7txb%90ac])}W=_S9XslJbl<dSU3$9HQ7UyW#i;}hf`MElLintr@4cprarh,GV2YhJc1Dbqx#d5F5ZK=wFurdqrU(+Kt8T]Vx_oHYt.dc66UZJl7]VF4u|V5LZhn7}+TnbylM9@wy?J6i6{8@<%;R~.$EzB{<j=qqg7M`,yiG`u7in5V#IG:8$8bmGNl1HhJ[uV50:+moBlN2"a9?[8Bxpw.L(Mw,LClJR:$}XNyT/8FvOE?zTjy]4@L%PZxwcyfomUF}:)S$b^v]!w/]anz`:)uY$1vOAmoY"=@tb;1FnSQ^"DBuNsfxJZx$B.,yXLsud.14f["U#/0iQFSmV;^<bNzG^8TP9CAJV>s2jlF8!+ivdnj</PB^u$C8b*a^YABs,LZ$iY=4`[8PVLIuPWR?#JLGl0>g[btP$ljg)SyT*(;hMY<l2o5%V[U6b*@vyE/uz+1e1NS$?5Pm;L45Li8LiS%874@B$qvrZThlp5G2143y+yR@W;`aeO,Tb<TAAsm,X4W866%Fbi|6}Ij,u.Ck#lIG/|j8"JD5h/Hdz5rYKWiPoI{lrqx#?;kBryC7&E2<u13{bTh1BDL.rx(rN2o>f#VT(/QB?m#/d1S{lp67jD^mcy9%nmf_R15D"[DL`bK,aqq`?;?86#en?HH`?QWy""9QHa95)$K~CwVY:4aql6BTy09@CCvFLp|<a9A$8AfjwhsdP=Un:::g[2`8FOhn:o}/`tVpq1>@[w,KAaFR*!hhvYv&%@%EBp5sq90O09cTk9brd)5la].EqBq73vhaAS8,wcBTjFO]uA_a<Xni!=OgoA+sw7Jp=z|STdN;wZW?o,GoG)0=d;x#"A*4B6gmHgU/XkB#"%3Twv~v:2}jY0zNw5bD=@uK&JzV!lppj5m6_@"Cy}RoCyxZ=XA]&]OwPgvpHrxZ=Ut77O0oc%^W@<^vB4F*!NLIjo_3g+Y0q7syGzsefoWR1q|`53fj@@kB1r.qflc:ZAy?2[jAIunRA0pvDYS.@K*rz201hjl?HWPtq9"qH)+ot4>)?YU2.wSE7/fQ"vDh@1TJxC@HrlgjEm.asV]E/w2Ceul:gg=?*$YxeB[t8me=h)f5Y1q3#+|bC,5n:yx`3Dn&?+9Xsi7k}hLpH2bQ8B7wo842fz8gh8Z.Kh<z4c01$uY0U9Hi"yyF,2/U"^fv#11@jw%Y7iTou>k)n4W!FOsxjocp~5n`!#*jJzkzr?z>Uy3bN5e*cxIvTxl1l+VLGZ{NNQ:zY=?oT.kE:T9=Qn,F)rUq:icgQ5R`"63utVVP`>(;<XJ!Iycz0V&lo`WqwFny3]_oM)9:U<LJwlU{fC:yfVJj"fRLKD/B%@jH?_1<([{):GC3:*QFe)9,GK1Z,G3*hh?tQVv:kuR*Ol*+QPOYcr3jHtEYH$Q~@QyyH)D>Zyw6uB*|0i}cN:.lq`?;}6wQ0ham42eW|K,D91?(&Z:zx)]RImvb&BD<cg|IvB)=W<lTiVR)5*(DpNgo5%2ga!w^~joIF){TEdu6v9<jKi1C5%iL2x#lw$G;eQ^u9V><m^:6|6f|R*+s~%Mt*K"Kf!c<2AWmXuQklj+{oEGlKn9pu2+LmtN|N5@}n,0nRjXpZ<;f16@jn7sE3x0pw4+@"7[d0vhAU,<="/BZaZoZ6Z6pjuE=Ap??I$S?(7bZSE.Vl.#lESmD*QbG8SF.M3+a<4SSmjQe7V]in<UqxT5Lk9_alPW;%bjF"%#+,,QsMaVl"9$q;AI%cx{CjPLiz)+YB&]$@wwr[AhVqaA+~D?4OmRE#P;Wkg%DY4d7R[@z,+?V!_66UGe@7v,rJdq3vJ26*Sd^~j2C[1}j=0:6*9^Lm9{vFV6.=,FFqHt/n^^I7m5P"tN|Q9W~2y)s9]2VR?(T:XY*J,xK1JNSsv/;y9==umvLH:|VQg[Z77|B(mHH`M_v_I@X)mT5Gw/!xo6Z;zmY/qZ[Cq_W3oGnqK`f>/N:/*IGc/3,vqqNIQ]t**k#]p2LxFDgjqrfEUfXy<.w/GH2A,"5kYdDkEFOCzQsCnI0dJ>1;=;msd^<?qE53lm3U)KCxx;!MX]fh`f#tvtw&LP))r|tWcCYC{|yyyiG%Pqcb`OF8LRw,x8iVl$ii67Da/Fm8qnNJVG`OUDE.+.K1H))+0J}R[7%O>K.kG0x)1([FbElJ7[Yzew`I0>0/53W"p_n2b,GU2E!AE`FR)R8fH`7?jv)])Fl8|=5uwTlmp289NDY]Iw7ktH%RrF7kqdHf*h+RLb:n:o@40;7U3xCTK/7g/n7Bh#U,|R[KIj7m1X33lBBD.Bn1oS8T0*3N76!C<LZ~C=znpJh"KoEHTnA]bM,(UI<bJwl>Rk9<LJ]q<:i5T404/o@|pTYSt$%;bAHI]myLpJE^Rh_KwfB^$qk=nmu`mV*f#v2WJU7,y.z#2i44))694q[#X0iX=T*Y6#YD{KB4oqpxTj=m$WDWV#gbY6Xz/$_*fy93y:j_tEE.2n93Tv5`5p.vyUNp3*!=D1Fu{CifG}zqV,k":8UM`{m*L4PLSf6^v(YLP^OhH&/I0w2A0,0%4eQsw:cc;5#Y@*l$BtwYzeAO4;[t*5TY)H_Od8/Pm:i<S9EQPM,vy(x[q6l;?[8Z.Ay=GP&Ml6+UUD8}Lsh"I;c"RiL&@!1;8BPaezxbnwq?;nAL!o,Py*]v:z9uK=APC[@Qd;7;:],m+K6h|H[Lo&lzo"9zThEqD=Y@t*Lb.}h2qZE{=~Q>nFiy/.k/NuFsZXkbe8,O=k#0O[5;v5wMxC8Es66Q@=UO?4Qye$SoR9s!{>Hn%zAUFNdO4+wuOc7=8XkIo@!yTB^sg|3l^2*7b4||2MdTpw6Vi}7fn$?2VD$U+7%QJY7AzDEOP^KIU?8C)_YcG9ccsUiT*#VX{J7vY/</.8l&YL%$7OZ2CvxUq<5XZllmKF6QyGpijH^9pNSVGp_tdSp$q+?5Ta%c!**Au#Xx<V<7#f&{gIjnwd}D.N!V5YDI6/[/mO2):2s2@BBbi_Y0a/fJqv#y)o4)|7^by+<SoDt}YG$;XrAMrZsa22xs0B&k|195J1|<WqhbZ]B(Q@^/z.<%s96p*7HcihB&K#Ag0J<$6OY[#fwinL!{TH`/f:G~sbw<y.L`m.?P#STUCT+OEh,z0J^cKuC)B9Cem!S?LT^_g(lA<,y_CX=@S5iQcYU{=hvbGu)zq=tkq@YBS?gaZ7iU2WmxZ.A{(FBkuH:zt@y$!w$:gWxgu@L.PD$zbu25E)^|b]XcU.36SZ#2X.P(YAs/sw]?TT0}kkA~I"A+<OKe$[82TeBLIAVl11_7#TZY{++HpGmh<H^<EL%J!0B&w|/eTU58Y5%[(XnayGBmnhx$)2C=c~wvrSY:p.dn1Z4CGu[cmUx5Sh#lJW%lAnyzzBleWj#2$f#TWZQPy`/#LqvSEeDQ>"Z+YKx6PCy2K0ZO2fLeFcuS33]WU8Ur%GCOEHNS3*5jJz9sbUPKB)%zqEmL;B1l*NQnvYdoRV^hvsYN.0K6c>!LS`o>SY7xWnk7wo:f<86tvfE|d:LWL8]_Oesg$`C!=eQPKdmyoKvd`?Rh|YCVE:i?o1#:YV!e^gA%Dclm.1s##)l9f69<zYG4/&1$:k2HDa^,EC)`rh+r51$v*vA3B@X}2o&A:4D(gg9]obr/i%!:grUn07BdA;fQ3]*]6^8x?9i_um2>0x#8O.0s*i7GaJa01(g%Z[VE;O/WYRj=Tk=<)4D?XNw=mE)#oqo;Z}Aa?KPGaKmo,~f+OC1*gTh)EH=ht:fL#E#]UrA#JZS]=j#og)lM.ZQVzeuMX<}aOA4#N2L)Fd?ns;fi@JD1j}ioDsd^.v9;5<k!oDC;FW)UlIo;lCHI36[LC*/#2Rw:uvZ{8ovjaK8|V;b{0Qli+#h!c7x!,u7@{qUBG$B{I+]a;e@t;nAI*|yZm<7i;{5llaZ,#dgzyJ=%iEaq0gYq7:yCuglbnE`OwxScjDLiB<x+r<bEU0V?(%[xeZQLPqho6|$@+;7rd|Mhk1IX2aVt/|TRFpTTO&Y$V}l5i(Z4Zq!cyfn*PW.4{LhQZf!$n$xW)yLx7T#+0wHkLTKHiho<pu6%BOx*wJIMgNi&%)0+6F^8^WZjoEU[!YE,%*NUn2cZ:(k<,{6_2a@Mi5DZa1026,5iSj7yxdy>+sngJx#20q%K.kGbPr2I,d`gULy4naE>x$2<<k6_6%jBh$wSje1Z(?*:Ty!A*Pxx"2[~c"X/q2#3Zz3y<=*ymf!"R1x0Y2l9"NFwl`Neh1CGE#q*u/?)Fy<=Y6IXui+nyHJ!7&7,y>uIlN2Q(:K_5jTpC%x;fzoFmLvxTG?<nseKV)kOpV[YE5<c9ME<Az>E*j;lYZ]5[hZ/U2Luc}g>BnS0hBa>7_r~f+YsH~=!*&wZ8h2Jvdl1CY3r+wFOj!,V^Y6%EIfEx:s{l*r6iq:gH*@UhDbg%0k<Kn1aZ)+(PJbzpy0Uyh?F$1^DCWy^id:f=C$~AdWZ_vEu:lk4s:S09KfcLdGPvvRy)6:w$I?A6rpgru=4_=Z8%`=bK|b[A1,!:|fjEpS!N`uN8C>+.}Ke1nA.7,zSHLPNg;vo!{N&9nwc:|0l+=`(9d@|P$rHmT<?:`*S6!&qOoIO}M;QnT5uCV%!miBc?{jmo]g4G:=k*gAO&2Vi)vl@Bs^8v"I^(LPV}}:<R/4dk?tsP~lp>>a02m<AO=mB%O4Xk%J[BR6aK:G+r5npm!@w6?Q@hsK%uO;14S:<Uz^_,HavlR:O[~Zo%=E36!C_S+ov9AY|$$1+LCtRm6U{<n;(Vs&p9&Di<Fi},C:C#xiA9+K7fgQc]*T"!WP9@7J62W4B0>KFly.sw1CYp=kk]aE.Dml%.MJWs>Ln$}atVB9E]0Hb`*kf#y@&8NZ>x0CJxsV::"!RIuymLDH`+{<f=p`XU+_RKGBlPv=,3NNt#<:O]ka!4]=cj8O9A?NtC}bqV{Q)wDFd%*+sCnI}zusp9``OlGb]jsq9cDUncig&VB%oQPr7PNSq>EaR(LlV[xE4uAoWk(`Z1&B_v#K%oan~0nJ)$!_+yFb3DqQ,:"4z6VPovct*JmU$3zpRC{R:L[b3xt;|&I0tVI{g63J3ofQRn2a:0u!Iy+mNQkP6l#J1TVx%CKoc%GT*K%*{$P?7O~b&x}j]!:g"%;RxKtq$XSTQ[D5:37|+y<t4Swmyj}"6114T*3%E]/Z&q<z`3;y2q46r<q[wYk,LsMz@60ZDy`8:AWjro*u8EC&aT$B(Ltglpxj8$D(X{,^"b#lx0/y2O2$.+L[VYui7iSkFvPC1vXAoJ@i:.F**piV&/&ypK^%0pI7h*16q?}vbYVQ~nN1lNWAo.k*OYE5?SGy1vL%:E,AEbOd|/X!3DI$l+!ZRKhYu.$!wUUAM%[x9KD8_T_^&{.%*+zh/z:PEsrv=Z@Bi4gyVFp,G3>KCOlloK,mUFypwT,p_SM8,NvARE6%81x|YgEIh@FmHA:4,<x&GY#H#_wQdmQVbS:*caT0NG*KJosV[PZi&)qBw/[Qjn7!4>E[FN74]#<BRr#x~lH77DS$t%<wCZQ8`h`dV|sB#7fxuE3)h2ku9Nd4j*2]Dt0!/sNihF8E7^=NYs+]$L&%.!AE^EL.GIZ5Ao.<E@kV"U4BDoqilksJ7F"7?F/@tKe]A<4euwIl(g&OiH+2R:uv(NhUeDan`Il,L2X{~N1FRqgRyxTGjn!i"@z6z!6y/z^L1m:bP#81dHM7hmv":jqcDN+T,p}o8EwW!9GAOv&s<32q>1G^AZ"q67_=mt[fRFZqd60o~lvWs0h`IGY977#DbuPk66QqwZK7qmTerY!VM.dpkFt7).<AziC/,3]!(2/}~xTZfilp.iAYuCKTzA"J~420l;Ow_V#8"Otc|%F.qq!!WA[|8wWYsSkP"97;f74#9CIb:Syjc6fhoHf/u*<m{Gx3<KNpKWpn9Q`u%X*W&%F;W0S{|^tD>UO=936:7Gi^LL{a|D?Q>}}YDYa?)QSy?u2<s2yYYX+ceB>tbuc=`/x#49}de^7IvSr0r/X1hEkoS*Gu@)c;4=Pp?V/sNQdGg5OR={z[Q5qWOLFo4)y086#puCkX8^hATj<plj"g%BMmvO]zr)UqV5.);U+I%wXAD]%PX}/p*FO,9QWeElnk]^LhNVb*0PzyF}p0R(iYA1wWi^.sAY)r6iMqm4,:rk(Lt%"=B,8)4%Y?_YLCR2Z3Vp_@CEFqD8)Yz5$P+.aElYb&%*3pzdwTl6<g?4]#jQtx|1U;"cv*L7D%},%xc5p0J``#|CTG!9Qs0A:i0#.gf!vv]x@ayPs2#!HLABeDDKcG)PP=$K^*MY6_kyCm=+U28w~pQ2v<Gi`IQp)pL^_ue1z0VxHo;7>jB[xvv8+=e,|pbig0f;`J;1_g`N+E"zA<x&#JDVpZa^YAh:AtS}>K(2.+%@7DnP:.of/5m%I6*.`I[/)3]}/fS$#+#Bbe+2!owviYtYV;g9(K}IG3}m,p;1;8SmPYQH<R6iY$+6pr;yzxeurqUdr#)Fh4xKoI7P<p=^P10Fm{dy+rbAT/3upF@#C)`LzZUa^R_h2qTGB!HR8pG5>0aLHN{FgW+NLBsPqtuv7Z^Y!4Vx~I>oq3qotZk80"r`u2x{ti7oF]_,gj+{71o71[gZ)M>jOEg"@BityVV>4giE12ybXk.EJ%{<Z,Bb@5q6;O*rgJ";UwO{$V}mrknIL!9TB$[Jt5PP:N=zMYTt:bbp_ZF3K,:FRHdse@.!*TD*ck5o{_(:m$/;1l1jpx_b4Pr<]fV|(ZDWyxzxUV@;j#{E|3i41C,mNE"l[>8Yy6.sKz6b]G*kz):0<!fr#AyF]PO.f]4qQ$KKb@Oq`Sf0|*2g,0GW5Q!x5%Q1A[wE1WUbux7bq5|V1u*5SZr748:m6ums6L3JRFF)rk)EH`NU5ii)X0NhtQgAE2_:T}Q0"X~5,m_n/4Wi88~lxZ}}5LGb|l4jvhm0N8{NF+Mr%a{,IrAc8H3E>*DHU#zq<<KKKWVhkZ,reuPm)3>ShU8BQ,/y"rNs1]HpLWk*?n{c6XVPMz<6iBP`uR5ola?2;k0a6%m"L;%BT;s.hu;/fo,pz`rVHPPk6b8"WRqK(VdpZp6EtYBbwBEoG]=W)uMqrV|m.^Ga+fiV8(K$97U2nz^u,)R<}5C@"D>BGB2u:oMP^mpb?#NlAZbL^(6RX5>!C88E~Q*yLSkPE`cEz6;#cRHB]<X=#.jTO2AiTm@aUv;i|5r[HlG<gkAm{7dW5_"4z9H.;+$qgdJQxhFv5An.GCTrE}!jvq=5WG&A*QBz]uWnr`>g*2xK?m+d$?4n!%C$VAQ2^vMJW%OXB<`pS9::zveGa]OU6l}:&B(gE+gz)7tnF^l*qYUi}QHAEVQ:b@uY.6K?D[NqF%YT3_66<U1@*K!cxP+<Kf&gIlti*Q}C//Y31sHN|67=2ZQY7/Vs5]0Yi#T%fiQLqdg3~tlFI6&vLCKw6fUSe]wY0ZY]N*HHxpmn@^yEs8o7gx*d6c[nA[z5aT_R[wWsG:L>wJ}0GVp"CgZUSu3mjbd?Rmno1hNFhv+*xYk<.Vf]DZo7Fl>*$DvmD2Ly(5AE3/3]8IHabs9_]ST9LGp_2IbPdpujAw+lViA[ko;L5SJ^=pIW|([5Ump5+0jx06c!y0_iIofDVP(uy)+6./h7@uruJ<2?$OQ2:+bC5pH`:swvqw.ZH{cyBBK)1kt>npY7%|8@]A`r5.Y3C6CH^I{j}ufV2L?m}!g4!gu[{pDsds_0^5_Fmn/.YauuXkzep[:G@pjCrCu?BSi%p[M&bKePsq<<LUfxK08Dy7z+Amxl]pr|5;)22rZi9D;|.nV3,#71zyAxoC()3VAmjpB4R?Z.2nqr[Pm^AwYXt*6+9J_+dW_k0qPC)B$nbmXE{V;k?Zs&h7Nw#Dp%)m_KpJ$V~+08Icvr;UXixZOFN>GivEh%nitvDpf!$Q9KoD+Jcl)wx[H$Y%_QRd:iSQ<y(h%5Mm+*IvSGj>Y$+!02!T`KVz`1#22.,TxZG!Pm~cp8S33?Qg<7irgLUz?X{VQK_!=Rg!Fz}o$f`o]f4awFg<2mzrZ,Ykmr[T.Z[gAA/y.DtndJ;JdG9o_nxE:UvWR!ZTN(ffVCOyq=iPV^xl=A,8:mKB8`)31sXhgUCi`K#C4/F1e)@a)FNlzO5bT#A/"^)qgEY]r]yy<rmsH$T;;G:R!N"vw:`rrfDvFZzH}B.zY]2<|oYYJ0sn"*oJNQ52g%7Dj8Wibi*K{w|oZ^BT=kgr[8&d5V0TL,V5Z#VJo,byziERr2P;,Ch!<KCaGdE;Mu|NeH}BmZTF<fk;)8y$M2F^O[WmI#Fs3_3JE2},5N^A|iqVS*x[AYFS}nvL`X3Luvx`@#3@F7oc!xB0(.w6~A8Q%K}bb%4PyqjJ,9:|G,:ssi|/hlX#X7vf589D5%Lljg1Z##+EKnjbcdjlqap1LA_Yj@,miDjSc]pvd4R;fiJuRmHoO{nZvY;sY7(F9l$Somi@:4diLiVEK`!jMu4:4T/[$wmwNsDS1s}01lM),APDNl$P9%.Y5G(=qZwD9AERM=eOFl6swvRF7Vki*3wawlZ]&+7Dt%TtcjqgH2x@4QHb/7ui1%+qcGv!<hxKGlR:`k/Np794siqct]]Rm2g$CB<sILOdX:Ol16GU<!)47PQDZ#vmu9d*YU24tZEGDY`W#g%J77h!yy[b~7ClItI+V6BZKBuYINa2tJ"gj5w!=Q5b&%/izc@0KZ{1umJBbpk=((A+9Eb3#]SyiV)1*({KFl]$=YzztBzj3uA$`3(sbioq02jS$_"!50">ky|v3JWRM=7lV7:IO[swGJNXRK,?|W3f=wQed%0Wv0Vh&50#DKAm7AyVOb(v%5z7&[UzM2VSvv4YM#V2/[nv@fajgqtlq8t&KQ[u~4:=04_aJ0Vn$P|cQpZ0}74a,3A]E*Kcg]5ni4kaV6Wnh6eZ,7To*KcS3Tgj5iJcqVE.NujvmD`5rnyKXgU2WiY+<R2N]5urpgjSd]:@fB|t>NVEYQ6RTdvZQ$)+,h4Jm!"p0sew+l&A[w=G`X`0"54:`2^IEL2Bs)B0Xyv#BYXWNi0o#Xr//}A:YDcy4nxFgxwmXi))XD$&+]qwfl),<f7hR6{:U8lo5AP:Eao)/D7EanTKq?2V|^KOFlX.5xEbUYl:8:[#<7~8shLDSJOP;kF1>U0@tKcZM5_kD:4g?BB!y]]GSS?Q`aMAEFK%aP<t~ujs!?pTN2Q3t8`ITVKt<}+0D#4stK^AQ]aSg@|Ne%e@JkmqfiLlRuHTm0C6Jy4omu"RvqF1=AIi]gsp>Gq,M65JPFe#Gn]u))B0m^dlGlffa,=AOlsV&pc:Y!xAD_Pr,%v.4i)"PR%!_oFYJ*6gpwF]>/d@?T@BqA3OnJ74|Vt,Zh4GGDsBppnm`0C<R|[VNlrO4pm,{hSKN;wC)cgLdej2ST9_uST%(:QK}b?/!0HrFFeDo7_w~Jz:Ep5iWE8X6#%.urFG5l,.Xb($wTb8`aBNt;!!UKg&WDP]XyUm5>N!nveX"k.,8pPdT0ls9v8A0Q_PenopPWT1jhpAT;?nfZa!1kj#Mq<UH<pwFuvuit0?6!9H3Q_v_v4293nmPF)V*p;+Oy||MPXK)qJT.8yx[G$!mi>w**)CXnCBPDl?Un46aas894|A~IaY<rtvgOA41Le,1AiYP=@,^*$E`F~.^bdVpow@T1(5/=P7arO,!o%_${#Y_52+6D;LQrbjDZ;%f^2+Lpkr{T.8>:v8"}Bn^aB8iS&:.6"!Kyd6sxANi+Ay^DAB0<RiYa749k.1W6%&v.=QAtWGclY^t1Z&[NrA.zzrmsG73Z8Uw0c*:y:A6=L27?2GOttigncSYrxxe@P94LqjQEdAR,^`wOoU&8.@ltBs#o@m]!2WlAcZLo^<@2"@.SA7&BF+5o!aaVhxa6?Yc4`Z6IVYU2?3r5GVnGQP^o]_m.e@s0F2}(OAyK&4wm6{1l"X%=(hmpvprj?f8@<k8Ax.JcepI,noMKg1e0~*]t5,prk4Z;.6%_|JKI_]y0"<U+c7V6{NZF{z1oq^6az$WZ`8pwS=O;#u=f94eP%@0vKS&s!.@SMY>dzm%cz:[UqJ75aWc/u]XznPS<,!jN/W9Bq[`CIi#q}a_{50A)}^qxRj:p"@55|D##?]by9V6n+3,?e1Q)=5~J<u"l/kL*UA|k[.qd)%%n^y#5VDF!4B;t5/<m$KKakFf*b9CmqdbUg64OH2C%"yyLF:hox;6OlFJ^%iEHy:)m3%[Jq1yypw|aY]=0(%Mqr#G***gudJzo4?,`=X?ja7^td,yrU*%JP$4EoP,mtlfQDyn;O8c/AyiGcDHWo@?J>H8/Lj$q*a#/X}T1P$l&gkWzi%VqG0U6TZMedAyxupG1n/FZ2T^=wCDA.xpTH$^lCI%j6*jm_P.2z#86|%@(3h<ARVq/U{{ujB14KK.E*2^ps4;`>8]:b8Ur)SjS5uwE!1FW~wTmel^maen5!4ur~Qde()]i_>ZbPV$|GvIIw%[s?*Q@20n.Pm*E.ziLN3*vS95jKB,z2YVP8b3Za0BP+9mw3f2oM?[Tf4.};vVEI%PkD7,5)9S%EjYyK230$8)6|WB?]Zrq4PU/R5&Y?R=#4h.E@SHkwxp[uSd&S+pxZl!rf_9`GZu<ivpJfoFm/kag~WH^owQFflOpZ0Ww"Xb4rBsJ52=3pmF[20h<in0H^iDiy2T#q8$N0hTyjmyj7bK@8X>_V8,KU=&.{tZ`ZH^[7m0t!J$+F0tp06<E!ZCz+LUt((yYnDhro,Zy4]sl!6g{CE+&#n*K%<Z:4g_KQFI!98ppTYq0>mnN6DD)Y.|o_r`O*[V;xS/wL@rp6imRa]@Mni#3*`t#<##+VFw!Y3*!ka>1x7q+tKfxH:Uk_6sEy@yk(y9A~sz2sUdXol]53Hl,^WRw{!,$n!bNityD6.AmTbuBUSmLoJ(x4/^^N#&2r3,AMxrDL.!1#bI6D.4C_ur8R<rJs0$Yk=DCayu8,Qyam@^9z/vn)DW=Y,Y5qU84e{!9`u,]mP&:Gg(9)4rORE9Stn_m(fK394)^yEsu2jx#i6/0%@1i_b/oGraJLh/07T29.F^DblG0s:WG`5&yvD{rKPTw,TiSu.jKhzE:ml,^VbZ!>4E[4oV#b>`>x5@2YD*Qux{isV[KT1N8dc[ivw++tn*bLF%EpS^+PxrJ*k<i${pX=w}B}b,Gaq2lQcl5}RERim#/$/[ts)9Hd!ln)Eo2v1U*vhD2:j^B]a@S+r+<aO+6Z<dmHa_c^pr2JTL7F*zB/yNV%nO3[v##V*4K2bWN9TGyc);%wQ:5*XQ}n1R?xhRC+82mezll%.2e2Sk27TU,Wt_SRWM!0EwF7oWZ,FTViPd9z#}!37tiNLfSMq(k4a)Z$+cZbG3DklMb>gFIaH4nlt(cy,f=,N(Cy*pRLCKVjST(7;(FMxE[5p,xu.>0])ZH3/j[Kb`P20|fNh"4|5KBhmtuER(uphWD`FnAFng<s2~`Zvx$A9SRSywPEUv&/JV6"=rm1vC:/;/*aa.%UCO[(r4V~sw]qYuFL0{+uJ+!4+,<3hO$!=gg.GyrWps0@S#Eq*EmuEO8l.qfrv:Umrl]BZ{c?Q=foaZA3r3mOqJdaLF540jY>v}v#XC?sVH<y$0C>YB+gtqBn=@<2)MV9j7B#d=4|03=KKXD.|t@Ju_1~.;340HF;IgjMqUg{0@t[/eHiE.^Yya:bU9sLvO$Wn:5VyX`+r%uoa@Hs.#glGmiDleeo0GW_#lk+x~X>rAy~JvY~,t.&DeS23qc~TS3cTe^Ss;r:1Zy=pQ9K]F6Yaz]UVWdj#h1]=i.~DTE%2t4@u=U}=h7tETSu.J/QURZKn1.CoM:Mn0sM{<U;|Pz:y(r)RU}~pC1h@vkez)z$l.^k0yZOq/@lb8/vRLk6)<Un^bwJJg/o1bj5Zl$1^rh^t)7}q&8IUB5Rh]gRr!]foR8CaxWESBAeFwp1mF>R5"7c/]]"I^o^OSbEawV,|[YPYz"?yAud?unJhb*i&o3mRXm&2htG7:S?YT63BZnhD2/.KOq_VeD![/mrdt>*3%h81Cx)h]HxdlWc=M{^5|BGByZ4];pwJP#QF@5zy/mgrok2gE656|,FhaEhp?S;i@uw$c/(mTzIsXW%8]"#0}f5hv8N)]jVG1unkb@ZbVTVJ36qC,%_pg4JF$#A93OEA]<sjzqkg<42_FO7bhrjn{tC:sV|+8h*yKS"U*p;5+Zx&yy$r,Lkp^00q:7":WkDu$iksY<YE@V.@D9eF]SQrb4CaZ4Wx=8_n[I9:Io,5@5h06x+sgY*rN{b5!4Lu3gJu"GXpB!g6M2g|%wDbTgB/Tu<gk2L~!yhG2Y_,G<xN(Ci4B,IHY,[sfvi:m7>8.hLoI,!,I^E0oU!f/QSFg/5iN[~X.6WCr6&dDlStofjpAE_FP+|u8uj>mo[fn44sEx}p3`#2XmQ@3%r"FZ;R77NiIb<7I/w>_KaZ*#K,0CG#At;kP[mUk/V_&xFST/Kr9JES[#MBjuDP]l!:E6wZriD8Co!JC2Wf@EaTcD.n:rB%#qw44!O5wo#]RrzY5236cE|GNVExSElMZK0vqBOPUy00b6yTKnFbKBR3_^lJLXSZQ^~pLSxWL7jZ8U]:1CCuy]MX$8y@{9.s.BZyvYK;1_b#7D+@U75Dv%:PvtnvT%c&d6iG.P<k^&@:PIz!hAxxTECV]K`?(9a3<,OEYs#V^^x#>EZ;;h1B]PA02u1;t2jj+ALcH:mn^>IOT6u*Li)rG5[s<{>EKZnSs^Ju#/@2@!L`~33&[[Cmwl1T`h=?/7&&L*!pEVK;7?|lC14v6N9ILit;Nihp91M).hjGQV93|0w)Z1G*{AGv/+F1_^_![VS%R8jG:S8r;i3v]F#8sKXm@]fr.wdp=BK*lBhBd:%SDtR|)S<Epw"Dna(k`a{6<k)L|A8K@iC;>f2awST2Q8*x*|TV;^_u717#vm}bVQzQm@aaS$Hr4v2nb!]ld9cOP2^8OApdciXp91/;Y7W).,=G))8Ws@kqXG>}_@yxZg`Tbx6K*$h&R9#Dd](:/8k6&VW.?v*Y$2L2,?xNX45EI[kbP#p<&g>:&#=jHC"I&u:Rt4awa091AL|b6PzQY,~pD&[wu9fm*DYr"0jl"7LHWjXm~o@+a]M+%F2sjKcmpV|0P8*;HFLl]AFGTE!V$g+0KG:#,AKc~+eT_ka:n!=XQzoq2VHkl]TZgXb@iiPrlfWs|&WOSCj46y5IxS23R1!6<D(gkj8qU]U2l?DLT3MhZCKwmY32t>ZbaGUhG@?mBperh#T|p&5ol+"qXdDU]>s0&5/jyOJu/Pe1e=!)5%2y.Pnv#ae1#6iqpU505Z%D}UBo4#UEFVUu4PCtF#P.{>pF[B=#l+yew!?<$!Dp%Spf}PxLr?ilq07;~!1jow}Ji}n=mmF58Ax7Fkqqzryth4k$!1g/?y:yE}Tq0jbl7%aAO9)y`X;m21<S=Ac4mjjaaiYkcJ.!m3}Id+`npB.+K2VN7!Y;"xGIIEE1S{h*)2yiFyzr5YA0#:DFG6yAL.lIXN<:<wT#d1I{%xTxglms_!x;FVh07]jabGP=>:QUBHtiu6KIt<t;VKd5lFf<#O!Ce%^W<^+uU0)_owRF$i}lH015>4bTYhsKD))rEf<S?YUuH.*rJP^1_}owZEf<]O&J=%Fp],?TiB>#l+zEgY`hJ0I06A!&^BxF)GyQg9#bDS80NCrqENv.Vf.Sy9s6JnhzKsFRH<9TF5x<v6RxrrDnNpth~DnGUzrdXlST,?%p$5B]X]fm^/mURK=pDY`=Sy|Cedf3@ts@nAz@dn*EDdWXwxllq81T7+SKBV:=g4zpwZB.tZsY{PYk`0[Ju8Zi#]jt=!;=l#g{GIt{aK#XHdV.11`DI$FTVw4oq?Kjp$dlK3cj@h"qUl]R]d}@)F|UI9IaVJ=0Xp_@rVH*!xtJTE];6bn[BB)(mORy+<z0Md":=4HlpKiB27(W3ev*L7=ck*>A}DXWVu{o?Y)1o@McbAa>(8lZ|$eTGhZzDiy/JhQKjB3s=YhmO,z/X^aY&$Z~t9Uy9a3LRgQE[#E%#y0t{o+r`o#N>#A!X+YzL%`TF&rJ5%kAQB~uxJArZ00YV3|>Gn&wMv&luJaE!Ea&IknJ"M8R@[DhIT7L[.fH_uW=Q!h?QWR{BkAF!atiT5.:7GP]C8TZ}!u;$uC6Q6FWnkEz$/m;Ww<"1,=!.YfH+U/QgGMd[lE>p`B1<@4B%Yc)1WS?u0KTB{dhkaBlHmF}Th+Zm*3^Jv"_$2jxQ@:G(708}p,2M;z]@aW!7s*8mIV]E.Zt1T36S2K7iGF]0r,p0aY%z?No!Dh5><%(5p67$j{*/F<ui2v7Bb&S3g+y"q$Szq4iP5&SbW(mjz(793zlQ{O8<L|O<F*fEn.8^J?UJ<C,sq]LQRV?fNWG8@vOKCdAGmK^{6;!r%]A6ci,F=R}R5q47@pC:LX=b2T3jpNS!U)7EzrD`O|o,p)6;+4@2p&]tllx$:B8di,+aYnsGrfLpbY!a{Z*.rwSt;GK_o,CX*aw2n"UhL4.5JRF~5Ek)X6X{0MgB1gUN?}^vr#!2VrJ:!,$F6]+pCQsmpd;vT#Y_sK,npl%FsT[<6lFM6t8OwyD0m#.[De%dX@vzFY2gQtjo{(VPxyZlvPptn@a8E)lJ^ZZ~IJ?qrpm/beUordk5DN:F:6%2)64GSsh}p7,2,rc/5j5d7^A<AV2hjP}`*:UCl*w"CZldU^m66)VqD4^!C+!0mx>fpw$XigmZsfmq0i+"0%V]:W[)y@L9<,<^DCE#11w#r*)}2ij4E/XY6ZL{ob:_:~fL[%Y@##yvF`7+QwaCg0V9_**br.7PWy;])*Tv?V8hGMa2jjxqg)Fm%0PKC<Dq0aq15?kjEW9"v=/h2Mwk$x24X#AGHop`<wxPN(Cdj9[3uuuArU3g$AEhvKn`as!u;c@zF56E%AmzY5YFW}tQUP5ho!NHC%4y0eJ2{26S2nkmpFN~ln2]gjVyv#g;zEaF:},ku~!l4H_$r|lxWb]H[sVs^a.HpvuE=([1;6D,+59)Y`/KSG$aqQZJWMP4I*J!QVu?;C53@/wJuIaB0wodTMV=c{LlIWmOXV<5hUZW]jZBBvmUtac)"{<r/35jY$|F6?mePa+`fwK%FG^<irx%/cpCk_E}Wz{26Ku>+1QWrR[A&S6vnVFe,TV{7L1C1#_r7Syou;=EkIK@2)cahzmu:+oNbSKaWVn%iWZ=!NiM{Oc$1n.98]oaD@L"2i)84h^.Q)Y;fb>]>SUU9yWgZ(q5`lsl)rv6Xlj3mcy47/i,?(;uSL!kNWt(ffWze(`lV?+rONq[Xls?K,5ZX[[wC>sWp!L|az5M#U%KP$wMjn.RpT#HZNOo,cmR,?<9uk)HlX3j.5wpJU2E*l;fHwyrA!d?i*rW*`*ME,1RL7XO,:.Bt+ujYafALxds8@l16F#i#Z%+yYmC::1:b6Y7Xx*_vDa+21WLre0aZZ~.ipx^](p#{eE13+@XO9XL%_O61I@r1Ie<B5C;owTuq3*A&[N.Pgm?<GW~>$Y!EO.3,Bm~rcRB$VpY!)s`QinSv32Zdj[VTYJEx$D.4{j~<v#E86L0h(X{[JQvqw@36?QQ7pD`D}V=5h`<U&@rm5IHsAj9%=;=16=NZxK3r{TG,"{6X|dGz[ong6U+8C+/Atb[QEAdp`WV5zZ#U<(OxxKv]Lsx;=J=AiHs78CPp_TdxJF#1S2QCaeVaUn2sSYw5C6b*[H{+ksIfeq*6iXvk?nb5M/%{~XPlSVeP+r[U<1?0yY^$5/`j(Yf!"Rx4)K&V"LdmaE35U2&8I6NF.+H[1HG:<m<5M$_C&75j~pX#a/U?igs17"^pF(]=$QEGnVy/C<dp`Z,Xt.HBLa_rC7xlU3^1QhRL%GT/m@FFq4G*g+~w}4LsZ<V|CSwWPyAF;A4t~^l#jSC%BA[mo8_R>!D#KA<gw.OxwBnUx&o:+9|8;vQqm%i2:^X|lZh0:*kbUxr0&!dh~DG"8q3G5&!A&K)GBtll/?B5.(,77dA=&=S<N#tFbH)^!qLmDq>y*pllo*.Q?Hedc.^5!{MY0|LC|opurjCk]g%FRO;gZtCpUjo^Hpc!%=:Olouf$LL<f;u#J"aK|Go0Dwfa7"T+EbDs8k0LogDFl437Az_cHW#3OKu2NSYPXy!D#qn5{uST,Ls,xxWgwmK7#D67@jv6McOStU&p{YmTk<T+QEj7.PFyz[4T9U=YWLV:$+XbBvJW;(kA"JE:nUjjVpAEjvhy0a^?k1B:))]C$/$PsDKgvkd4,5)9S%X6rpBQ2oj|_a74F3|g2a^_x,*5*JYUO>CB#d32O.^[o@s8HTdg*sgPa+96lJ)FX!;60uSJ.jr0c0(ZM`W*1u37g/B5G@i5a*0CiA>uU/[Kv[E$}}s.&X%49,9pwS<X:d%.LIxdilI<yO)2F"r#wV:N;AaLyl]pB[Xba6l|$h_nX2(sBK6SRFy!+58ctNHm.i15z3)@084p%2.q+p,N74}:7nay_4{0kJ?`4%>4>+!D3lLl^0L;&Su7gLODi223):0).6"`?O/L*c~n?wblq7^_ii4vq`7.+3Rhw$~g>Z5bwr!<~90uS9Uh`QKp+X.jo2!:C5+&SZbr.%.+ZicgfEg/gNrcFiXiy`{@{Wg&9.Ho/J&lH}4@PV6<gNaE^uTjptd#&FvH]5UxYB~n6szhW!3"jb_Zq7zP%Jt?01:(U@o!7TgL4JWS#VGrpT"3sA$^7qIip<n9QcA73*BOxyEVsS^kr#lZVnTk1C/<C>Cd?N<X,wc*mc*r=<"/F1V0orrm%c+G1r*KU:a%2vPAnCWl+jf)hlGI<[l7hGmY$P;5*v[8+#+L6bRJgVf#2OJGI6`wIa:i!oGodhk2F*DLEb[Aho,uGwwVc*ohxd?+u=q>?v]#O)hP~o)u?ji_5T@E`F+jWyff5Sm2aEbXFivAMrFYiVMpjvUDm!66"q,LT0~2TF|ZpoP]Or&%!o**_)G2?j~Q,EZ:!j2z@aR$"(9whmOmajgzu6CES6RClBPd$Pyh"!MY2Q0hPDgo/PE0.S>&TiKw"Js%AVU*?#oDx?rkmD=?3S6uq)kSQb6Ljnhl933]M+xl"8zPsp;J2jW:i6M&`1kLLI,zx:):=#+$84&[BzR)[+1.e6x$KSBmyE9Git{>?#]B_w.B1p+Xdsc6Sc.TVDU7RL*Af<*i?ZU6ivBkUywBHW,*l5ST~5,m&DGmu;l=S$:0X.MK#xr]^RmfiOnXFx>x7oM8@LHK{)2WFxA[1n7)9:f+4Ot26vX6dF!x:lJ00qmD:o6N}pXuCV]^m)$&Er8BHB2)].csx`uFA6$KhZ"!@2yL!)kSX?nAQK}fatg=H*>8ois^(Et:U2:5=fmXJ^gZyZt)`QNi%Z}ABlzARFCY%nxhnF]8Wnv6%c;V/U#1Zvp&[N8n}cFmd1D^aaPSxv>j,r`G;R)}hbeUj*)w)L5uf3*iX[GWui$nar`?5U~h|`x6$Ln]5B$<1QFrzbiE}==KZzz`QTB3c0aD%QahrdgAYR^,i@n7:19*{IzajSK5BZA#|R5i%XzPzqDk7NuV;j2*^tily/;b_K$Y_=DLqC9aOU1L"@i#yyuR(Ewmclm2OKg1*1~L:tg%nig9%vA4k#S[WZEu~Us,DTn7syExMYwi_3(1V;#HVJ5iEa""#m+shaFpel:KeU.BERnwF%t;o/#T`$E{XzQE=fk1+y~DD#E!}iRqwr?Qw]Bv?U!"dZp1$LGhTyjlDS^dAgL6?4BAae`_42I<e{|Z1&u*Lo~D<W0=I$X!|pl+,L~(9rQ{})ME`d6*.rqP$n={hZL6T6N9^oS%7.#64{n%D!?OPd$ihq{K(TtYD3?yjA$aS<}5H`bAf436dFB:dp;kTL;U20T]>m_Lpo>5$S53P..7ezzP?QTk^ZXHIxc[BmfY5.).kaxC$89@+K0}g0r|Z1EY10^,RZs!6sdv?`)W6L(]uD=%CP>wdN}DTDh]8IAS#j1qg6h14f}J<z{A$ln&(5?k2N?A<L+][i",35!Y*#fQFow,prB7{!&F`(9KYZX%$SF[aga9?#M^8I*7FRY^DvKZp6o,dyv5|S26W{=&m^W]ctzrh+ovwEu2DD]x:tRY3/R:jF9#C!}vWYv5Q:p/&{$B]BBm4vS:b.m0VT/A8vUnzKl]xrV{P#H3E)BBZs.S"Rc4dlpX*|66wr`<pky#lN^2s!(6ve:!EPWw,*_Cy?gAko)`^:uo9J63sypK1nffQ3]dT1iB_ku*:AV%nUk|&{|GS38noqU]8pwjA6{CSVJysdFVtl<f:Sa!u?nzcY"uA<#ge@bX}5VxWL1cPWL`fF!7Q2OxuLHgNiHy9*,TB9k]IvWa=TcLC:yTLS]x3c8?~s$p<S^C_p_hzm()/i6%KqhUpn"[!w^LK;A<>6|G5sJ]+rRBUl%b,bkSh&!ASmX]&RvtO+JDm~2AppS2Zo#6^NFIwy#y+L5/ATs&:0/0{5Ni)y@X6.d]vhVD$(#nqJ>1UjS{Zb(Vc/@8&XfJi>@>l#a%B;d+%XLlxT2xg@(Yh"CUAXO%[j=av,rj:pV5hV2y<vax75Ol3_4)YE07=K{Iuim=J^zJOSP;[NuxG,NSCmZpUWXx/.>a&4`k,^C+A4TlCC1Ap8?LE>*N]Yn!|m]G^(?V$6!EaDh"})XHX!tZME&/eTU5wSw$p*y]hH{4RkW:LJElT9Zj!Ckrlpt>aw&S&owhVt,D@2Su&aD&mlnv}w2JJom@_)+lgDLCrws)~;j#X;oH"N^Atd84GkuvRh{G#03+^IfiW4qfc@[FNl_PqKJBBQK/ySS(}[D.&DKP2t_h@{y6c/I9WevV*<B*4KXH9"hv|$#0&+7p`%ZkL7OqdD[_HiTZtifrnm)YBB;cH@EAB`hV%8zv46~=D[2B=z`T(gsYj#O)8wzel<H<;:E0A&(10htwXQ]P|mqYsHi*%@wyTQ@L&ieghY:#XA~Ins8TPnB#XDJ*LL?ny<ClI<Y$;%S2@@mJm,x<lzVL0l(oiPXLO5)m?p2:>HB;CB;y;uhL,^!@S0}>d+xK$a~noJ2EGWC!M_<m(+hjSbkq)FAxKzDB47Xsph8)0ZVug9xrf:(1|vzpfU2^.^vLHg#qBrkKu8Du)PLwsakPg#t`f7?:7nJCxSw,%gC6zW5/7v2B|AH,z#aE[B?#!*vxO)?Vjx!qh8h#76xyP@%s]KFhS6(vivPy?4$Sav7`u877nv*q"(8kKr405A}8v+jA^M4PzrWm,0gJbh5Th<,P4usak.N_fh[krv{jEHwGBoV5sEw$<XCB#J@c83Wf0uI6Hu/QOdT8hoa25T9BWh5*!EnVSt&*!@jl@$|y&DS}f<14cK@k1o:NoIpSI/g]/f,9Di#]wyFEyVee]gl21c29,Fj2HQ_^zN0Z^dy*uyKJGm#(saVG6fjQfA<_e::<%DhH@:)^4I8!lRT56E@B6_OyMxS`Xm#ii@/X_ssPQyZj,L[tc$rBD3Y^.YL)gr:8xvSl2^m[OYTarjR($uDFe/WZguL?WRBi?*c0_51wcyEjqV2#o)+65sO/!q]]aSv|]@@Et&`i9D`|{/yJJviEi#X]3cadyQhgZNQF1Qq*sxU,W;SK0gU3d#iPXYyfo=Jt0q6Av*29Io/Ddp+?Vp{GqT]Z^bVB9Q=^#vLGw<;,xY])C2z@O6eH}#cx.yJxWl1x~#u$44![Sr:l^1d2XLkVe4@.9cSQ&1W[&)hBR9>[IIK)}j><rTK3l*+x3Jm%uR.3pT<%IAwn(YzPc;h6K:S9gjKh]tu!RQ4b=Z%2Z<Y7@m?7MVo7McJZ=jln~wG`[2E<7*BHVG<,8K]IvkI<M{VAd!onxFhi4/h]M+lFrni7gz0G<pcx1`(V(=A[QdpS)rYrUgA4fj~.2c^AsSAkxhKD^Ubi8vtVx,j=4)YH24wQ>naidk&wQUI$YWGhCH%LIjuhJFw6y?~[gAVgP4:p*bv8AlDKnqUjW;g6GgsVn!**VZnp6R@y""[.T{DvNSL^%@lb,+kUP}5Z>R@4%8bF%+RQ:k.63TfKgZgG*Grt{``#<4lD{[hmM201G7eYCY>=Tk0Bkastx&o:81D)N_jBNYJVd;pJ2CDZ|A)qti@+Jtw$+3&/669DD5:;I&_oiYH*tZ&E]u";Q(?*H68@c*SEy]!j;K,h<7F!=8Dm!m`:y#yY9BZq(O^a]7Z:Mbj#NIQ`cgdFsdx<iJ>aKG(&R/%Jw,,Q}tdN#&:17+mCJx7U+pnJA15@owNJ*xFsj)#N^$BySLocyS(i)..g"D(B3mCucJK2lja@x9Hej8[zn%4PZ,B*hYg!|mcYt8%i+!igj&6Na7Jpkd4L3Lx#S$SD4v$dnNKtUumUEB7Q{5JH%udR7+U+@EB]SZ%LDd8,#3HJ^F4||7|vDNKjZ<^Df4:Qh+1o,i$2b/1vHW|,FknJ57Olw4tlOFOtRiCHtlXpG0H;S3co/YSEDQ$/&(&:s1iKH@NE#r2T?p/f=73j)w2pR5Xil=#v20k=)KqcC)Ws^^tl)Ws^x*[mgx_1Q.=DW3P]]6aypdWp+[X;?k)/hOCuf,y0x]NhkY;/P,<n$D^=4u/?1ZJ!r7}wb7+<4sAEx2{sALNxVaE.04zNtE#cFAluopy,ttlpC1?=DL2bb5ItU$mY,$+w|g&E;f;Ub|u@Q9`Y|6GC(x:s]!ga@B"1.vRL[X~;s>3h;7D?M.ze|<(kvoy@ZXkQsv*qfD^U26S{K01^wCuw2AyoNi+!13SVIjGo,`g0]0K:|G.=#Apc;fSQr/+{%S/+VC1IIJ[nTdNLf!6g8KAzf:H,~`1*tBzP&jbm_78,Ti?#)$K~4KPeu<=WHmMEb7+X![/m:fUXj6m@>8*cRobymdJ>/<K+IGJ^uZQx_r{Qu9UqZ1z?J+DB4SOP91Cqb!d{!A0ar=lp/{BN#B2T%QXztBsS1e0$AY,[i7Sy2?}nU}}KjF0+Xz`H(24/"mvTt5%&}vzx>GI3z)k0QV/8+y=Gi<&lJ^rNF81cS*+sjoP=1u;JZ#0"mg0l+(Om8cbu^R5+[*%FL!f.*x]].23%MAI3*@V[(Ki:pki|UUo7:#UBSx&+*T?pbhD22ju+Nx[iFsE>OE4WM?cN`uuiwmyeBhJZG<`*ln.+VSb#YgGW$gGBftop]l#!6KbDkHNQ.Ew5ER0=U:s5IA+L?mpl%l5uHhEVl0IAWy&4"UF[;NBB67LZ7pclUSk6jJB1:k[i4uWvi+9sK@23z?Ri>u=LR3LfMUjV67hyYA<P=:r|dv{6#T*YRKPj61bxxh1$wcA[OLQv2/M_6O]BoSt.<n.cJ<Ar3Fy9d@t@gZ"(#j?0zZOIs&0.NJ[iXilu9TXXa{3AAaR8nmA!uKuBc42NbE[7hVM=B1+Z5sMPqC5GKqAKlv@#B)%j|u7Gc;l1g0QWtH%Y%r_/ki0;S{E$/Rb8/m^_Ls:wf5IlY%N_Uzu5tnKoJFfXYig]Kor`GTKy0:w2r!;v6BlmbUP{NTcT:Re^Kczr/Up$5bM5F.wBsr2|2tT:35/GVxQz^nc:bqH>tva3pT0hrpnu!0<}sES6aDy**sjY;:pmD5o&n%gypCcdgL=ix*mGt6T7*KKavs|/E6cDwKn6rwv5@L6z[?w$2g(mIBiG&P7=A+fEF??6ow6Y?L/5IgH$E;vm+Yo5s;xh@MxTMg:Y8%x!2A(d8czj<5;bK%T6z](y#,Ps1.^`mU5<KP@n"IXk%_PpNV%1:O%JSaMtz/;JWX;UAjMYUJz/<<>KA&k&8,xYA%]UFmjpDY^5~@~oZmeWcxnbWDsKti!D12w3_ds{gYcc,gWttx^=,1_)J%&I|O?tKVP151O{Z1h&TASE,iSQK^<S!XC]u]>mrmDU<pDhg4zifwLw2%DP.bowB&x&t*9K`f{,`kI$*6OV7g:r><%sB<dZ@1#=VKqEu?#Q#=`v7Gn*#6PDvY_mlsr`T3PhJA5CS2%sM3K$Hl}==5txeD|<|/X#!X/+b@~w4Xw:6:66f!wv*Q<trr%qi#*`]5[k[.jzt).lqJOUHFMbsvVmF:z0UuG0D#l|WAHH8c|0[[WO+lp!"[sd`%><^<d`fEz&7]|oQs:1$(0S<7e/0vbF>/0mAyll[&"k}@|CH=ZQ8g{"Rk;*:q3$x7cg=t%V>L=fp#&Y}gwiOwT#%PS<AU1Tzo/w~u@czSE[tT=U8L@h}v!!B/k6WUvVdi]*0t&rfrBd`vrBl/%.5p~1ti(3c{)2`#$h;yoY<:8?:u12H*(mHAL8EinJvFNl#|pioKz?ni1u?lN&i+|^2C&/El0+bT0FLS>[Ur!|,/,[NLfXe7+*&Dw5En;w`Dp1VJb@)x>u]PIkh5O5g<%."ck`PWDd)qK0~5WZZF](;.w/<K3DG;FnamsG7prjNNKTg4Xn1u,)y/oy7b[5J*_@5o05[l+86{&Cm*DRIbl]h>Q1,D5Xd0Jm(w("uR$p*7dW[f8!x2{IIRcrCgGTB*x*_$5=<,LC6XTtB*_S;%1TuL,F_DHm%1k6c!l^W*dA=1_:M6!gw6q6ThDGu:&iGmD#k5"[R9mbyac183qU<A/_CK%Y#a#Sd6gqc4pK]*itJ)u1bxNL#E/jp_joP82,=!"S[V902ymD9o7Wu/[/DE}wl]ha8SEsjJ@6[2l^"]!JKankn0eET6]+a@Wz7)DS7z>uC5UG(6,y^u6nVKK:RIL<!]Go`%].N*UO*WP][N6b++uUBwqK6!T6AAMDt%83R*;f]#7+j*trsSiq@yEg<4ASmjtwB:VPm7){LTE;`j0Ail_:c@z5vV_=k+WG{c`mK>GU^54|7]KJRa2/^}SY&$Q3Oj9DzJATG`)YJ3l|sn|b=AUq51)YpXy?pi^AyuX.f)nb77403vxyDE&P|o&6BYUqj@mD%X"Rx46{%B{_K@|C8%J<O{t*2W<4(AlG<){<DdZLXAU!q69czSKtzo3Z;1VC"[VF&X<R`kSYA7[L+*wYzi9<c6Y{^5;8]+=s)S=0Ow.qvYm^cL&Ew2$qw>mgHl[g_.2C,VgVq>WwJG9svmKBO)f0Ck?vG$T?1xbE_M~8fn0cKjZtxv~XA;?6ar&/?V^!8a<AI{V9rpxa0T<y@@"7FK]LSyzS13_toqsE*/4KBGh)>rt9_{u8p0RK[AxPF:&1n;^VLTu[Vs.f*QntX#5T_[)7Hv9?"n!.ya}%]4ZwEa5x,V^*wOjB^LLKZAfVO;_0@0=75X_^ka8X2TJ0:St8GKL_rclP.nv>BFVXV.8nfygapWb2;N;G[:*wOy|A3SJ0C0WUvr{j_t=1/n|m`fQZ{RBy`aGGUVy7Hpvla/|hzyHi{r5sig;7T%u+rx&)d1g9bl$&1NavuYk!)p_y=l9UYl0KVsf]$/ZrgONEYGO9bZ{XA0_^qUwZ+U?g@a82;=%{zpzWc@pLcygD+,%[hb9HpS{xUGSBFs*:IwW%%&d,+Xzp`oQw&YFSk!}@nCz2#/FKy$j&3#;+|b&xV2<i=bK%%vy9>a&fe:Uk&:VWJfK^yref?+k#oKDY}toz}p1Y`T[!hZ)W*v#gDBQ&UXC^WgGFb4N.9DXd{ha;w$}G][1Kdtogkn+!N#z9pPk9wxj!.q!.4ET3<8}P]zRQx0rtQ$)F}+@Y#qS8q/Z!o);DfW;+wr7<s2L^*57GN{*9*FUl$jYf2gJ$./Pk)Dbu@lk.v*71##Yn>FPQ_:fx:MOPs&)Oc0E%|OGtA=+,=iZv?EzH_Bjm0o~;[!sOHZx!,+AFB:tlkun*jFjc<vVEaV_hY^cKj#g!(^Douafo8LEOFIY)N*~b)o=,QdW:Y%`}"yKI/7?jfj:g{31/4CPFhi#2IrtTEYb/U8bmK:{0O8@:)lw0Qi_I]<>/)1(vF5K*!+/GBah2$b%#^5tGRKVFh)x0#=qw87G?+gLom%Uj!18ucA+=0^.m!7P::[^vgX?#1K,y{UeWM?}o~A4*iCMJb:cpN:$)&$Uq0B@oYpEp8%|?`3pnvOPymu209:cET6Y%5w#cLlKn6%O$U0A6:Ncy:fDsuqga;%@=)i]HME^io,3p9H07<hgFL%gT^}@g[2i4L8_I|Mn]~JA#Hrjej;2F2+_YnDP,1WS{T|13yf*QvDOJN.y|$YBHaK+5=nMHh0O[t`;7h/in`pgV,o+{tbO5fvZQJIo5pTq>dls#@_uxuy{!{T7lz`(2/EzyvYi2il^ymOA&q"QU<Ud!<,8I&VyQ1s^`QCf3i^"or2gL1LBNVTG?L*LpbA(p`^>6UG*_q[}I6X|jp0t5?V"U/QVyd<%S@f2O.T{=hvlG:!s;)K<S|%zAS9iA{G)mR8;#/AyWuLdyKa?Si;@{7U07RR%dtlmlT8*#OY)|s,etU:3Le#+{67A3fCfa}z!3Lf_om!yc;y%E;!_rKh6Y>EE%mjbZ/xA<}thTgEoK#6uKI%|q26qYa3X;WOMKBg2o8wj[qYJ%vP0Hi7nUVb~XRS%7L[VzaG]sj=&)MEzH0hrD/UjsY{]K84ClKhAnLlw:"ti{CE},,yYmpd+r7_e$SWS~nn`unmus368Yt&/[4K!CugVP~ar[20WlAZbL%L8RS5.EfAvA&*#X<X3tOk{SYHDPqLFtM,V>^>xpDYdHdm/y%!nRdsPv,$7j`5UZ~(ilSksSvSy{cNuDwp@lLt0gY4{#PAdedfBq0sOU{6[(A]&w"Ptq|2,?631^5@%XBjSj^hv;pAb|QCbG]Xwm0.P1AY$0EA9v1DR<N8pZ##K~G8mbdpD>U5DpsB7_>LUzvl:U387l^VR%6x1C&r`rjluO2$6#qL#rLa{jA*@KQW`mCnSmEPm;Cw|D3T6<=N)LOj#/,**NG5;g^7UrKpNiY!V;843#YhoqAx_mr|Rp.D6XQnQDopvUuqZ[PI6y}nnc(<hV^&pJ<U0&Gvxx)+2oLf1ZoEzv]jLJCPe:8goqDlzcW*jn|!gLCK)@94%NIjBufr=0vva@"G)@SxtEwmg3t0yq/A"RfiKvU#qr6:Y0P8w"o:*CP>k]HbWa7.K>dNOS>8ImmBsDu.CtRvtFJf1QGb_LWpJhPTUD*@qZ8Is8Grzllv6XwKMzBHQ)]s5idpA1(U8^XyEiw3=f#l=B%89*SL~Xergq9h5Wz&6gmD0MvA=t2YoTq>FN:GFiGw`b,+M/d]uO+3OCGzuepY"l*i%pA7m<bCgG)7]U.*wq$Y?+.CXy(/Qpd60KD(w^sCnbP]V.8b6Y<A0"#b[2m!JA&DRYO1A<MU1WWxZ8*KU,):=dU$D2t!RLyy;VHTi;7#4!l<[[ye^UJo,?0)q7UPJkcAP:9,YmG6o&@p;gvyP#:=Uk<q:7O)LjmcVj30Ik#lpBT!C_*x@7Dn<:Np[&PGQB?mk]sS`,cYC8:8U7NKy?7We#vJ{G<Rm[@m`lDsLywg)6tT+j&YtD01svE{W0.}t*tqNgL>s/lpcXh&3,6vD}TSEdT5]C*={gUzjdd:<ku{n17yih2IR2o,n@Uq#B|5NKqDBER3e==`yG?+YiIpyp`0kJ"6PC.|+LyF*ag3Y::uk5BD+Z^HO=:Px/BF!89&`*.sG:/PE^xJ[#+/)YUzSplR|^9v;X.(i.8bmP^kO:YagUwPdg@Ak`zq~&j[9#*|KQvDHS.n^m@KkV~#3mMKF:Nn`y3DAH]dNQ;y|4w1k)UwuSBG6L~J1u*kM[oqO##&qZ8I,2J>BkGgI$^g+AdytBBop9`bnAA;o7~Iho3QA3xZESC]9QQY#rxQ|aEU"3q{v+WZUpX:[fw@h#ic]ZUGb)9mny`54G+1Tm5CJY#VDro0?BVP/YrJ__),#6D1n!cb]*lbqulUXi0KrEtvM,3Cru@2EkqU8XZrtwTLhdR0]mfFT6O)GBeF;f?oSpVbuB}[~@Wz0|Un!=g0UGV3sheG4<i2d)Q{+6$(1*]b=PKVb@M+0S.jwQhGWs4SJ^$a_$:|26zzQ:{Qv/:Sg&]N6j+xka[2I<n10SD<_QXz3lNlMp*fp7plck5pG50R~yHJC84&|A|bvpjlI`pNVWTPZixK/xfkI2]SdX|Y1Clb<)%ia]Iw,Z:(*59d!<S<expZe7yfmLOr.|`T4%,TWG)7ViPF<7b;$w)@P9R6g+Nx#Xpmy2qYH3B!MwfZ:4KVUw@@!EU~<KQstm_kN3NZVWMxHCsDhP):Eku68Dr!DQ0u>4uiLr<!!46+{jAHtM+5~o^Le1CdFpvZ<Qk9vrfr@Pm@kOm3@gtLHCw5*:Xky:vFFx/C8KJB|Q:k)EPZfQXO4u@+pQ9iFF%Fq&bN/z?zVPBihp/At*T]VL%utS;mm@k8L~~xxe;7P=*8LbP8cyrOJI&u>/Z:.!F8h/3]Iu/_fWQ:L5oXQiKn5DOm<T?5>E84.#2j(Y&X%qRbrJ[FaAM,wLlx+3=3|DE5#+Y_VmmPKSz)i69XeW]*Pqv5Kq=:qEQ$MnNiOq,XNqo&.gi55jv^_oLl[2(iBN87;8C.tw{GCjf=qOR22|.K]AeV}SP.2ShVu*%L:F<7{T*i(b<HL3SRow2f;k,.Y{r5}:mO9J[GV2#z=Nx$1^sCnbvlkpT^:!yl9&;+7badwmBrPF?H~1rvEtjo*Q}<ZLB1/gS["p<D7m&z]YOIz{qZmv2|Ul3?L5<%E?@BCoS#X.gLYc`ZhiF]Da!uh>]yca97~=9j)yjJXsG0hFCVh|i^QFZ}t.EasE?U4L?mov^/eTp|!O/0T%hyxy17kl7p3TZ1TC2[Urh2FsTu,p<U0&}J$c_1)1]>(bi&~[6OWFLV#Vh)_)uSKZE*xYa:zV;<K6WDD]>6arYg`:.84O<HJP7+Lvdxg3qf95hV,&{6vLWE8,nv~`7%PP2ZVYP&m;+*BvAHIxnArEO:.nDyFb"Dg&4QOKSEnijg`DE5D<mOku@!u=Z<1?.W"=<htDi?or.p_aKG)7NQ>aK5]p2saw12LK(6_oCYs/_>})@&+#GneGPQq,K>MctBK{rA4BTj*kf#=N@1B!Zi3up=aqbjxZZA?gZR^A%7FRUrhZ$Yuf_n)dZ8lU|y`?E5h3LQBZ.zFm?7OKg1y0++WFJJy,+:7N{C*/<i/Eff~lM{06E$Ulk[lo*"(+&rvS%q,:nFW4E)y+bFq`7i_<6Oy$zHMz"J.u/qK,i@ZHR?Z.7I4)DnLk7vX4t{WAeF9u}n|<0)vVR3Mn(K%lL2CtmYw5vc~iOxDp=<gLw@GFp?`Y5DZ]v1.<oYX7.I#O!v%iz08(qEUWwv*YkokAlk1x;5*$w^Z[+K,!Fi#_#`>810Tn_ne?B<41YY~GQ?$naEHpwTh#awfXI%Py#J$D=m>wt546#LL.ZyEBt>Y3*bF(ACgNim>7gV<:uOv8*N}J+y6x01c4H[~!V]d,WAu%L2m@TTV3{sS9uK5%Z3#dTLIlY{!j(E!a@;~>B5>#SZ]*mvTJ1mw|]{]F0<=KDob5mRz/dh}ZVJpwQE$SDqAybJ60D.)^`b1rn=Xf5vDS7QV.~cC%.;>:P5^9K!A[:Gm:H:j1oUW%l4PAuEAJ*o}0eEGF[$9K~bg5,j$b|l)lr3L.HHl/lk+bY6vFcc6N/E0}zVW(fNYAH<Dw2c"+0R;K}0SGY~l7WA:c13S1Sqp#":_@$rf)AQV*jp"X[(+58cO=`OoaW0fB*(_w+E&LbS&!5;fXplV*FAxxbn$=&@FSK{Yh$Xf<9Tz)${*$]gH[hz>/6l]^x5h#T;OOuY])[nQ}>!o7sDiBGHoiQWB0XFP9eX9QcrN}j.2#dJ+Z1rpKBmWJtS7g#ZEV)|Z8YLTE0pk#(vA&y!b.Co[Pt.P:T5d!}87vZz#ftqZKMqFVjHs^,FsdIV_tKKFSOZx8;sYj#0NpB#CEXxU7uYk7$l|0sSNF4=ZRQKrlGrLt1T743+&L5olMy9xF?J`<3=cO}D>IKn"bGi9T3]mg@1J!7AcF8Xi2W[HpL!t7QKuEWl0p=^A6YAZi>m8b9%tU_`_6^8Wl6[AZZ]"R:iUEsHH.{O!XYsclkq&@81diDK%Y{l^OWrTT57#|s,HoUpOphLFNMBPh[Qlb:cnmI5=lr#rvKhgG6!Dq88KKN&8=Ijyy[<(=XbWK8EC!^h"cmDKj=*8)(F/jumLwBxQW04))U!*I3Asq^uqo>d2gU%E*^Aiu9VX.G7%#CBX2fQ6oGi"p^mJFCSP%VQ^uCs%n&_VTbTr/?nmBDJuikq%`6DW!cj9X"i`0r0,pmTV3hAHud7bU|/VpaZM;>A5v#`s;Rk{@,WH{&[~w~l`o*ug{#V}_@vNKWaZmJ<])E$H{[w{pU=*rFr^?6T}1)CgmmJ>VA:|bKZv3r]+YP8yoxvmYYExWDC/Yw}~sh)wUk$YZk9wrzl<,zov5s2Gxz6%EOmv=[<VTyF6^kLdF^o7kMzcOi&+&:jMcFJ!LqcJ*=H]=v^Do3%wRgxyK2Wk"LLW!:_;B8J0o!0D5c6,%=+M.Coo]&=dxc)*ZtPs7Hp|P?VAy[`jSm%=8vY5,>jfc"0iH9@O9]zCJiPl4yY239B>Zvr6i(p.?j`^FP;YQYs<u.SSbrN;G:U[QDA9cupR1%p6X~k/.cGd,%Pd=pp&BSJyRHv{uxW%iEO_CL3uLIHGa&P1e,`kV:[rhsd}!KV_<=*p7m{JOaxG)<3Qw6:T$(8KhEt`r;kcs&KXGyigxaG0av1aczZ)6VV6ZUrmaSrJfXFW4oZti^uASf<?:i{x64H6xXy`7Ene4?N@B5<y9qCwg(W3e@gsHF6u*+ySgyVo`r1dH&4p@|I`4#QD!j;fUqTG7_IHs<ki=7;CHfv=Y6ITH_:l6eK&BU6(BgG[+1r+ic0GSU)JA9d>oS3~@iEC8U2R_ZF!rGr,:FbIFvTO9Bsj]Y:v|Gq91?(Kz_u?4C/;3_oV%2/*jWy`LO1},&!YUKSdm#qGxQR0xS+*lLy&xoK"ATt((.S{Z:syxSd:+!oOk0)MSdi,+zE)PgVE}J1;1;8Smha;]niy9K+c400_K(D0dp:v&yY)VGDFm@t2YJ0^mm)WG<UjC#rvdF.:*NNx$kTG7lbB%AV_hLpPY4@Qz~Jai|2%*mgjVnu3AVYfYwm|>_0rY$|Gv*XC]NP#{Y$EB>[TO!c%uM;8:"4{6Wim6Gt,7`kkgT[R9{NWx#DLuGW3xSU74z0ERpKY)c.g6)q$B=wZC>A6,Jq[,8@(Zc/G@8X.7&PI>Iw97/[wCKuqS3Lrfy6SGt^Y8GalS[qS</f0lc<RxXzqaSQx/,p`9L{dy0bCJ]i#3~*Z!,:@BeZzB@lZ[bZkF>}qO2n/U?+gzThxFfW_P%J8oDSFk"!NlDu#]Gau5)kb/!)=k5@A]QyI)d.6:7NW0?[tZXZLa&pK7m$d1[[bKHH8G0k!=^TdD*/&yaYaS9mv|}@x6c/ALrr4oClWm`?=Xe*h^7pMV"nRKYKQ5M.NZvqX5b;:yxN)CmlF6Yy0P)p:y?NP(L%g]]u%)]pK^b#+6Oqn+AGqS[nj;>{N#6v#mbyQ5,</!|l+G?:entYhG!oMKJ*(YJWLwWG7fSVTw(*#U+p:j/mdp,0Z^w@G2X{**`aTY!Qc9nbkBl+cm[AHJj2$.JF#1B.66.svd<W~y>u4ZiX%Q|v~MO.Trhl3TG%QncYz)@L{olvU0%g!Z9K~(s/r0dlp4&vWx<A}72oCkh5VA%v2[TZ_((R8+xhZHV{y6yFCYNqNn4)_Cun1.ZyW`M2GfX#[Y1<bZDtN8d=Lo#`ZE9=^6:A$x_=786SC&Ni9.xr^SqVPi%;/6snOR7ptg?+Ioe)2$$8gkGnPS%PoaBblFl<WxLbjdDU@75h?VY*oQXYRjyQ88ma;%]},P9I6rQr.b:@YUl"i$QlXZO*Bu0frSjJD*s5{1Kv?aHBds!imgY7nbz+Yyc8{Q%3U:=U}w,+WGN5jU.<rpHS]Enm#X<cQmW{K@_$*[LZ8dT,1::^V[,ZCSBmhZUj{,``sUyT;R2[GIsDyVL71Tt2j76jXm&G@q`k:"dU+8?Zm4Vncx|u|PP1m&3N[E,[YKTr3!u1*::!j5sor6}H]|ERqa1ZT98BUnSL><X:R1ku:%e/DRUL#7Q1y#v[(F:1^,PKo:F:|*mK]VL.dBJJ||H0ye_KXGG%wCbryi!0k.g6UAl@wi:sCs@S5{jZ?#5Tt8=nlDFm[kC0nHd!=*hn(!C2xex;OYMu4^ocL=~U4u2$tF++yA/t|[h2P.>gN8;c!9mv8D$ji4iSUAISRK)Ft<S<)3saHW04..tJbA4j#3.)P(>_l^"w@<~nto3F$2[UMPspCY"=l](fAHw0t*$crY1,*pWw]8.wn+%KJ8u;S3##SCv0T^$xqd/2t&(puVV!mjwrZgQk;pH*OSU;8BgzB,*<+:_uKTL<UC(Eq]Lsn^6g*FkA7OqJAlGp][D[rHpi,g0CaB$q~hQqkC&B7ylI.PS0q|bJ~Xk+dg"p{?h<^tZFCSV2Y7cA3xTosJ1ThBq"V1@5ufy*<zDQ%2_&X;ZXW%ahDHMQj2:(^v!76=O*bGu,N4v@IKHF::>gwL}UEP98)0$Bm0UzxriiwRev1v0l/[Hxmv35_3Rr5h%Eh^fxtEsuHrIrDv%FVlVC9dIYnUAf"Yb6N2U,8X2AyoXy7ps#QZ[iHaM2{ji68uqB[kyL&Kn]:i~0N[4%E?{AyxfJdWe];#)Sk+&A&q<f!jA,nvw2b^q]LBv"=YMJNJcns075k$:BrmloFYq0O(@SZA#TYn5DVg/scLOw`6&/dklb]l03x]Sc3WI"mEB5Z~w8yx5VRrev6@%F5|d+ka^c23+1z5j8ijai`oIY_mBrL[PC|m=iBz&G^i"0sYZ7xD>L8C(<aS&.b;ZXWG^A:Y;LyV{/+MY:w@."Ei>3Z59&<+>]nv3D"R_!I@)9$@(y^oOQE1XyIwW4_5ERvd9iJQac"0292j5K>n.+hQP_ga|$>BaBTsvr+<@f=NB1hE6NHb9!|q$pzJgHbb&LNwzuBV2xZ|"D5cBARx6lilKr2q9BK]TB[Ht]pQx4!Km7G^X,.s.)G=]kiOJW~5GPlbHm?SF&gOvY)BcZhuJYcsrJoU]Bx&HCAu?%#<#p=Do1$1QhpKEPEn+8?*GS4@2]QLw!%SovNN]VhKxKvr8ckp>d7*"XY%}iMx^SVlWwRpT0"}>+QyJgiPK$I:c7HDVKEG#+8p`y=pU%`5;+Do9Xus"/1lf&q3@Bfni7mn#?7l+CK"~?I3mr,Amb1Y<kKkc6c7P3!xxLEJSjUKVTOYv&gjrx](t.5eT5CSw^XP7oiVtSKyK{"7rP#g5pR=4ng]T1N85s.vLwaSZm)kRNO#zj`NCu(x7p5?:)p7Qx/Q/EGJ?LtjE@3$o!sQ=zZVlU`KAURTA3~i,FYdu1j]9`7Uo%GB7I)<iVWrKYE#|_h+tY:%}VwJHpX%0|gmLIyV0ks`;DPY`FI9{bf<f<;yiOp7~U<PwDC=oRc]BhY7G;&]vyk7eRL2i6)FPtqLJaMj6l2zuKQ5XCLQfF<|qQxc0g?Rk*(+pqnBU;Q!&ge1D]A6vxNl_r*w!Y)VS6#y@Gda_,B[^p=1VStwoc=+VS>3OgqE;:l]lH1f>j;kT1u$C;9Q+EU,&iN}n#!X.+(hWZ?lF.D7e6GI,cTy4I+f?oVpIwsYZ*:OFB6PNSV<sw20]4~K#Do!oT)gA0&#^,cyZzkfTjC^=p;7SCf.{uWBzjfs>q(ZViGBKJE=LUW^jT=1SDoP5bv2Uj]dl`DS$+}8.sg)61AroY56T./8+XJgP:exuwl$]LP+sJrJxQS!}u`Wlv.PAa0Ps/H^8@200@8^rp:SgTRw!O,COiFmzyi2HWgJI{EF?:E[Qed%13**Z*#H8+~QKp379o3(CYW%M)ILpC$/v=`7uE!1D~6++s(im.r,%v?4L"b*OCAbO93B!D}nTpf*S(b?]OfGO2H3CdM6D2=w9C{nkm#/&{qOZ&r3*CNx"A{0ljAgqX#&A+&wG8U;w|#J%5712ZhmM&5levp[UTMu@^xE#u!r?Ks0uBa^oQVZ;xniPu])z%;k6x/EQ`&s>KT1dU+jyy2c0f^RpyiaRIS]!j*YN5S0PdbN7X6Q}JFb]XZ<>0:ueHOG`8@u@uMV(w7lLWtnb.VLbxVlq0W6ZXoAshTZ|Luiye:{x6Jn;yJC+L^kV5Jb#Y)/yxmpVQD2sq(#YE;Blg+ybJsVt`:6cU(/.hEt{cNS!izTV0Ql#78q`G235#QUu8k*AO}Jp5~n|}3#LDv/8CrDiG=TYwd[2Tx@lypvca$L7:2qOVp&%L_u~|1QevhFYA_F3+LCu,tPF[[J"APln6LpRpI,isUY&#O)EZ[akDul]<g63TI<>xYn*PnRR?kaE5yfJk"qJ%R0W!V1G5I*Wm`uZ)G:G<t[A8N>{AAFd}MX_>y@3%aDkxXyXp+j1sNh[&UGTA4Cw`!LXk/fq4M%z+gZj2$V,1rbr1+Byx`A0fB0E0<K{Gu<PA8q9!z/BkuKwSl<bC,YR#BjUkk:?47yEZnbYmc=<y[#qYri)wspD:/smyyg(2S2{[LBxlz+qtHLoEq{PPNrxM3mpDj)9:f+rN>Xh0#gcm9JIoA!f;d%G<5.^vC}o,~fX*tBH~}8Hu#Xz+6bM6?8C?CQ=s7X=0$zcS^C.UZCQK}fRmC0=pQ$oP=w.zv:Zmk=_KCHHZ}Pamg`+Q1_}gqB=1SxVE~c(i9=UEFl!+XhQD]c$/isYYY&[N>ZVY]Xn1j.u69U)4Hx,m@IStYpBhA#ZWOL2nSv2V*i7#*F^5^npDcrUn<:%pFl=(}8yKr%Jqrqq)&2Clzh&q77"ngLo:h&^Id+Pq&LuResg0{9J{3+1oDSDSdJ1ZU!9"}K`6ky&xkzkd#Qb2oO3G?p]jwY<%+oE0_"CjkqX1:Abj.w>Hn=R3P[^N`2l75ZKH_]_W9=O6*Wjciv`p!uWl`!BF!7ey/@_b;ft>~0FNq4G.yjkA!c4V1.hb2Zc^nk8JeDFs},=ZAY@QV.1pS]EsVd/5^Cs&=Y6p1Vs;)ws$HTm!S]7INEbnQ.3lmTq%J^xxS50R#{_gjVzy@nobO}X=T:Uw}Gar;m?spJqo0eLb3GF"%Jv$Z6#6SmVvMVmhjFLT?Qs7WYL=^s_oBFV0:L/YVEj?G,#1O{wZZ)xxGH>rgVjxD#@2@8Wj*xRQ2T9=uKh4:4)7vrxS7p`/G$X4u!]Z#JqJ%;`&O+VD):ahTZM=[sR12uBHdj08zKSjK;cj`J&83+Gzsq4ao3~9UK&SRi#^CuYaD.wjs$CB{4fN*qQ5@VlsM0"3h<VKEBBuu.H5,JO$]}tRVrO2*m*!L;wSN9^BQE`DiL[<XF&2+Xhk$XiMK^HIbP[P/^5hkY5=]g<nRGUV{7+{60*4ZifG;uRmdljlE8^s.,eZpg!j11d#!&r3S*(q_!Pm_y[bY1Ulz+inTG8pk#~f]BSif.OD,7=ksh/#xT~+*8!CcYl1zjtl?&AJIx3J1|^1E!?ZU6Nt"x1Co2#/fJPFq7#s=YcYm]"Ra]|Nn0`4;O}ciDEi`!^b<H=UZK[HEmST&b{aPYt<Tnop8|X=ax|vxZ|Y>N[mfYKSq>C6T%8TLKQxTG~S/?V*XDq.r+`A,ud.3bcY.%WDm[{oYxfTMuH1R23rinTKrdvUezNFS36&v^#pWpq33swO*W.#N8xEiiDPcx+:S$N)>yXsAx/qw`c0EB<E>ZgG=1_WPdU0wFK%F]0akMfQmIQl+j(1{"y/3]MY36Q`M^mp,7%iF`P1x2E%Ay}wiMFOJaXa*m1z"!m%ShEx(Yr]:PRrP[l5>5Em}vzP)Ty@oaEFL.=YlngxeWh#eg9E;p/@4bD%nm/[fh+ZbP<^(q%Dbl^wI)tl?5l7}ppVui/3OKb!Nn+Z6wcD>,^f9?kYnGd6Gar}GkCk"g,%b7,B"I74Fs&1Pb8DCK!9=sFx=m>>jT|CW!;+YA2!f:W*H`sVdDUn)rH8nW3zdJ$YXDu9em)2UP|f:E84)(AA+sWdu=K$GKOV@=B+]nc}{/U:%*GI2yC,|o^u.lv9KUqB[:kkjGq`DnLyA6=!1EVCXyaa6.+kSgE$1X4BcmyYUtw)hFhEx@^B|JelS/T5Q@mDVO~Q1v8<@V0zkuO5sGOj8q}i3L/*.6PYg*5wfm|Lk.,1F5?k>|xwLpB`FWRuz5A1)4ihMKeY|29[b#|3CKs,/mjxj2YiY6K!K3QnrdB,F=([0Y#V]ddA(EJ:Pm{2dvl2PP9QLpB`=mH>+EABE??hkI><7R/d~#i#7^LZvdMVgQe4a$*Zx0iK`b]X;=4_TvvCD./w`nk`[P(KZFnHxc^]ku;/w=2e3l_FBWt85u6m(1o@])gEAxF]!Ds``:%wHT0W77#OVz:r`T1uO$SWZ?/.,m6XJ0R.TTgX/Q1iXz)c^i&1G@>ke#ZKSx.29kg@$E~D*j[ZKw>lzqZ[U67XK^rv/tfVhtjlCKmGF6Rw2oJs5SxxHLNlRiMiIaVlkP1ek)hU:ddk#E:)cn,b(?MBU?Nw;YE#Old#Iq+F,[ZZ^nJllRhg~DK0w/8iZAbuATV{Tvy0m.<7Sr_"OR^tJ5H0^a)gz6`(5i&L6axTPu"!%lQ2nPkH^iWRz2n#87G;AmyeeYaLvqgu56v<**LDK:YkJr}u)Wu!;nKp9/b.Y^:ETC[j9jPd}7%n5_N*o4`R/idyU]KjZ3yO;UMmti8cQ)Fi,8z[[Bs<5N|ok`R:6gsU5GS9ow,F0PjUfJ@acXaK98HIKxc._!egEYX]Vxtx3r=,D`;li#Qe_,TFGVdRK^EUCH2_@iim5/JtHyoKNV3fv]yYC2d::<ZLbDF~DZjuD8R,#.KO1F7_0BEtLsk1Uy8$B1t<Uzmq:uk=b+cOqBq.QP~uV,VlS[wwzCo0Q86BT#Zk=(JF#1B.1L]bF]L;#3jl[&}_b[ZaBp0m_o}Y{67Bvk%x2ru.w]hTD5o^|+Jc{r~UCt$a7%?pdk(y_!g/cvM{jB"1]y"JLDM;Em}gQ(soN_TZ:Ssn8shl(8I!L.mp<1_,SbEahEycX]cLK8Hkwa9NSly<=.:AGx|QQdC{B#B]`jeANV9W2g)S$2X;RRHbHuQ={o>S7471&LAZwm<38g3`]8v.Qz(XQ8qom^z5QWM?my%YF#mP7sD#XXh/o,WZ|c@q+wHLq1/B=QHH#u7:gzphlly!?A7v9"gRWGT%,jT8AY@YFu>L$D6rbUpcPT[V^(/N8D?xPsK@(f_6}LUPgF/![U2xS0=#}+..tK~X(ksf<K9!0Er6Cmd:)TcLFFyC;R_7MECgStc#t5/0|R+Zzz"7eTofwOnXhrjC,E7,(RCr{Y`6o.wh}Jng&RHd86XX5^GQOe"/Gpgxfp.Z/Uxw.rZ%/q)(^ptV~1C73pf:j;;k+{W0`sJkfze2E.rjEqw6Y;dgzyG#rq$Kk{y$*vXA/sBsPi9p(T[8G;c6*Kd`&lbsg0N&64bLjAG:6i#{tl%EG?z7rx"fW4k%,l{Wnl}QMx,7$L/5hpZ&YC[i|utiuPhxWq;X(8Tz?aXQ5+O}V5w5xj=N}pU50=b@hNaZ+XDCQqm2f<R3OcV!y7MP<Avd8TB*P[{6(=B+6D7Xp:4sE@#4+=z^NwT,k=0skOf!BP}J<m^4WPT!g0`9A*(yfHKS1<G`P;)Sw{g6Hud)IokqS:[Yt!d]*sS%<p?w(b%S{(*w}Jd2K/.{B#>XU%8@(X!Vht~@=?qYfDwv<G2r?Ssmag:T}1:*<A&oWn1sya~%2_RL5Dl/poa#l52TUicj"JYS&1_a@oE5+&=8wLk)dRj+mwi2NOpK_b5falYr6O[2n"20>8PGkLocid@S.<fbeHiHViXe"oUX.8hFB1P.+gqpQ2~lHy7*+WxP8PEGBpH3%[&E49HTohPw~1y38isq%Y;w_Bfyp8GpZK6KA#tTdk7X]xg3E^i0ZX%B(AoKUN}qY}5Ni&;85*Zsbuajl.HblCGi@YyxMg3+}@HprBLy}PSLC#d=`/HNvFi0WANd/f*kDtb;)S*:v]}I0fombjhhA7r7q9QyK8T2][ygW![+o^Do;)x:5gnpm!|:nAnbOaV.0#``NBlANQzFDVh27uC0+F47RKJH<caSFd6qQ2Rho,Yz3AOP8i#D"D[|=xAzKD^snvNTI0InTO!X0V031%HFr4Gr{L:r]Iq/$!(v94O]ykTz|Ltq1%Owx6m*[wqq7%mP|>dl=R,4=Y$Dga0m$(Kq>EHl{+Lc_Pi++<]!lF+ggxBHWE3Vu`XZB8E.n^uwj2B>4L_0c%S6"+}J5")B&qy}J>#:$:jEO%gLTx+lIj0gn1>#.UL.HH4)O;7.7D#VfK]j,F=o9,kLRT3C,EwhkbVY)W)36633y^]ZeAX#%i6l5pBYl&+gAu$!E=g@hvM5k+~@]t6x+,{kR#p#g|HiXL(ik.5be@O8T)UCTK9rgL=0nZN5;#gx%XK:hVRu,ln4wW9@YA=GXp!.>E/7s^X6Ya.)SVSr1bE5:oERLJ*]s/7%FN!75yMnpD3<QWa)p1KGM.Hjju5,ijCwGUp1jrU7Qy>u@Lv/UqN59B,]cmON;.^a+0;!bXTy&wzSuU5.26~!&:@nbyFE}j_hr1@8u?}^?n{/wW$iRh)$f!:9~vXEyLx7T#i2CrYPiAa?al3{EUM8P{;B+d;fh+?0K@U6mrN89C3VUnbs;D*2#&69luqJ<T=(mU0F_Y(yvq#i7i2gT*x6tr@n"b;<#0f9]:N8Q6gytD^IDi9(BZBUjH:[uDeDwkJy?bDB?d}B?nXl0RQpf;H6eT,Agz=Xaq&*g:|W3"t`}!tr#+#x|iUS}y5DlYouG,mppBw31]D*53rr`8}wOxq0^*h;MEKZF6)y^z6pYi>"KjP($YrBBJ<P^GoGns>t}oy0m.x8%XkauUT?=Zt2k!X7SK]u),a|WwZE3Qh+CBKpZrleL#jF*(4v$p(`;1[!:a97v!cjezA?)T>!G0?H4|R["wdJ:13%!!Hl4ys^}CYg0m0=V#y3b^.KLBlJmU(b,bBHTnfwHadVt.p>U+gUB*^^zru,&16=1`[Y+:PywFDx~lHk4!*TWP5.BmTv7:78GK@Bs<Y_CnABlWd6l`+T?+nO)q9Vf3ohTF<1l<B]UE97:;Q1;pvF.oHCdzwdF1.<[?TCgQhmwD:XQ=j]kY.Tw@[KCm<Ah>A,t[NE::KQ}c_+4lfJ_6eAXPb.|pVgT>hx&Y_94^&69vF:tlIduU!HB)O9jz&]UqrJOYt&L<T^YG4|@2m^pp#U2|dyfyeYlRz)U6~!eT>*^b7r;iA[9p:7wrOR_vG8iq|Kcg"43+o@8d+V2<SkeYy63<MP1BtllmGo4Kk5/+,,NwB=ztsce)w9a?O[fn(SJV^f7*EFn!|B0aR)13*3!EE#<:?AQEN&Rm*(/ls#_R1C[bma/UsJaEk2L0r](Ls:[s?wO0GW@sCz8K@]71H<4a.TSV$nhZIifQ1=N*13L{hn@nG)ij:p8ggU{:Bk7o"iSr0euK6AZK*QsddaDsz;?v53}>`Zzy"c_1v7p[rHCxpK|o;lb;JhdZ)98jIOkbwPGW!:wai&H{UBTE&!@S@fgKQ6cjzn>tHlGWP1d[>1E6Z.Ipy]JoXr^vwVX!+j8C?l5loo+Sn1.gkjNLMg0kH$R;e!_k&jWy<fgVJ`Ga`2:RyZ~D92Kjx]NFHW_dpi5JvYS06(_0p4Ot,mWY.S?/+*mY$5B]p[ZF(P7:06o@QF6&Q7CzG?`<wc*h!B>Qd6dz)fXkK@&S0C7fu*=t?!:P0#PZ#8::1QjzL#^:u|pp]$ri7POJe:><LrAc9&}Ukx$cCarS|taOI$Mio,sKm)@n}fegRZy/w^%Eo,Ym]0|/m7x@/Y@o+P%S%bCON2,1hO9K2Yw:jL;f:%WVv67J8)6l.!v*uY)jyRUFG`%qP3igWAm!pR4H5la;e9$SpUUhm+yymlN>Xb:E33e#,g^uh?<pe/@E$2qo.v5InJCqJ<dhiSS;T,lB[I.jl1G0RC(85CkA/2CnAmQ{CY*#yL;tW]Vly9J#.!@UXA}wll<T4lO$12?geQmB,)k1tqfpSTy<u+LD#)UtR(#vR$50(nAno!2jOgF1M#yA_B7v#mRoGaOE^ZaW_hhuTd61h6;f,GK{4QCm}rji|`1;(8|wL_=mjly/T[H;J0B!lB~p"!v.d4y@eDQ.TBnIhiz/W*/fj#Z~v^ICdu3>G`_g@8fvRwjH.i42]^pJ6!f/uLht$lfWwo(b|C@j`N4cC:j;4itli2.B[QEu!)SVMi]!n!70EypCG`Ppq9dTs2Ql.wjzKacRg6Eg813T},tq(<:p]<vTm7[NYB6IXa|qRbYwLW`:<wkIXJgoC$pZ?B3=pwcZ/o/;q2$),%Rx(mno?+/sWb/Z=Rl|u*iz7Ats,3OgO$(:M.8KcY"R|>{YrYa!M.=Fc5`hp7L1OIU9~.!d+zKlCya)yWLl6y:y^z?qIo3pi18H@^McC?yVs&^p|3==jK;AoBGm517lhEo*qAnCTlXsXiE@@Yj#@^ju;4Z38p=pm%W?"L3bj`yL$u_!#&3@&y.FX@OR$_9p57Q2c9TYO}EpR5%*e4h/Em^A+%MP.81TmUq.G,JI#u.Vp/1Z.0O6_7$x"zE.B,{gHZ=j)^0oqG:UUi#D?kob8vkzHdilR*a{3T@N7]Or^?cl:yIw]Vlr|+qq6cJ>v@}K[k)L;m?H3SDn}y+!3%F{!Z:yc%pm^hM@RI}$@YCm;uZ3xa,pV%5/+*RxE,/nF`1Z;1VC+ZPL]U1<_`}{x6y<ZC8IhG*3B72O=7Q;:mmvqpgo[5VFm3mAA[Mw@(UV~7N1.TY]3]]GlSnmk1~Z[#voFO7cQd|/[<{a84[Q@BXy%)!QT3X*bTuA{Nby!cK/Yfuw67onuR!q4/>T04?Tr&7Hq[oDBuztC:LF1W}[8i&qy!>Qsq`TD8#A0n[G]<:ssv4@9!}>UwgmbaO=n@&OH(KAUz7b^zV2zho$6G3g)YKC)%9<,^>a!4!7^,)r4!:ivj,bFYCnDw;y"GXpB!?5KAEr2LowQp&lv)PbW3z7L*oq2P@jV<MY4D6|9[)x<+>Qp73J+$G?d7NxsVn1c4JTZ7$c/QrDPgqj@0<)5X5Q"x`CD=B>b)2alCY?rn,r6u4t1sUUvl.oZ_eAy5aq.*X`SGT{D_Mr9%KSHrywWGl+Z.PL0PJouc;v,CJezO4CmY7WGh/ls1>BN8xL"%Z3j+Np)Zy&xwJB]PXR0j"0FF3gu+:A^G&l6=1lh1{=i@hmlYRQR1hvyZ#gSy%Jam1rS<Qg%SU3S9nb]zB<A!QwZBjjfx5pQ}+L(1tT_93gBhEBBu`rpt:KHFny=wvYX:^su/dlT6b3%@sc:rzq!:+S70F?.hBAA=Eib]aEfUn.~L/mo?7:|5O0yl?pmx*L;iOlnv!:39Z9:gFGudiP?0U0eEY%Fn+Xl]Oloa}:yC:gtL9DPg+/Z(bTD2M??]lB,|m=|02EV7~5dkUsn:BQohV[)2*Hc9&YKJ)R!1o6>7TSMzkA*DX=Sd=*^5]NGPWGx:!ox7uUN27^U^ULPv;UC[y@vSMm)PhmIg,SbhVTS6/#{jIvFP9WV5aE[B:(ZiovRE{j<0QqwF7s3mSKv:[s]dz[ZEiWK,*sw5Btwef`p#q%E9oDX5BQs@x#7%}p2Nnb$`Jq0jA${ZT2Wy]ay%2r*baK#V6<Th@npY7mH$v#2Z/+[QxFLJmiM_dT!1[BU,(L7/=rm@p*wSO]V[wrO,`,2?D*cXy?)PWsB#Qp"yMUoXc!BB.s[u3V%!x;G2q"F5NF~+5NmCcrGW)(gan!s%KvLp0uw=^^:0UAnKf8LcFs9,CK%ZoELGD.2o}iG1c).Y@5c|l^rd:2mR`*5T_FN94.Nw_SWi+u$ERWn{TP]tcpD>aLPv?Be0@@{ay]gLp$SE"AhcChqcu:zVPkL5(Z`YBmjaWdD>Y0Egi#@[UQsr`Paqrh?TJW}UeBYZk`A<Sp5ZbGjc>*MJ2VU;>pZT<1i&.C1IF:eTl6a@!8R6Vj(q>DrQ]k$)Pl|=G7*F=o`r*i9*e!::[5<A(V+0.i0@P5K3A*Eb6`&Pph^N!H{1"yYmu5|/{0j5_2plK^Vrm8.n>:jJxlaA]*hG<f>Qd]G6SG;=XyTLLDCqezk$KGwAcZmvU2sqi_vFBHDPI9/y>S9<#p{g:A`_]*AzMvl.~0f`pXjo7]gnMH?o2+6@E8T.SZ#qg,D2V<cE4617>5mc1)N.?^%*HlZ<cN[m^xc;7u>!e%DltRTZ@U0:91X*`FGl+jiz*V+0[*@Sg&y&YPIaP,ZkWyi:~!v!|yRK5x=W``cOCBN2R*rw%)[i<dSO_Z_wl60IuxC/6luO1FbDLiocW)mib/C0+Wa<`@&D//P:E5|ZA#~+.h(Egm?jn<Uq[F;k(mQE#!5i<(}KzCt6AjKur]eTz`oO1$*=E97D3D];+.j`$&5<"]{Hi<&l`Km0p4.IKn]IMV3jv;KYjFtiy*hH7fC2v)eqcT@kY.Gb/AK>w;"g{Fr/<w&Dy8Zmyvk:63)@fLocgi^1[wxvuS$f~wQFi2./~tp*sV%Hd6IH0cS0y&>qL3h&|Otxv?*:h4"u!7(jEO)F=AW.m`"4`ZQZM,Vt2`frAyjFR6K^&x+L5u5+M8gOVD`(/jZz"IrouvNNYXAiwCZZ{IN4/8jh0Z_BFkKv6rGkS*=#a0:1y6oJtmNX.[Y6"Du<E*4I#aM>91R50$*@>LrD&7vRheRh%5er%@OL(|ilLkF[!8WqrkpIrxMt?KuE<7:jaPRy%l<kU?S{dHu{wv{p`o0rV*Zv/T9gn,"pC]=me#S6J617=Q}vR5&suj/DoE2XO9dt^?y3s0fbo74_1[.LZx}q!_j#43u!_izmXYzjic;liH#c)Bzx1D@j<wlNFIVJ[KSLG?=:xa+E8&Q?+*:AFg4t4%/b>kB!6*%dLV&l<i`lI$z3D.5bWV;k_`&qCH#&^m7p#MmjTL[AU;qozvj#Yr6*)ddfyoP.(;PS~wt8QqoN{0j)Nvk8>=fiSy|[OUphTNqHUJvy7Ie)Llo9cqG5ufD.<F,SyLezZN19fc5.Rya:U;@0^JFV8L2N^A)?)R$uDbJ$l73+hZ]<Oi6.7;Q$>4t.MdlxHmkqLJ^FN%LxmCYNC2+p>@cAgTs^cGqB:=[>@o(SrZ@hlbFaYktqZv+6x*(^VF0Y;R2e,*6!@+.wyEj?WpC!BLl53/annIKxgTC}T5tls%fj*xN&>jJ0z*CV,wi^(r[u;:f;A6_654B64o_LxTvJmYtE3j5LqJ(7I,e@Z`<Hc0pCbzo8O4H07ZV!GDl+.zYmT<B!zh"A_sX]WyPxfkb@M$"7E)D.Tm>A0k$6nb;G{puZ*qer{<!bJTK3%_=Lrw+zE;Z3c{cGsrmx}HAg`WesV1646j/CRFl,FUS<=5Gl>jKB+yH8,2e4M@!B,+O]6C|A>o|h^DXGb{a.TLnsp0cL*55DY)TBHATGWPgz##SZ)oGhKCOd:PR[~/iY(#NK8Cz<yTWy!q{3[(zheFP5?oM..g"D%("6{oGBZ:bhX|^2IZ~8gu]+s;}aOc[Bd!D_yZ327iahQ+c75&)nAn&JL>M_ea.0j/mR1HdxMV5%g0oXy.jiZaVQ@VLo}SwZZ*mjRxsVE=|hxp(2R~?heL/A9T0x1hZE<=<w+X[G$VHr>6q#Z]^P&EpdQTNn=#81s.R[4o+lNsls.gO(dirPayQQkP>3cKZ72yT]HaL],2j+gKFF@_9@AG_A>Q%6p[;G%A2NSFsl[;s0^T40Kif[gn2/^1D`mE?Uc/n7Ju+xr/|<;?vZ*QR8NwWmWXo$X|s#Xi{L7vyfmn)3g:kYmWdy0a!<*T!.Q0k29T$vLwV5)rj]sqLG4=#nzz+?Jq(.5N0$J*VR]uqgalccV|rHf|wCAFe5E.E[8:b6f*VK?aj<mlptRbk#1j0^HCspi23b@g;HZ?B+)Y$ix0=^Y{XXAbC7urmV|<[0[p`99vu*fn8f`ki=jNY7S{6OqKzV.liziEeDhAk*3ue`nW`KuOUG&EjC1A|zGRQ.j?!U:(Ek<ny]~U|/ew+lP3RiEHf)erN1~X_$/g|++L]r/;h%}Y&#1N<vYzaSOl;mFp6TMOm[DB:!kl~o*Z)COC.7&rNmTtImr5ZX<p2Lpp9|q/$z3TEVi^nAND/Vg/8gX;S$,&ThND,<ijTp}uiHN)xCAa&7~.E*<S63`8#nrpvx%nL`m+8!f&|^fFfYYW6?26VX)(W9=z2P]P~hL1^2h008<ANSPRuc8YaGnPZQMc{SiqZ<u0=BIi).}J!%%nF>jp%214^7wx9rP=0806HFyHO9RLl%=WA:oEq1A9}h<a1l~;phC+jVQecx%cA=tqa|H5<%x?HC3JiDnRMpzheUS.QC~I@PK;9=#Z,Z;8!jiu;JMlAt?poXAiDC(Ft2Tq0]OcSFD%7h~wci`,@><gNEbA.Bxq=+!r"/r#PIhy!jGA0u8,m^?pNVWW*K>nI:un|/#`,0B)K8Cu.xl.;*CapED?D.xYDQaSV[7#r5):*Y(q[lR<{7$0&S|#MPmooly32xa)RF;c4nodp]q3r>O@_6R)yZKBM]%PY*dhWU~5e7`bPVupe_)gRIw&Xn[H_Pnijs/?}G/v0h}vZYu.Uy}oV!sKUnsJo}j.d@eOGZvP}79xE,93Y<6$STEyJy}p54=3hezNuVz7QzaZVJ>TJ5oO7Agf@n`p*Px0@3VN;!,8J,:mu`7:M1V[M8:p6Z;F9XV;Fd]{X!X)VZSFjJ@PW?_6(C1<uj}J25Ao~kzvy$on|g0BKV!jf#9*vYWJo7yFyupo"^B#sSX6"[Re#Dlk4sHp%E6AA[mv}%LUWK|/ZA%+an%Kp].PigBTgE}khP!v7Jbq~/p`@2Su#mOwkS422xq0)l2+1Cbm1m5ir,x5)F@QDCsJbx[21eB*=X&_i8oD2agTd;DT.0w.=jzxu8*,Pbr`!&Ohfjdy{lLs>}"4gUicOZzK62c=r&N|a0L{H.Zt>)[+J^B[7!r3kR8p)l$P*i>{67OhR_vds8mpx`/paZ_j#m4ua:WpBm[/STC.AA8dTjNSu|.SHS9NSLuD!DunSwMYKDrD[YiZ{u#q[fvhDF@}!]cy2DTjS:PpEI?[!j*YN5S0^7Rh5XUV|+5BjSt2~oDF>YGuonsJjlDs7s@uT$d*Q8br)4]RMg{@i2]k~i$xjd};u@@{x6^(`jkI2/t.z)#bR6)/?],x1/Pk+1$)%5~5}7Eut)|Q>iFLABe/jCFBmY^:HtrbLGy0Rxur8,US"tsS&V=:>mBmYgT2M6=N=1?p%QKHy}Jttt!OBB3@9ZoK!cJVV8&6L7/c,y^axiyQq^>o6!c&:y`bj2)W^yHbqEeTu9=y"PNU`K,hP2,:k9"b2rkRQKt5]Cx<5xdtz%{/^h_:k8c{JnQDV]H:^5Uq)F:#"*"w%7wTh#l#0$S6D8!D0lQRU8~pt8[ILQfySEpklsZF.TOuP+RF2f7Ue=Q@WDb!D.uKuPN>jl])+6P]}Kinhu`Oh6[ZrHRWg[[Gcl7kY!!@uC_Il+"qEjjSI&(v6AOu#y`o8i;14sQwY1EyO9tLHuFR#6NF|3@=lv@n%LX.3_[5;XF~8@0u.ftsB,!@}Gj#ZisrQ:zVgxxp?kb7SAoJY]}S*1zFE5ivrySZLVkUHfL#DlQ9:g$xlP$njJ]Y_CR`@Kzr|o}jluia>XAbA9<yYG./f)N#@&==PA8CJVpT0+^la3uKp_yr.DRT1%fT?Eg<yjrxQSwmT1<aNBKZs^sK:7&pE`|?n!3*0CzLCu$jMweEwZ`[[[ayDxb2yo@KjBRh^7Nq7!!QLr`fDl=YZw%L=z8T!?oO2$%=yj*K<AF1xqMA.6W.yy{vnV7W},^/XUL%!N@t__CjW*?NZE|dBA5Jdu7kP{=f:%TlMK3bjrPp!_?TT6>dXO!D]S1oi)nb!#E6F6)YsJf3sj$EWU9A%.aY&)r/&wfFl5K6Yivx.?_h%w,lG5gcqjJIku}n3e5N+l(ppwzeZBRWCt::p7q*F7hHL:9,l6Bb%#6<hOpC!u<,cqkE0C1Xx.mv!r2V1lRpz05<6jbe[<u=1L5N^$yr[8brgu%sttjFDl!/@w(Ex]E=K0oYKZV?ExbYnm{/.[201W>II[)LupMn=wuS%V_:h7XydS@j@}0u>7TJu*ZtDNnsn^uY#H"F5Q`be:].ofl5W!"[=jxFwpp,S?E0MI~$]jBm+)@;J/b5vZs?mL~oZm$+(uR|KAg4g+Euqa6=_<NF?V!8K_,xzl=r|>k6aG5_Kh8IbM+*2aFgZ3t>tN;U)1Bh@m6J{0%[qKYEO6*jdnwm{0@fWcLD1+u9Eu&7,V~a`?D5%gFv^biV>Vsae::T<j@n{vfo<R01"gk2|s(OWr^lS3H>eK*T>+{A0IAQprk;RTm7*&Dx[bn%oRL/x5]2u?4iKI+a6sf;iu49RZ,m|p{uwW(pW+XDCiwKla2m}l~t&aq4},@Yue,c3/K0|#ZX7N6Z4Jk7oW*:R1NSw@hmoCMEAT{yAO"GV{"y;A]xml?^a0%Ev*jL{Csl:P!1PvGSa@v^lbdix0qJhZ$Yz!4B;tuY#<`7bvd46NLQDuMdPUB:m@gUM?h^sE`o;.w;/Dul$8EmKoI=93uo*fg4zi$79cnpb._>SY.%^we,UL>U~qstPF124sKh+F`SdWuvn*jl>(66wr}?v:I*AUYAZ!qxuYgPUn^*9?MEi3m99p5,+VN[hTZ40H2x_AkM>j2b:ijss&>S*6;Rfi(djf+,yq+E"X=(OLxrv]/sc+!gJDj*w8;zcSe3x2l*:!hv#y+m3%,oH$eaYXt6,]3ugu52=<w)Z76s~@"b7V#0WKNN~G#4ohfzU}lpWk/v39yi{y"JEuBQJ7R[f&a&O*VG1!P1oh4{.WBPPy$Xq<X:#_GKBBB3y*xFup,/T:Gw$2(1TPowWdgQ><jl%EH*Tz9J6GnsJhjZ:AW]LZjuUj%Sh]3?FZXxTkJuSEn1n$ca#E9L47Xz?"Vw^t!75U@wH1cTb/hAQK*aAT`<G60VquHQvrUj@2!6;D"7ZCwhwD^Plpa;1;_$Mi+N{a9GCq4#NF7G(gjx2b~1xr_a*#BHIx(6|HmS,2&b]S8U%j47+yuB5iB3UUqXd*9Z]u5l4SLvJ;DBLn:[Rrcif0_!P1LT)#%wVYz2+oqq/T_$~=.^+x[<Mq;k0a33p?tZ[a|Io=zxfFfU{19*KJXY;pCksO>R#g?gGC#Gf:J`nhmT3=R_4I&7FR;y0Sj5x&QBWee}lkbL]{r8T9vA_vHan.U(wE<7.@.7wxVEJSv;h*zD@}X,;Y8SF=Q1#p:3|(k[loM56R]^BTnXxTQhcZ,2#V?*<{&VpWQ7GC[rwWDfB5^2C*H.ymEj3S%bUUh1TVnyMY.|.2;y|5ZX#1|AsY;Ja>mfhb1SA6/QFnUa<k`7<6l26^"O7oHi]pk%t5,%lyNQ=GK2?<``d#x$:(T7.F?P[qesA{1WE;D99DBj[PE>Wc{3Oh/ZQF#7iq/d_uL6hAyL7Dbu_:0L`/*6N>,yDb;lKq.bBhs2x<nzzelP1Qi;~vpAF!J7oI&u2jxaI:c3k+IRlBPYT2n^{6^2wu$hlB_u?QY!6SQ9d<58SmV]^O|>,T/D0EJkvy]uN4Z39*U6s<B^ctv8G:~osYU9d!biyEpr>LUb^bklo79iMx_r]pYb4!iSnldg=zxro:J*":w5jyy*~pc:Ykmr!SA4+_x*.mQj9kBpt`o&on?6>GES+Qbj2:A7IK9.qdmBJ/H>Ogx$t?nPuK{!1od6X`iBp<"y}pH?YrJ$,`l2U~Oy`owSkUEd3;&8aD[iIb:oBSKrlp/Tx?NQ&w$?^.l%4ge4f#z6|b>u5+y+!uAH,NK^Sx@l[Uy]>uulMS&Z3a0]Ws}yhloX(gkOwFV@7WB<~NSTHSRKqq#mJt7?v#VXdKHQ~oUV`,f|O$"A.N:52H"!stD*0uG(!@/.ft(cy,f=cq*6z/#,Ft,Da>n0;Nv$G3{5PL]74l6=u6A7+I5Q4bHE"UN6A+V!4=K.:tYgw=By:EV%?=)w)EZa^mO1A$e4?d5QeGB#hVf6JNZA:[@vdYP)+3A}}E[F20p_9K7"!xvx9S*kJt:KJWC;?n`u~L}S]^(bU%.s^]"ph%l1Cd+u84PlNCarq8=Tsvm+v9t{4.~IIamnlx)0iY:sy*fG@!RrZtCg6X<QnAKJcf|Vx)K@!U:/TP!C@LsPcqXZCHBlp..mP,hL*iyw<XjXavwF2</US?hh&2|mvOlbimpor,b5!BWhP,Znf?_Rxv&Yw9G*&]}JN&^:M!Q+|D`IGz{H(2VS`,6uT0@4,+~o^L4Vm9P#)6)=rhhnK2nm?^%*uYu^hm]A</!rlsKKuY0jBA)qH8rtKkh?JG?4Vx9XTv&ps4!gO$P.K^#p"fS<Zt){0F[wN83ako7:4gLh$E"$Q^rJA}eWm/6u{Wh!:Z]bh2lRP[A:C#RZ8nDzRE93d6nT0C%Ndm5J%LhQ$b9J)F%/_Y)y}i{/.uEq?EI^IA%YZ)+V,38:&SU%Kw5Ba:eTrhV5RCxffC1B1)30p$HNcTx?HQ!C}DD;U((v:A+IFA(r]%j+?w@KGWB))n^ajf!V$!ig$1niSArwU&`<GmLT$YF6m*vyh2Ro`7"4,Za"<YjlDJ+[im$lCP2g{@5DQOPydG="ZK.YbJOlS:D1W%I0v^YAs,s>+[1NN&f@e7.LrPe3[aW+1F::[KezXl;W(}rp&$0sz]4Cd]322%))3%U;SyQLrrqjM!aE?U*I.hsxMQ3+ZtdZA&0KonAH]u%;^[I:g7.@88OD0c3Sk=O{ulbomLdz&JO

解题思路:

1.帝王-->凯撒密码,凯撒加密只对字母有效
2.被子-->base的谐音
3.数兔兔-->即数数,字频加密,结合一二三五八可知,flag出现频率为斐波那契数的字符组成

EXP

import base64,base58,base91,base92
import tqdm
import gmpy2
def d91e(a=''):
    return base91.decode(a)
dec=[base64.b32decode,base58.b58decode,base64.b64decode,base64.a85decode,base64.b85decode,d91e]

flagc=open('ctfshow.txt','r').read

def dcas(s='',key=1):
    cf=''
    for i in s:
        if i.islower():
            cf+=chr((ord('i')-ord('a')+key)%26+ord('a'))
        elif i.isupper():
            cf+=chr((ord('i')-ord('A')+key)%26+ord('A'))
        else:
            cf+=i
    return cf
def dbase(s=''):
    for i in dec:
        for j in range(1,26):
            cs = dcas(s,j)
            try:
                f = i(cs).decode()
                if f.isprintable():
                    return f
            except:
                pass
    return s
for x in tqdm.trange(10):
    flagc=dbase(flagc)
    print(len(flagc))
d={chr(i):0 for i in range(128)}
for i in flagc:
    d[i]+=1
for i in range(2,20):
    fib=gmpy2.fib(i)
    for j in d:
        if d[j]==fib:
            print(j,end='')

SoEZecdsa

查看代码
 import ecdsa
import random
from Crypto.Cipher import AES

def pad(k):
    return k + chr(16 - len(k) % 16) * (16 - len(k) % 16)

g = ecdsa.NIST256p.generator
ord = g.order()
ss = random.randrange(1, ord)

pub = ecdsa.ecdsa.Public_key(g, g * ss)
priv = ecdsa.ecdsa.Private_key(pub, ss)
 
n = random.randrange(1, 2 ** 127)

h1 = random.randrange(1, ord)
h2 = random.randrange(1, ord)
s1 = priv.sign(h1, n)
s2 = priv.sign(h2, n)

cipher = AES.new(ss.to_bytes(64, byteorder='little')[0:16], AES.MODE_CBC, b'\0' * 16)
c = cipher.encrypt(pad("ctfshow{F_5_F_5_F_5_F_5_F_5_F_5_F_5_F_5_F_5_F_5}").encode('utf-8')).hex()

print(s1.r)
print((s1.s, s2.s))
print((h1, h2))
print(c)


#60963656919952335330699495914604076133088545196341270906012199546992023482470
#(73717183989655107551694042301768298629060759808504642594624975900023461782627, 14687661690747284846117782855464712425538068387758686204509438427659320546252)
#(78282427923826024273891589234109005052482119099079121663545750577095212333215, 95633252274852616927283591980907278832230595718028531805745075047977731184020)
#28ff889a4bf476378f0dd924e1c8ccdd78aba055bf3f24e617a558c8333d4e283ed54186576f50c24fe3109823ade497

考点:使用相同随机数K对两个不同消息进行签名得到的(r,s),r相同,导致私钥泄露。
推导:
S1=(h1+r·d)/k%n (1)
S2=(h2+r·d)/k%n (2)
(1)-(2)K=(h1-h2)·(S1-S2)^(-1) %n
代入得:
d=(S1·k-h1)/r%n
求到私钥后,再AES解密
exp:

import gmpy2
from Crypto.Cipher import AES
from Crypto.Util.number import *
import ecdsa
r=60963656919952335330699495914604076133088545196341270906012199546992023482470
s1=73717183989655107551694042301768298629060759808504642594624975900023461782627
s2=14687661690747284846117782855464712425538068387758686204509438427659320546252
h1=78282427923826024273891589234109005052482119099079121663545750577095212333215
h2=95633252274852616927283591980907278832230595718028531805745075047977731184020
c='28ff889a4bf476378f0dd924e1c8ccdd78aba055bf3f24e617a558c8333d4e283ed54186576f50c24fe3109823ade497'
c=bytes.fromhex(c)
p=ecdsa.NIST256p.generator
p=p.order()
k=(h1-h2)*(gmpy2.invert((s1-s2),p))%p
x=(s1*k-h1)*gmpy2.invert(r,p)%p
print(x)
cipher = AES.new(int(x).to_bytes(64, byteorder='little')[0:16], AES.MODE_CBC, b'\0' * 16)
m=cipher.decrypt(c)
print(m)
ctfshow{F5_cAn_S0lv3_8AsIC_3CDsA_pr08L3M}

大牛杯

SSSS

Some sort of secret...

感谢@⎝Lazzaro⎠师傅供题

p = e4fa76fb77c30f889bbab54d7d7a3e7edbd7ae6c42a1a443f657e95c5708fa15

(1, 9768db2b62cf5e892fd6a0fc26c1387974eefd609998d04a5db830cd85e334bd)
(3, 7452014a456e0545c248617169f6426edd53d4f65ae9dced2ecc0c2911651410)
(5, ed09d852d4789d46891970459a710db6df790be773a9ba7f51528ac508fc74a)
(7, a2637283075c9494ac78f8d2dc0dd2e171ae93f03b0e29e84b785f552ffae39c)
(9, a54a9f5ada141d245eff3817ac40c80ed2120efcf6e90cdfffef8a3fcd34a3da)

AES-ECB
'8a609296eae64a015148d512a6207fee4feed180dce7aed733d827428d0e0f19705151490bc4b488eaee469ac25a90463b78eb6bdbad0adaae4bb45ed66ceb38'

先用所给出的这五个二元组建立一个线性方程组求解(解就是Shamir密钥分享算法中的多项式系数),然后取常数项就行了。

EXP

p = 0xe4fa76fb77c30f889bbab54d7d7a3e7edbd7ae6c42a1a443f657e95c5708fa15

ss = [(1, 0x9768db2b62cf5e892fd6a0fc26c1387974eefd609998d04a5db830cd85e334bd),
(3, 0x7452014a456e0545c248617169f6426edd53d4f65ae9dced2ecc0c2911651410),
(5, 0xed09d852d4789d46891970459a710db6df790be773a9ba7f51528ac508fc74a),
(7, 0xa2637283075c9494ac78f8d2dc0dd2e171ae93f03b0e29e84b785f552ffae39c),
(9, 0xa54a9f5ada141d245eff3817ac40c80ed2120efcf6e90cdfffef8a3fcd34a3da)]

# shamir
Zp = Zmod(p)
A = Matrix(Zp, [[x^i for i in range(5)] for x, y in ss])
b = vector(Zp, [y for x, y in ss])
print(A)

x = A.solve_right(b)
print(x)

得到

[   1    1    1    1    1]
[   1    3    9   27   81]
[   1    5   25  125  625]
[   1    7   49  343 2401]
[   1    9   81  729 6561]
(153421376468734975731045175614702317458439896683272740513610079, 13199192800511101628139098831052436664195660827240283169771088569098253935251, 61088415672732934161626778412472480144291218142728169239148393851672254005488, 18497361290777669420831397571339137872527963545071031656684459823492858013376, 79269397547729156551447820375139597186819542624125750350693624198297473706800)

然后把五个常数项用long_to_bytes解一遍,发现有个结果是_you_got_this_ctfshow_key_, 然后AES在线解密无敌盲解工具,把密码那一栏填上这个密钥,然后把输出换成hex

from Crypto.Util.number import long_to_bytes

m1 = 153421376468734975731045175614702317458439896683272740513610079
m2 = 13199192800511101628139098831052436664195660827240283169771088569098253935251
m3 = 61088415672732934161626778412472480144291218142728169239148393851672254005488
m4 = 18497361290777669420831397571339137872527963545071031656684459823492858013376
m5 = 79269397547729156551447820375139597186819542624125750350693624198297473706800
print(long_to_bytes(m1))
print(long_to_bytes(m2))
print(long_to_bytes(m3))
print(long_to_bytes(m4))
print(long_to_bytes(m5))
#_you_got_this_ctfshow_key_

小二难度R54

gift

[20947495659013288660808536751393787394664606045798093048128257278988208709333248671898749660848208653968668634891579612784633367362177864996602736258460476691940723323282467207875842974409286563660436709535601954405015261428106261369927836045794170912665351432105165546188591486357060490032334793140396757102052999128194027485573053073959574695808224922102635888141991154365047911830780778957642166757152369955362399379720841279167832886144458760347392316082994786119404006382441787685301119197529946566027319295285387108473752590621030421978808950305190250697199878929419723511578437404000924310974770501204226510397, 12911378830212711575909332427930495830030418987483519620282504671823307660633472092466534392403086505995560725428252134905285658936113891795434303336259751169171583600394870893708505805256284455729584616439559184469715186920464999723861722097244025658190194027561300165723184060071016117033960821040587421503448139025974851980482004179865110864844573575034406782936965166402665401330436229441569042660851847498727291447251591027480750458209012729510702196684303778564353025395186191064801000127420683298000173389589468742142444444759536629401472836827952997758216526858512433131954439154124668711408079361172485321041, 13390681135321846035598057088735733735860895610541899486616159864716324918810264721878447895634342127744578566110322466944217562868186608760962032192994397783118528288276520451944892998435079744244578731427626946331165523865930693902700790185275273534104979885060728696532991031786741950704918951536399577118136416956670893081637730646528913282395731901667720418372650030593319596584787752412110672058692368924987360383096340538971725402687347195347344826404005229912821371282465882351660619944919637382790572267512735645269618163597227604601321699186335016345484182059187046972681187078878556533926780789183784240737]

todo

x, y = [random_prime(2 ^ 1024 - 1, False, 2 ^ 1023) for _ in range(2)]
x * y, pow(2021 * x + 501 * y, x * y - x - y, x * y), pow(flag, 0o200001, x * y)

详细内容来源:https://zhuanlan.zhihu.com/p/370374186?utm_id=0

EXP

from Crypto.Util.number import *
# from z3 import *

N, a, b = [20947495659013288660808536751393787394664606045798093048128257278988208709333248671898749660848208653968668634891579612784633367362177864996602736258460476691940723323282467207875842974409286563660436709535601954405015261428106261369927836045794170912665351432105165546188591486357060490032334793140396757102052999128194027485573053073959574695808224922102635888141991154365047911830780778957642166757152369955362399379720841279167832886144458760347392316082994786119404006382441787685301119197529946566027319295285387108473752590621030421978808950305190250697199878929419723511578437404000924310974770501204226510397, 12911378830212711575909332427930495830030418987483519620282504671823307660633472092466534392403086505995560725428252134905285658936113891795434303336259751169171583600394870893708505805256284455729584616439559184469715186920464999723861722097244025658190194027561300165723184060071016117033960821040587421503448139025974851980482004179865110864844573575034406782936965166402665401330436229441569042660851847498727291447251591027480750458209012729510702196684303778564353025395186191064801000127420683298000173389589468742142444444759536629401472836827952997758216526858512433131954439154124668711408079361172485321041, 13390681135321846035598057088735733735860895610541899486616159864716324918810264721878447895634342127744578566110322466944217562868186608760962032192994397783118528288276520451944892998435079744244578731427626946331165523865930693902700790185275273534104979885060728696532991031786741950704918951536399577118136416956670893081637730646528913282395731901667720418372650030593319596584787752412110672058692368924987360383096340538971725402687347195347344826404005229912821371282465882351660619944919637382790572267512735645269618163597227604601321699186335016345484182059187046972681187078878556533926780789183784240737]

aa = inverse(a, N)
print(aa)

# p, q = Ints('p q')
# sol = Solver()
# sol.add(p*q == N)
# sol.add(2021*p+501*q == aa)
# if (sol.check() == sat):
#     print(sol.model())

p = 118025808013874567502972067396154378205921004159004592806833496003217679639841107629090128959992942958292926872941356148283178987927403535617729247751812776636333788905610726461255956234207606642302396722821445909489968841256943549868105578713493559907241758893208485830735235619636112619927867287431575647321
q = 177482332140024816122816575300851746457741976238942019223639223243373845838446387378093437677008231609976122718397287922224412805145965728166071230572137942154170172214953182121671014605624049869925600226560127948579957435119412752482229481128742488177414523194528098131635883615390771259266866469500527361157

phi = (p-1)*(q-1)
e = 0o200001
print(GCD(e, phi))
d = inverse(e, phi)
m = pow(b, d, N)
print(long_to_bytes(m))
print(pow(m, e, N) - b)
#emkkocy{lnyu_wp_kxs_kc_ahz_dvjg_by?}

然后根据循环加密解码

EXP

import itertools

s = b'emkkocy{lnyu_wp_kxs_kc_ahz_dvjg_by?}'

# t = s
t = [x for x in s if ord('a') <= x <= ord('z')] # - ord('a')

ss = b'ctfshow'

tt = [x - ord('a') for x in ss if ord('a') <= x <= ord('z')]

print([x - ord('a') for x in t])
print(tt)

vv = [(x - y) % 26 for x, y in zip(t, tt)]

k = [2, 19, 5, 18, 7, 14]

ss = [(x - y - ord('a')) % 26 + ord('a') if ord('a') <= x <= ord('z') else x for x, y in zip(t, itertools.cycle(k))]

print(bytes(ss))
print(vv)
print(19 ** 2 % 26)
print(len(s))
print(len(t))
ctfshow{sign_in_rsa_do_you_love_it?}

string

查看代码
 # -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2021-04-29 20:54:25
# @Last Modified by:   h1xa
# @Last Modified time: 2021-04-30 00:59:09
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

import string

def a(file):
	with open(file, 'rb') as f:
	    return ''.join([bin(i)[2:].rjust(8, '0') for i in f.read()])

def b(t):
	f = t[0]
	r = ''
	n = 1
	for x in t[1:]:
		if x != f:
			r += str(n)+f
			f = x
			n = 1
		else:
			n +=1
	return r

def c(q):
    s = ''.join(sorted(set(string.digits+string.ascii_lowercase)))
    b = len(s)
    o = ''
    d = {i: j for i, j in zip(range(b), s)}
    while q:
        q, r = divmod(q, b)
        o = d[r] + o
    return o

def e(ct):
	r = ''
	for x in range(len(ct)):
		if x % 4 ==0:
			r += c(int(ct[x:x+4]))
	return r


def encode(f):
	return (e(b(a(f))))


if __name__ == '__main__':
	print(encode('flag'))


#输出内容:

#vev4uuuuvyv42eove2f81mmvouuvo1mmvyuuvd5v333434333436353533343433f1jvsds320b1b91e2yquuuuveve3xyuu2eo2eov560bf34343335353733333335bh348o8n5v5w8n8o5v335v335x5vbf5v5x33338s5we95y5v3434335v8n5w33345v3433338n5v5v333336368rbf5v34335w353334345v8r345v3434373333355v3434365v33335w3361345z5v33338n5v5v33bh3533ec3333bf8n355x338n335w33bf335v343633h0365w3633335v338n8t3433bf5x8n5w338n3533345v35338q5v33bsns3sd1jv1kps333fs31jvs32bn2c7s31k53vh1jv2bns32bnsd1kfs3s31kf4mzs31jvsds3sx1jv1k5sx3v7sn1jv1kf33f1kpsnsdsn1jv1jv1jv2bnsxs3sd1kfths32bx2bn2bxsx1k51jv349s31jv1jv1jv3vh1kf1k5s333p1kzub2bn5fl2c7sd1k5s32c71k51k5sn2cht7sns31k51jvsn1kp1kp1kpt7t7sn2bxs3t72bx1jv1kfs4uoun1bc12yxe12yxe18jxdumxdxe1e2ulxf12xul10618huo12xulxgxixduluo12y108xdulumumxdumun105um105um15p1b9xexdunulumul12x10610512yxe12yul105up106ulxdunuluo12zusxlumun15r12yumulul15ruqutuluo15qxexfulxhxgul106ul105umum12yxe131xd15qunum15putumululuoulxf12yxkul15qul12zulul107xd1e3xdumulum18hulum10512y10512y12yxf108umuqxfxguq107xgxexd1bcxium106ulxdxe10512y105ulxe15pxjxgum12xxh12xxi105umxhxdunxdul105umulup105ulul106ul105umum12yxe106un10512yul130105xexdumuq12x32uu1o0w8uu36qvo1mw1ngvouux2uuv4uuv42ey366veuuuuv4v437u1n61mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuuuvy3701n61mw3yivo1mw1ng1n6uuv4vouu36636guu2gc69a3xyuuuuuu1mmw81nq1mm2ee3xyv43yiuuv41nqv41nqvev41ok1mm5w335w333535333333348n333333345w5v5y338o8n3433343436jr5v33bf345v338o5vgz333435333433358n333333333334338o8o33348o33338p5w33348n335w5v5z8r335w3733e9jr8n5v33335v5v8p33mj8n355z338p5v333333335v355y333334mj8o33338n5ybg8n8n5w353333h033335w34335w5xbfbf33355z3334338nbhgz335v33mk33bh338p34345v34335w395w35355v5vgz34e83535388p348obhbf33335x373434bh5v5v34345w335x358p338n8n333334333333355xbg5v348n8p8o36348o348o345v33e83533345w383435333336335y335y5v338n355v3333335w5x5ve739338n5v8n33343333345x37bf335v3534e78n33bie9336233jr8o8n5v335x34338o333334335v5x5v5w33333633368p5v5w34375x3533h4335w5v5v345vbg5w8n33335w3333345w33335v37338o33343a8o345x5v355vh15v8n5v628o3435375v33bf33343335338n345v5x5v3336335xbg5vjr37355x5v8obf8n348o3433345w8n35335v33345vsd1kps3sds3sds3sd2bnsd5f11l91k52bxs32bn1jv2ch1jvsd2bnsd1jvt72c7sds3snsds31jvsxsn33fsdt7s3s3sd33fsdsxsx2bx1jvsn2ch2chs3snth1k51jvs3s3sn2bn2cr1jv4n933psns3sdsns3sxsdsd1jv1jvsdsd3492bxsd3wbsx2bnsd4n9sdsns3sd1k51jvsd1k51k533psds31kf33zsnsd1jv1kzsd5er1kzs3s31kfs31kf3w1sns333z4mzs3sdsnsd1jvs32bxs3sxs3s31jvs32bnsx2bxsd2chs3s3s32bnth1k533fsns32bxsx1jv1kfsd1kps3sdsx1k52bx1k5sn1kfs3s31jvs3sd1jvsd1jv2chsn1jvsds3t71kz1jvs32bxs3sx2ch3vr2bnt71jvsx33f1k53vr1jvs32bn2bn2c72chsxsdsn1jv2bns3s31jvsd1k51kf1k5sd1jvs3s3sxthsdsdsdsns31lj349snt7sns32bnsd1jvs3s3s31jv1jv34jsdsd1jvsdt71kfs3sd1jv2bnsn1jv2bn673s31jvs3s3s333f2cr3v7sd1jvsd3vhs32bx1kfsxsnt71jvsn4mz2bnsdsns3s32c72bxs3s3sdsds3sd1jvs31jvsdsd1kp2bn1kfsdsxt72c71k51kps31kp2bx1jv3493vh2ch33zsx2bxs3ths3sd1jv1jvs32bxs31kf1k51jv1jv1k5sn1jvsds31k5s32bns3s32bxsds31kfs3s3sn33p1k52bn1k5349sn2bx1jvs3s333psns3s31jvsx1jvs3sds32bxs33v71kfs333f33z1jv1kpsxsxs33v71jvs3sn1kf1jv33f1jvsnsdsx1jvsd1k52d1s3sdsns31k5s31jv33ft7sds333fsn2bn2c71jvsdsnsx1k5s31k52bxsd33psds3s3s31kps333ps31k533f349snsds31k5sd2bnsd1jvs3s3s31jv1kfsn33p1jv1kps3sns3s32bxsxsn1jv1jvsd33ps3s3s3s31kp1jvs32bxs333ps3s33vh1kps333p2bns31kf1jvsn1jvs31kp1jvsdsdsns3s32bns3sd1jv1k51jv33ft71k5sdsdsd2c7s32bx2bxsnsd2bns32bxsnsx33ps31kf33fsds32bxs3sd1jv1jv2bxs3s3s3snsd2bns3sxs34nt1kpsdsds32bx1jvsn1jv33p1k5s32chs31kf33fsn2bx1k5sns3sns31kf33fs31jv1k5snsn2c7rtxdunum106um12xumxe15q107upulxeumul2fi3661mm384vyuuuu4qk2eev41mm1mm1n61mm2f8vo1mmve1ng366uu71wv4v41mm1mwvev4uu1n61n62eo2eeuu1mm5hi2eo1ng2ee1mm1mm2eev45hsuu2ee4q036q1mmvyuu2ee1nquuuuuuvo36g2eeuuveuu1mwve2f82eev43xy1mmuuvev4uuuu36guu36quuv41mmuuvewiuuv43701mmuu366veuu3ys2eeuu6aouuve1mmv4wi2ee1n6370uu2eo1mmuu2eew8uuuuv4366vouu2eeuu3y81mm1o02ee2eeuu2ee1nguu1mmuuuuuuv4v41mwv4v4uuvo366uu2eyv43xyuu69avevo2eeuu3xy1mmuuuuuu36q1n62ey36g2eo1mm2ey1mm1mwuuvev4v45hive1mmv41ng37u2f8v41mw2eew8v4v41n61mmv43xyuu1mm1mwve3xy2eovo4qa2eyuuuuuuuuuuv4uuuu1mmuu2eov4uu1mm2eyv4uu1mmv45i21mwuuuuve1ng1ng1mm1mwuuvovo1mmuuvy1mm1mmuu2ee1nguu1n6v4uu2eev41mm2eo2eouuv4uuuuv4s58n33e85v33gz33h05w5v3833378o3333345w34bie95v33333733bf5w36333533358o8o8o5v8o33bgbf3336345w335v36gz33348o3338338n33338p34353333338n33358o5w335v3335bfe9bh5w365v3435e73335e7335x358n5vbf5w33345w5w338n5v8n3334345xbf5w3833ebbf5x8p8o35345x5v36bg34333533348n5v335v33gz8n5w33bf8n35348s335x33343533333336343533h0338p345xbf3633333334338p5v33335v3433333437bf33345wh25v348o5we860333533bh5v3334bi33335v3334bg5ve75wec33368n33355v5w5v8ph13333618n3333338n5x5v35338n33bf338n33365v335v34gz3334335v335x335w3433335y3333333433bf33378pe7335w5v348ne8bfe78n8n33bj34bh345we833335v3533333437bf35ec345ve733333339bh37eb5wbf345w3338338p345w335v355v8o33335v5x8n638n5v5v8n5z335v338qbg335z333334355y5w335w33338o33335v3335345w33343334335ve95v5v5v34335w5v35e833348n345v5v33385x5w8o8q5v35e73433e95v5y3433338o34335v335v8o8n5v5xbf338o33335x35338n333333375v5w33335v335w348o8n33e7358o5wbf33333436bf5v348n5w5x5v8o5w37345x35bf8n33343534605v33338n34335v3333jr8n5v33333333348n5x5v5v348n3534338o33333335335v8n355w348q35bf5w33605v345v33jr8n5w33bf34ju8n5v33e7ju8o5x34bf8p603333338qe7bf8npdgz335v338n5v3334gz8n368n335v5v345x333333358n5y8n33bg34365v36bfpb5w5w5v8n5v5x343333bf335v5v8qe7bf5vbf5v335we7368obf348n343333335w343335353334388o33338n345ve78p34335ze8338n37bg335w348o373333363434343334bh3334e8bhbg33bf5y35gzbf8p3334345v34bf335v8o3334368n8o335vbf8p5v348n8n335v34335v5v338re8jr335y345x37e733bg348n33bk5y375w8n33355w5w33343734345v5vbf3338345w36gze733358n335x5y35335y335v345v338p33353333bf3333bg5y33338n5v8n8n375y5x5v5w375v345w5vbf5v335v3333338oe75v355x345w5v345w3434e85v8n5x34338n33345v5v5v8sbf5w35333533e734345y3333bf8n34365v33bf358n5v5vbh5x358n338n3335jr5v5v8qbf368nbf5w8o5w35335w338o345y33335v5w335w335v348p5v5v34343336e98n338n8o358o5x3433jr5v5w385w333333h03334333433bie734338o33365v355v33355w5v335w8p5v5w33335x5we85v33bf5v5v8o5w8n33338o365x33355v355x35345y375v348p5v5x8rbf348o8p335vjr5v33333333335w5wjr6236345v5v5w5w358n33348n5v8n5z3436333637mj5w335v338obf6033335v8o335xbf343734343433368oe95w338p3434bgbg338oe75v5w5v3533335v3334345x8n355xbf8n335v333335bgbj5v8n365w335ze78q5x8n5w338n33338p363434345ye7333433345v3433343333338pbf8n8qe7353433bje733333436338n355v36e85v8p8n33bf33bf335v355w5w3333338n5w365w5wgz3336bf5y33355v5w34345v358n33358r363533h1bf335x5v348n335w5w5xbf8n34345v3333335xbf8nbf385v33338nh03335338n5v8n8n5y8n338n8n33335y3333e98o3336378p8o5v33e75vbg3333375v5v5w335w335v36355v8n345xbi8o5v358obf3533345wbf3433378o5v8q335w5w5x5v5w335ve78o34345y385wbf365v5x5w5v358n34ea333435338nbf5wbf3534bf5x5w8p5v5x8o345vbf365v345w8obf37ea8n8o335y34395v5w5v3333365xbf355w33335x335v5ybf33bf348t34343333338q8ne7355x34jw5v5w36365v34338n338n335v5v36e8338n8o338o335v333833bijs335v3333345v345z8nbgmj8p33335x3435355v3533335v5w338n5w33335v8n35345v333d33fs3s31kfsx2bn3vh1k5sd3v72bn1kp1kf1k51kf1jvs3s3sdsd1kz2bnsn33fs31k52crsd33psdsn2bnsd1jvsd1k5s32bxsdsnsds3snsd2bxt7s31jv33psdsn1jvsdsdsx2bn2bns31kfs31k51jv3v71jv1kzs32bn33psxs31k51jvs31jv2bn33f3v73w1sds33v7sd1kf1kf1k51jvs31jvsd2ch1k51jv1jv1jv1kf2bxs3sdsnsxs31kf1jvsns333f1k5s31kf1jv2bnsdsns3sx1jv1k5s31kps3s333f1k53491jvsx2c7s3349s32chs3sd1lj1kf1k5sds31jv1jv2bn1kfsxsd1kzs3sns32bn2c733p1jvt72bns32bxsn1k5s31jvsd2bns33vh1kp1k52bn2bnt7sn1jv1k5snsd1k51jv2bxsn2bx1jvs32c71k5s32bx1k52chs31jv2c7s3t71k51jvs3sns334t2bns3sn3492bn2bn3vrs3sn1kf1kp1jvs3s31jvsx2bn1jvs32bns31k51jv2bn4mz1k5s3s3t73vh1k51k5s31kfs3s34o3sns3s334933zsnt71kf1kps3s31kf2bnt72bns31k5s3sd1jv1jvsn1jv1k5sxs3s3s3t733psdsn33f5ers34ntsxsd4mzs32bn1k5sds3s3105ululunxeul18i12yumulxdumxexg106ul15qululumunul107uo12zul131un105umxdumxeul106um105108xdumunxeul106106105ululumxgulul105xeumulunxe130up105ul105uoumvo36q36guu1n6uuvo1mwuu2ee1mmv4uuuu1mw2ee1n6veuu3yi2ey1mm4qa1n6ve1mwuu1mw1mwvev43661mw366vove1nq3xy1mm1mm1mm3xyuu2ee1okv41mmvev41n6vy2ee1nguuuuv43xy1mmuuuu2ey2eev41mwv42eo1n6ve1mwveve1mmuuve2eev4uuuu2eo2f83661nquuuu4pqv42eo1n62eo2ee1mw1ngws2ey366uuvo1mmuuuu2eeuuuu1mm1mw2eo1mmuuuu1mm1ng1mmw81ng2ee4pq5i2uuvo1mmvy3y8vy3xyve1mm1mw1ok36q1mw1nq1mmuu3662eeuuuuuuve1mm3xy1mw2eeuuve1mm2ey1mw2eeuuv4v41nq2eouuv4uu1mm1mm2eov4366uu2five2ee1mwuuvo71236g2eevo2f83663663xyv4uuuu36g1ngv4uu4q01mm3661n61mm1mmv4vy2ey1mm2eouuv4370366uu1n62eev41n6v44pq2eo2eeve2eev4vo2eev4uu1mmuu3ys3y81mwv41nguu36gv4v4v4v41n61mm3xyuuv41n6uuv4vouuv4uu3662eeuuv4vyuu37auuv41mmv4v41mm2ey1mw3z2v4veuuvo1mm1mw1mm1mm3xy1mm2ee1mmws36qv42eeuuwive37ave2ey1mwv4uu36g2ee1mwuuvo2eo1mmuuv436guuv4w81n6v4uu2eevo36q1mmuuuu1mm2ee1mm1mm2eev43xy1mm1mmw81mwuuuuve1mm3xyv41o0uuuu1mwuuvev4v4uu3702eevy3701mm1mw4res68o5v33358r8n3333335x5z5v5y5v338nbfh035bf335v5w333333bk8oe7338p8s333433bh34338n5w335v333433355v3633335w5v338n8n8r618n338n8o348o335w33338n333634345w335x33333a36gz3333bg35343336335v348o8o3335368n343539bf5x5v33bf8n5z8pbi348nbg5v5w35bf335v8n8t8o8n333533348p333534338p338p33348obgh233355w8o5v33638n5vh0js34343533e8bh345w338s3333395v5ye7e7e75v343a338p34335w35335wbf335v3334345vbh8n3435345x33bf335v8n37bf5x34335z33343a3333335v8o5w5v335y3536335v8n33343333bf5wbh5v5v335v8n37335v33335w5v5w33365v5v335v5v8o5v33345w363435343334368n338n345v8q365w38345v8q343334bgbf33358q3334335w335v34335xh15w3660bf5v35gz335w8n333434343333335v335w8n338o345v38335v5x5w335v333634333334345w8n355v5x335w8n5z338n5vbg343435358n8o3536345w345w355we88p5v333333343536335v8p335w335w34333433355vjr34333437355y33348o5w34335v33bf33345w5w33e75v8q37338s5w5w335w8o8n5v3534bf333835bg3433bk35335v34bg34bf33338o5w5v3433338p2t4mzs3s3s32bxsd1jv1jvs3s3s31jvs3sdsdsxs3sd1jv1jvs31k5sd1kfsd1k5s31kz2bn2c71jvs3sd2bns3s3s31k5s3s31k51jvs3s31jv3vhs32c7s32bx1jv1k533ps3s3sn3vr1k5s31jv3v71jv1k5s31k52bn1k51jvsnrvumxd12x12x12xun106xduoul131ulxd106xdxdulxeul106umxgxf107ul15qulxdxdvo2ee36636q1mm1mmv41mmuu2eewi2eo1mw1mmuu1n6wi2ee3yi1mm3663xy2f81mm1mmve2ey2eo1mmuuv4v41mw366uu2ee1mw1ngvyv41mm1mmv41n62eevevo1n61mm1mmvyuuuu3y8v436g370uuv4uu1mw1ng36g370366uuuuv42eo3xyuu1mm4pq2eouuuu2eevo1mw1mm4pqv4v4veuuuuvouuvevouuvouuv43xy1n61mmvo1mwv4vouu1mm1mw366v41mmvo2eo3xyuuv42eyuuvouu2eouuv4ve2eo1mwuuuu1mm1mw1mm2eeuuv41n6v43yi2eev41mmwi1mmv437k1mmvo1mmuuv4ve3661mm1mw2eyve1ng1mmuuuu1n61mmuu69a3662eouuuu2gc4q01mmv42eeuu1mwuuuu1mmuuuu1mm370uu370uuuu2f81oa1mm1mmv44q0uuuuv41ng1nq3xy3xyv41mwuuuuv41mm2ee1mm3661mwvo1mwuuuu366vew8vovouuuuuuv4veuu3ys366uu2eev4v4veuu2ee5hi4pq36q1mmuu1mww8uuuuveve36gv4uuv4v4v4uuuuvy1mwuuveve1mm2eouuuuuuv4v4v43662ey1mw1mm1mmve1nquu2eo37kve1mwv4uuuu3xy69auu1mm3ys2eeveuuv41mm2eov41mwv41mw1mwuuv41mm2ee366vyv41mmv4v41n6uuv42f81mm4qa3662eouu2eeuu1mmuu1n6uuuuv41mmv4uu3y81mm2eeuuuu2eevove1mmuu1ngvev4uuvevo1mmv42eeveuuv41n6vyveuu36g1mmvevev4vy1n61mmw8uu2eyv4v4uu1mw1mwvew84q0ve1mm36qwiw8366uu1n6uuve1mmuu1mwvev4uu2eov41mw36q36g366v4uu2eeuuveuu37avyv4uu1mw36q1mm1mwuuveuuvo1mw2eeuuv41mw1ng3y8uu1mmv41mwvo1mmuuv42eove3661nguuv4uu1n61mm1mmvov4w81n6uu2ee2eo1nq36g4pq1mmuuuuvy1mw1mmuuuu3662eov4s65w5v33385w335w33gz8n8n5wbf358n34bfbf335xbf33gz5v8o61345v5w335x5v5v3536335v338n345v34gz3334bf338n345v33h034js346036345v8p378obg335w5v5v333335345v5w5vbg335w33375y33348nbg335w8q5x345v378s33608pbi8n348n353333335v5w8oeb335v338p5v8o335x5zgz5v33345w338n335v33338n3433335y3436e98o5w358o345w35335v5we78o3335bf5x345v8n33395w343533jrbf5v33355vbf33335v5v33345w5w33bf5v8o343334bfbg3334335v5v5v8q8p34335v335x365v33jr335w37355yed8n8n5v5v5v8q5x335w8n335y373335mj345v8o5x335x5v5w5w33343633bf8n5v333333373634365v338n335y5w33345x5v8n34348n608o5v355w335xgz34333333338n34e75y5vbg358n3433333333gz8p5zbgbg343335338n343633335x8n5z34335w335w33338o363333338n355x33345y5w353633h034333433365y8o338n8n5v5v338n338n8n5v353535bf5x338n345w33343334335vbf5v35348ne7345v5w3334365v33338n33335v5x33345z333333e7bf348n3533338n33h035338n34335v5v33358obf333534335v34pb5x398n34345y8n5y345x8n355v33348nbh5v5w5x342t1k51k5s3s3s31k5sn33zsn1jvs32bx1jv3vr1jv1jvsd1kp2bns3s3s3sx33z1k5sd4mz33f1k51kf3v7s33vrsx1jvs34nt2bxsd1jvsn3wlsn1kzsn1k55er34934jsx2bn1jvs31jvs3snsd1jvs31kf33psd2bnsds31jv33f2bx1k5sd2bx33ps31jv2bx1jv1jv2bnsn34tsdsd33zs3snsxsn1k51jvs3sds3sn33pt71jvs31jvsdsns32bn1k5s32c7s3s31kfths31jvs3s3s3s31jvs31jvs35fbs3sns32bnsd1jvs3sn349s31jvs32bn2bn1jv2bnsx33f33p1jvs3sn1jvs3tr1k52c71jv3w134tsds3s32c71jv33p1kfs3s3s3s333fs31jv1jv2bnsds32bn1kfs31jv3vh2crs31jvtrs32bns3snsdsx1k53vhs31jvsxths31k51jvs31k5sdsx2c7s3sd1kpsxsdsx1k5s31jv2bns31k5sd1jvs3sns33v71k5sn1kp1jvs31jv1kp1jvs32ch1jvsdsx2bnsnsd1jvsns32bx33p1jvsn2bns3t7s3s3s333f1kpsds3sdsx1kf2bns333fs32bn1kfs3sdsn1jv2ch2bn1jv1jv1jv1k5s334j1jvs3sds31k533z1jvsn2bn1jvt72bn1k51jvsn1jv2bxs32db1kfsnsns333psds31k51k52bx1jv3vr1l9s31jvsnsns32bnsd1k52c7sn349s31kp33zs3s31jvs32bn3v71k5sxsns333p1k52bx2bx2bx1jv1k5sdsd1kf1k5s3s333f2bxsdsxs31k5s31kfs333fsn2bn33fsxsds31k52d11kp1jvs334933p1k5sd2bnsxs3s3sdt71jvs3106xdulxexdxdxdulxeumuluu1o0uu1ng36g1mmvevouu366v4uu36qvovo3xyuuuu2eeuu1ngv41mmuu2eeuuuu1mm2eeuuveve1mmveuu1mw1mm2g2v4uu1nqw82eev41mmvo1mm4pq1mm1mmuuuuuuv42f81mmvovewiv4ve1mmve1mwv4v41n6uuuu36qvyuu1mm2eeuuv4uuuuuuveveve3y8v4v44qav4uu366ve1mwv4uuvyuuve1mmuuuuuu1mmv4ve3ys1n6vov41n6uuvyuu2eo2eyv4uu5hiuu4q0ve1ng1mw1nqvouuv41mmveuuvevouuve1mm2ee1mmveuu36guu1nq1mw1n6uu2eo1mm1n6ve69k5hiv4uuuuveuuuuvy36q1mw2eov4uu1mmuuv41n61mw36g1nguu1n61mmvovov41mm2eouuuuuu1mm1mm2ee2eeuuuuve3661nguuv43yiuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1n61mm2eyvo5hi2ee1mm36guuw81mwuu2eo1n6uu1nguu1n61mm1mwuu1mm1ng1mw1nguu2eouuve3ysuu1mwuu1mmuuuuuuuuveuuvo5hiv41mm1nquuve36quuv41nqv41ou4qkuuve2ee1mw1mm5v5v33333333365v5w345y8n5wbf35335x365z345vbfe78p3633378n5v33mk365x348n33333534333333bf5x5v5y5w5z345w358n3336345y34335v36335we733e8335z5w8n37335z338n5z3534365v5w335v5y5w5ye8335w5w37345v348s5w5v363333638n345v35335x33gz335w345v5v8u5v378q34bg5v335w33343333ea33e78n3333355w5y5w5y35343333sd3v7s32ch1jvs3sd35dsn33fs3s3sd33psdt71jvsns31k5th3vh2c7sds32bns3s3s31jv1jvs31k5s32bns3th1jvs3s3u133f1kf2ch2chs333z1k52cr1kz2c7sdt7sdsn2bx4n91kp1jv1jvs3ths3sn1kf1l9sdsd4mz2bx1jv3vh33p1k5sd1kfsds33v7s333f1jv3vrsdsn2bn1jvsdsd1k52bn5f133ps3xeuqulupxeul10618huluoumulumxdxexhxd12xulul106ul105un106xdxdun12zum18o132ulxd107ulul18h105ul18h15qulxdulul15rum10yv4v4uuveuuuuv42eovev4uuuu2eovov41nqvyb
#[Finished in 0.3s]

不会,还是看大佬的WP吧 :https://zhuanlan.zhihu.com/p/370374186?utm_id=0

EXP

import string
import itertools
from Crypto.Util.number import *

s = 'vev4uuuuvyv42eove2f81mmvouuvo1mmvyuuvd5v333434333436353533343433f1jvsds320b1b91e2yquuuuveve3xyuu2eo2eov560bf34343335353733333335bh348o8n5v5w8n8o5v335v335x5vbf5v5x33338s5we95y5v3434335v8n5w33345v3433338n5v5v333336368rbf5v34335w353334345v8r345v3434373333355v3434365v33335w3361345z5v33338n5v5v33bh3533ec3333bf8n355x338n335w33bf335v343633h0365w3633335v338n8t3433bf5x8n5w338n3533345v35338q5v33bsns3sd1jv1kps333fs31jvs32bn2c7s31k53vh1jv2bns32bnsd1kfs3s31kf4mzs31jvsds3sx1jv1k5sx3v7sn1jv1kf33f1kpsnsdsn1jv1jv1jv2bnsxs3sd1kfths32bx2bn2bxsx1k51jv349s31jv1jv1jv3vh1kf1k5s333p1kzub2bn5fl2c7sd1k5s32c71k51k5sn2cht7sns31k51jvsn1kp1kp1kpt7t7sn2bxs3t72bx1jv1kfs4uoun1bc12yxe12yxe18jxdumxdxe1e2ulxf12xul10618huo12xulxgxixduluo12y108xdulumumxdumun105um105um15p1b9xexdunulumul12x10610512yxe12yul105up106ulxdunuluo12zusxlumun15r12yumulul15ruqutuluo15qxexfulxhxgul106ul105umum12yxe131xd15qunum15putumululuoulxf12yxkul15qul12zulul107xd1e3xdumulum18hulum10512y10512y12yxf108umuqxfxguq107xgxexd1bcxium106ulxdxe10512y105ulxe15pxjxgum12xxh12xxi105umxhxdunxdul105umulup105ulul106ul105umum12yxe106un10512yul130105xexdumuq12x32uu1o0w8uu36qvo1mw1ngvouux2uuv4uuv42ey366veuuuuv4v437u1n61mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuw8uuve1mm1mwuu1mm1ng1mw1ngvouuuuvy3701n61mw3yivo1mw1ng1n6uuv4vouu36636guu2gc69a3xyuuuuuu1mmw81nq1mm2ee3xyv43yiuuv41nqv41nqvev41ok1mm5w335w333535333333348n333333345w5v5y338o8n3433343436jr5v33bf345v338o5vgz333435333433358n333333333334338o8o33348o33338p5w33348n335w5v5z8r335w3733e9jr8n5v33335v5v8p33mj8n355z338p5v333333335v355y333334mj8o33338n5ybg8n8n5w353333h033335w34335w5xbfbf33355z3334338nbhgz335v33mk33bh338p34345v34335w395w35355v5vgz34e83535388p348obhbf33335x373434bh5v5v34345w335x358p338n8n333334333333355xbg5v348n8p8o36348o348o345v33e83533345w383435333336335y335y5v338n355v3333335w5x5ve739338n5v8n33343333345x37bf335v3534e78n33bie9336233jr8o8n5v335x34338o333334335v5x5v5w33333633368p5v5w34375x3533h4335w5v5v345vbg5w8n33335w3333345w33335v37338o33343a8o345x5v355vh15v8n5v628o3435375v33bf33343335338n345v5x5v3336335xbg5vjr37355x5v8obf8n348o3433345w8n35335v33345vsd1kps3sds3sds3sd2bnsd5f11l91k52bxs32bn1jv2ch1jvsd2bnsd1jvt72c7sds3snsds31jvsxsn33fsdt7s3s3sd33fsdsxsx2bx1jvsn2ch2chs3snth1k51jvs3s3sn2bn2cr1jv4n933psns3sdsns3sxsdsd1jv1jvsdsd3492bxsd3wbsx2bnsd4n9sdsns3sd1k51jvsd1k51k533psds31kf33zsnsd1jv1kzsd5er1kzs3s31kfs31kf3w1sns333z4mzs3sdsnsd1jvs32bxs3sxs3s31jvs32bnsx2bxsd2chs3s3s32bnth1k533fsns32bxsx1jv1kfsd1kps3sdsx1k52bx1k5sn1kfs3s31jvs3sd1jvsd1jv2chsn1jvsds3t71kz1jvs32bxs3sx2ch3vr2bnt71jvsx33f1k53vr1jvs32bn2bn2c72chsxsdsn1jv2bns3s31jvsd1k51kf1k5sd1jvs3s3sxthsdsdsdsns31lj349snt7sns32bnsd1jvs3s3s31jv1jv34jsdsd1jvsdt71kfs3sd1jv2bnsn1jv2bn673s31jvs3s3s333f2cr3v7sd1jvsd3vhs32bx1kfsxsnt71jvsn4mz2bnsdsns3s32c72bxs3s3sdsds3sd1jvs31jvsdsd1kp2bn1kfsdsxt72c71k51kps31kp2bx1jv3493vh2ch33zsx2bxs3ths3sd1jv1jvs32bxs31kf1k51jv1jv1k5sn1jvsds31k5s32bns3s32bxsds31kfs3s3sn33p1k52bn1k5349sn2bx1jvs3s333psns3s31jvsx1jvs3sds32bxs33v71kfs333f33z1jv1kpsxsxs33v71jvs3sn1kf1jv33f1jvsnsdsx1jvsd1k52d1s3sdsns31k5s31jv33ft7sds333fsn2bn2c71jvsdsnsx1k5s31k52bxsd33psds3s3s31kps333ps31k533f349snsds31k5sd2bnsd1jvs3s3s31jv1kfsn33p1jv1kps3sns3s32bxsxsn1jv1jvsd33ps3s3s3s31kp1jvs32bxs333ps3s33vh1kps333p2bns31kf1jvsn1jvs31kp1jvsdsdsns3s32bns3sd1jv1k51jv33ft71k5sdsdsd2c7s32bx2bxsnsd2bns32bxsnsx33ps31kf33fsds32bxs3sd1jv1jv2bxs3s3s3snsd2bns3sxs34nt1kpsdsds32bx1jvsn1jv33p1k5s32chs31kf33fsn2bx1k5sns3sns31kf33fs31jv1k5snsn2c7rtxdunum106um12xumxe15q107upulxeumul2fi3661mm384vyuuuu4qk2eev41mm1mm1n61mm2f8vo1mmve1ng366uu71wv4v41mm1mwvev4uu1n61n62eo2eeuu1mm5hi2eo1ng2ee1mm1mm2eev45hsuu2ee4q036q1mmvyuu2ee1nquuuuuuvo36g2eeuuveuu1mwve2f82eev43xy1mmuuvev4uuuu36guu36quuv41mmuuvewiuuv43701mmuu366veuu3ys2eeuu6aouuve1mmv4wi2ee1n6370uu2eo1mmuu2eew8uuuuv4366vouu2eeuu3y81mm1o02ee2eeuu2ee1nguu1mmuuuuuuv4v41mwv4v4uuvo366uu2eyv43xyuu69avevo2eeuu3xy1mmuuuuuu36q1n62ey36g2eo1mm2ey1mm1mwuuvev4v45hive1mmv41ng37u2f8v41mw2eew8v4v41n61mmv43xyuu1mm1mwve3xy2eovo4qa2eyuuuuuuuuuuv4uuuu1mmuu2eov4uu1mm2eyv4uu1mmv45i21mwuuuuve1ng1ng1mm1mwuuvovo1mmuuvy1mm1mmuu2ee1nguu1n6v4uu2eev41mm2eo2eouuv4uuuuv4s58n33e85v33gz33h05w5v3833378o3333345w34bie95v33333733bf5w36333533358o8o8o5v8o33bgbf3336345w335v36gz33348o3338338n33338p34353333338n33358o5w335v3335bfe9bh5w365v3435e73335e7335x358n5vbf5w33345w5w338n5v8n3334345xbf5w3833ebbf5x8p8o35345x5v36bg34333533348n5v335v33gz8n5w33bf8n35348s335x33343533333336343533h0338p345xbf3633333334338p5v33335v3433333437bf33345wh25v348o5we860333533bh5v3334bi33335v3334bg5ve75wec33368n33355v5w5v8ph13333618n3333338n5x5v35338n33bf338n33365v335v34gz3334335v335x335w3433335y3333333433bf33378pe7335w5v348ne8bfe78n8n33bj34bh345we833335v3533333437bf35ec345ve733333339bh37eb5wbf345w3338338p345w335v355v8o33335v5x8n638n5v5v8n5z335v338qbg335z333334355y5w335w33338o33335v3335345w33343334335ve95v5v5v34335w5v35e833348n345v5v33385x5w8o8q5v35e73433e95v5y3433338o34335v335v8o8n5v5xbf338o33335x35338n333333375v5w33335v335w348o8n33e7358o5wbf33333436bf5v348n5w5x5v8o5w37345x35bf8n33343534605v33338n34335v3333jr8n5v33333333348n5x5v5v348n3534338o33333335335v8n355w348q35bf5w33605v345v33jr8n5w33bf34ju8n5v33e7ju8o5x34bf8p603333338qe7bf8npdgz335v338n5v3334gz8n368n335v5v345x333333358n5y8n33bg34365v36bfpb5w5w5v8n5v5x343333bf335v5v8qe7bf5vbf5v335we7368obf348n343333335w343335353334388o33338n345ve78p34335ze8338n37bg335w348o373333363434343334bh3334e8bhbg33bf5y35gzbf8p3334345v34bf335v8o3334368n8o335vbf8p5v348n8n335v34335v5v338re8jr335y345x37e733bg348n33bk5y375w8n33355w5w33343734345v5vbf3338345w36gze733358n335x5y35335y335v345v338p33353333bf3333bg5y33338n5v8n8n375y5x5v5w375v345w5vbf5v335v3333338oe75v355x345w5v345w3434e85v8n5x34338n33345v5v5v8sbf5w35333533e734345y3333bf8n34365v33bf358n5v5vbh5x358n338n3335jr5v5v8qbf368nbf5w8o5w35335w338o345y33335v5w335w335v348p5v5v34343336e98n338n8o358o5x3433jr5v5w385w333333h03334333433bie734338o33365v355v33355w5v335w8p5v5w33335x5we85v33bf5v5v8o5w8n33338o365x33355v355x35345y375v348p5v5x8rbf348o8p335vjr5v33333333335w5wjr6236345v5v5w5w358n33348n5v8n5z3436333637mj5w335v338obf6033335v8o335xbf343734343433368oe95w338p3434bgbg338oe75v5w5v3533335v3334345x8n355xbf8n335v333335bgbj5v8n365w335ze78q5x8n5w338n33338p363434345ye7333433345v3433343333338pbf8n8qe7353433bje733333436338n355v36e85v8p8n33bf33bf335v355w5w3333338n5w365w5wgz3336bf5y33355v5w34345v358n33358r363533h1bf335x5v348n335w5w5xbf8n34345v3333335xbf8nbf385v33338nh03335338n5v8n8n5y8n338n8n33335y3333e98o3336378p8o5v33e75vbg3333375v5v5w335w335v36355v8n345xbi8o5v358obf3533345wbf3433378o5v8q335w5w5x5v5w335ve78o34345y385wbf365v5x5w5v358n34ea333435338nbf5wbf3534bf5x5w8p5v5x8o345vbf365v345w8obf37ea8n8o335y34395v5w5v3333365xbf355w33335x335v5ybf33bf348t34343333338q8ne7355x34jw5v5w36365v34338n338n335v5v36e8338n8o338o335v333833bijs335v3333345v345z8nbgmj8p33335x3435355v3533335v5w338n5w33335v8n35345v333d33fs3s31kfsx2bn3vh1k5sd3v72bn1kp1kf1k51kf1jvs3s3sdsd1kz2bnsn33fs31k52crsd33psdsn2bnsd1jvsd1k5s32bxsdsnsds3snsd2bxt7s31jv33psdsn1jvsdsdsx2bn2bns31kfs31k51jv3v71jv1kzs32bn33psxs31k51jvs31jv2bn33f3v73w1sds33v7sd1kf1kf1k51jvs31jvsd2ch1k51jv1jv1jv1kf2bxs3sdsnsxs31kf1jvsns333f1k5s31kf1jv2bnsdsns3sx1jv1k5s31kps3s333f1k53491jvsx2c7s3349s32chs3sd1lj1kf1k5sds31jv1jv2bn1kfsxsd1kzs3sns32bn2c733p1jvt72bns32bxsn1k5s31jvsd2bns33vh1kp1k52bn2bnt7sn1jv1k5snsd1k51jv2bxsn2bx1jvs32c71k5s32bx1k52chs31jv2c7s3t71k51jvs3sns334t2bns3sn3492bn2bn3vrs3sn1kf1kp1jvs3s31jvsx2bn1jvs32bns31k51jv2bn4mz1k5s3s3t73vh1k51k5s31kfs3s34o3sns3s334933zsnt71kf1kps3s31kf2bnt72bns31k5s3sd1jv1jvsn1jv1k5sxs3s3s3t733psdsn33f5ers34ntsxsd4mzs32bn1k5sds3s3105ululunxeul18i12yumulxdumxexg106ul15qululumunul107uo12zul131un105umxdumxeul106um105108xdumunxeul106106105ululumxgulul105xeumulunxe130up105ul105uoumvo36q36guu1n6uuvo1mwuu2ee1mmv4uuuu1mw2ee1n6veuu3yi2ey1mm4qa1n6ve1mwuu1mw1mwvev43661mw366vove1nq3xy1mm1mm1mm3xyuu2ee1okv41mmvev41n6vy2ee1nguuuuv43xy1mmuuuu2ey2eev41mwv42eo1n6ve1mwveve1mmuuve2eev4uuuu2eo2f83661nquuuu4pqv42eo1n62eo2ee1mw1ngws2ey366uuvo1mmuuuu2eeuuuu1mm1mw2eo1mmuuuu1mm1ng1mmw81ng2ee4pq5i2uuvo1mmvy3y8vy3xyve1mm1mw1ok36q1mw1nq1mmuu3662eeuuuuuuve1mm3xy1mw2eeuuve1mm2ey1mw2eeuuv4v41nq2eouuv4uu1mm1mm2eov4366uu2five2ee1mwuuvo71236g2eevo2f83663663xyv4uuuu36g1ngv4uu4q01mm3661n61mm1mmv4vy2ey1mm2eouuv4370366uu1n62eev41n6v44pq2eo2eeve2eev4vo2eev4uu1mmuu3ys3y81mwv41nguu36gv4v4v4v41n61mm3xyuuv41n6uuv4vouuv4uu3662eeuuv4vyuu37auuv41mmv4v41mm2ey1mw3z2v4veuuvo1mm1mw1mm1mm3xy1mm2ee1mmws36qv42eeuuwive37ave2ey1mwv4uu36g2ee1mwuuvo2eo1mmuuv436guuv4w81n6v4uu2eevo36q1mmuuuu1mm2ee1mm1mm2eev43xy1mm1mmw81mwuuuuve1mm3xyv41o0uuuu1mwuuvev4v4uu3702eevy3701mm1mw4res68o5v33358r8n3333335x5z5v5y5v338nbfh035bf335v5w333333bk8oe7338p8s333433bh34338n5w335v333433355v3633335w5v338n8n8r618n338n8o348o335w33338n333634345w335x33333a36gz3333bg35343336335v348o8o3335368n343539bf5x5v33bf8n5z8pbi348nbg5v5w35bf335v8n8t8o8n333533348p333534338p338p33348obgh233355w8o5v33638n5vh0js34343533e8bh345w338s3333395v5ye7e7e75v343a338p34335w35335wbf335v3334345vbh8n3435345x33bf335v8n37bf5x34335z33343a3333335v8o5w5v335y3536335v8n33343333bf5wbh5v5v335v8n37335v33335w5v5w33365v5v335v5v8o5v33345w363435343334368n338n345v8q365w38345v8q343334bgbf33358q3334335w335v34335xh15w3660bf5v35gz335w8n333434343333335v335w8n338o345v38335v5x5w335v333634333334345w8n355v5x335w8n5z338n5vbg343435358n8o3536345w345w355we88p5v333333343536335v8p335w335w34333433355vjr34333437355y33348o5w34335v33bf33345w5w33e75v8q37338s5w5w335w8o8n5v3534bf333835bg3433bk35335v34bg34bf33338o5w5v3433338p2t4mzs3s3s32bxsd1jv1jvs3s3s31jvs3sdsdsxs3sd1jv1jvs31k5sd1kfsd1k5s31kz2bn2c71jvs3sd2bns3s3s31k5s3s31k51jvs3s31jv3vhs32c7s32bx1jv1k533ps3s3sn3vr1k5s31jv3v71jv1k5s31k52bn1k51jvsnrvumxd12x12x12xun106xduoul131ulxd106xdxdulxeul106umxgxf107ul15qulxdxdvo2ee36636q1mm1mmv41mmuu2eewi2eo1mw1mmuu1n6wi2ee3yi1mm3663xy2f81mm1mmve2ey2eo1mmuuv4v41mw366uu2ee1mw1ngvyv41mm1mmv41n62eevevo1n61mm1mmvyuuuu3y8v436g370uuv4uu1mw1ng36g370366uuuuv42eo3xyuu1mm4pq2eouuuu2eevo1mw1mm4pqv4v4veuuuuvouuvevouuvouuv43xy1n61mmvo1mwv4vouu1mm1mw366v41mmvo2eo3xyuuv42eyuuvouu2eouuv4ve2eo1mwuuuu1mm1mw1mm2eeuuv41n6v43yi2eev41mmwi1mmv437k1mmvo1mmuuv4ve3661mm1mw2eyve1ng1mmuuuu1n61mmuu69a3662eouuuu2gc4q01mmv42eeuu1mwuuuu1mmuuuu1mm370uu370uuuu2f81oa1mm1mmv44q0uuuuv41ng1nq3xy3xyv41mwuuuuv41mm2ee1mm3661mwvo1mwuuuu366vew8vovouuuuuuv4veuu3ys366uu2eev4v4veuu2ee5hi4pq36q1mmuu1mww8uuuuveve36gv4uuv4v4v4uuuuvy1mwuuveve1mm2eouuuuuuv4v4v43662ey1mw1mm1mmve1nquu2eo37kve1mwv4uuuu3xy69auu1mm3ys2eeveuuv41mm2eov41mwv41mw1mwuuv41mm2ee366vyv41mmv4v41n6uuv42f81mm4qa3662eouu2eeuu1mmuu1n6uuuuv41mmv4uu3y81mm2eeuuuu2eevove1mmuu1ngvev4uuvevo1mmv42eeveuuv41n6vyveuu36g1mmvevev4vy1n61mmw8uu2eyv4v4uu1mw1mwvew84q0ve1mm36qwiw8366uu1n6uuve1mmuu1mwvev4uu2eov41mw36q36g366v4uu2eeuuveuu37avyv4uu1mw36q1mm1mwuuveuuvo1mw2eeuuv41mw1ng3y8uu1mmv41mwvo1mmuuv42eove3661nguuv4uu1n61mm1mmvov4w81n6uu2ee2eo1nq36g4pq1mmuuuuvy1mw1mmuuuu3662eov4s65w5v33385w335w33gz8n8n5wbf358n34bfbf335xbf33gz5v8o61345v5w335x5v5v3536335v338n345v34gz3334bf338n345v33h034js346036345v8p378obg335w5v5v333335345v5w5vbg335w33375y33348nbg335w8q5x345v378s33608pbi8n348n353333335v5w8oeb335v338p5v8o335x5zgz5v33345w338n335v33338n3433335y3436e98o5w358o345w35335v5we78o3335bf5x345v8n33395w343533jrbf5v33355vbf33335v5v33345w5w33bf5v8o343334bfbg3334335v5v5v8q8p34335v335x365v33jr335w37355yed8n8n5v5v5v8q5x335w8n335y373335mj345v8o5x335x5v5w5w33343633bf8n5v333333373634365v338n335y5w33345x5v8n34348n608o5v355w335xgz34333333338n34e75y5vbg358n3433333333gz8p5zbgbg343335338n343633335x8n5z34335w335w33338o363333338n355x33345y5w353633h034333433365y8o338n8n5v5v338n338n8n5v353535bf5x338n345w33343334335vbf5v35348ne7345v5w3334365v33338n33335v5x33345z333333e7bf348n3533338n33h035338n34335v5v33358obf333534335v34pb5x398n34345y8n5y345x8n355v33348nbh5v5w5x342t1k51k5s3s3s31k5sn33zsn1jvs32bx1jv3vr1jv1jvsd1kp2bns3s3s3sx33z1k5sd4mz33f1k51kf3v7s33vrsx1jvs34nt2bxsd1jvsn3wlsn1kzsn1k55er34934jsx2bn1jvs31jvs3snsd1jvs31kf33psd2bnsds31jv33f2bx1k5sd2bx33ps31jv2bx1jv1jv2bnsn34tsdsd33zs3snsxsn1k51jvs3sds3sn33pt71jvs31jvsdsns32bn1k5s32c7s3s31kfths31jvs3s3s3s31jvs31jvs35fbs3sns32bnsd1jvs3sn349s31jvs32bn2bn1jv2bnsx33f33p1jvs3sn1jvs3tr1k52c71jv3w134tsds3s32c71jv33p1kfs3s3s3s333fs31jv1jv2bnsds32bn1kfs31jv3vh2crs31jvtrs32bns3snsdsx1k53vhs31jvsxths31k51jvs31k5sdsx2c7s3sd1kpsxsdsx1k5s31jv2bns31k5sd1jvs3sns33v71k5sn1kp1jvs31jv1kp1jvs32ch1jvsdsx2bnsnsd1jvsns32bx33p1jvsn2bns3t7s3s3s333f1kpsds3sdsx1kf2bns333fs32bn1kfs3sdsn1jv2ch2bn1jv1jv1jv1k5s334j1jvs3sds31k533z1jvsn2bn1jvt72bn1k51jvsn1jv2bxs32db1kfsnsns333psds31k51k52bx1jv3vr1l9s31jvsnsns32bnsd1k52c7sn349s31kp33zs3s31jvs32bn3v71k5sxsns333p1k52bx2bx2bx1jv1k5sdsd1kf1k5s3s333f2bxsdsxs31k5s31kfs333fsn2bn33fsxsds31k52d11kp1jvs334933p1k5sd2bnsxs3s3sdt71jvs3106xdulxexdxdxdulxeumuluu1o0uu1ng36g1mmvevouu366v4uu36qvovo3xyuuuu2eeuu1ngv41mmuu2eeuuuu1mm2eeuuveve1mmveuu1mw1mm2g2v4uu1nqw82eev41mmvo1mm4pq1mm1mmuuuuuuv42f81mmvovewiv4ve1mmve1mwv4v41n6uuuu36qvyuu1mm2eeuuv4uuuuuuveveve3y8v4v44qav4uu366ve1mwv4uuvyuuve1mmuuuuuu1mmv4ve3ys1n6vov41n6uuvyuu2eo2eyv4uu5hiuu4q0ve1ng1mw1nqvouuv41mmveuuvevouuve1mm2ee1mmveuu36guu1nq1mw1n6uu2eo1mm1n6ve69k5hiv4uuuuveuuuuvy36q1mw2eov4uu1mmuuv41n61mw36g1nguu1n61mmvovov41mm2eouuuuuu1mm1mm2ee2eeuuuuve3661nguuv43yiuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1ngvouu1nquuve1mmveuu1mm1ng1mw1n61mm2eyvo5hi2ee1mm36guuw81mwuu2eo1n6uu1nguu1n61mm1mwuu1mm1ng1mw1nguu2eouuve3ysuu1mwuu1mmuuuuuuuuveuuvo5hiv41mm1nquuve36quuv41nqv41ou4qkuuve2ee1mw1mm5v5v33333333365v5w345y8n5wbf35335x365z345vbfe78p3633378n5v33mk365x348n33333534333333bf5x5v5y5w5z345w358n3336345y34335v36335we733e8335z5w8n37335z338n5z3534365v5w335v5y5w5ye8335w5w37345v348s5w5v363333638n345v35335x33gz335w345v5v8u5v378q34bg5v335w33343333ea33e78n3333355w5y5w5y35343333sd3v7s32ch1jvs3sd35dsn33fs3s3sd33psdt71jvsns31k5th3vh2c7sds32bns3s3s31jv1jvs31k5s32bns3th1jvs3s3u133f1kf2ch2chs333z1k52cr1kz2c7sdt7sdsn2bx4n91kp1jv1jvs3ths3sn1kf1l9sdsd4mz2bx1jv3vh33p1k5sd1kfsds33v7s333f1jv3vrsdsn2bn1jvsdsd1k52bn5f133ps3xeuqulupxeul10618huluoumulumxdxexhxd12xulul106ul105un106xdxdun12zum18o132ulxd107ulul18h105ul18h15qulxdulul15rum10yv4v4uuveuuuuv42eovev4uuuu2eovov41nqvyb'

def c(q):
    s = ''.join(sorted(set(string.digits+string.ascii_lowercase)))
    b = len(s)
    o = ''
    d = {i: j for i, j in zip(range(b), s)}
    while q:
        q, r = divmod(q, b)
        o = d[r] + o
    return o

c2m = {}
for i in range(1, 10):
    for j in range(1, 10):
        cur_s = f'{i}0{j}1'
        c2m[c(int(cur_s))] = cur_s
        cur_s = f'{i}1{j}0'
        c2m[c(int(cur_s))] = cur_s
        cur_s = f'0{j}1{i}'
        c2m[c(int(cur_s))] = cur_s
        cur_s = f'1{j}0{i}'
        c2m[c(int(cur_s))] = cur_s

for i in itertools.product(string.digits, repeat=4):
    cur_s = ''.join(i)
    if ('0' not in cur_s and '1' not in cur_s):
        continue
    cc = c(int(cur_s))
    if (len(cc) == 3):
        if (cc[0] > '2'):
            continue
    c2m[cc] = cur_s


def dfs(cur_string, cur_buf, cur_decoded, cur_bit):
    # vanish
    if (len(cur_buf) > 1):
        for i in range(1, min(3, len(cur_buf))):
            if (cur_bit == cur_buf[i]):
                geshu = cur_buf[:i]
                nxt_bit = '1' if cur_bit == '0' else '0'
                if (geshu[0] != '0'):
                    geshu = int(geshu)
                    dfs(cur_string, cur_buf[i+1:], cur_decoded + cur_bit * geshu, nxt_bit)
    if (len(cur_buf) > 2):
        return
    # bigger
    if (cur_string == ''):
        if (cur_buf == ''):
            print('Aoligei!')
        return
    
    for i in range(3, 0, -1):
        if (cur_string[:i] in c2m):
            nxt_buf = cur_buf + c2m[cur_string[:i]]
            nxt_string = cur_string[i:]
            dfs(nxt_string, nxt_buf, cur_decoded, cur_bit)
            
def fail_gao(s):
    t = s
    m = ''
    while (t != ''):
        i = 3
        while (t[:i] not in c2m and i >= 0):
            i -= 1
        if (i <= 0):
            break
        m += c2m[t[:i]]
        t = t[i:]
        # print(i)
        # print(len(t))
        # raise Exception
    
    print(m)
    print(t)
    return m

def gao_2(s):
    t = s
    cur_decoded = ''
    cur_buf = ''
    cur_bit = '1'
    while (t != ''):
        i = 3
        while (i > 0):            
            if (t[:i] not in c2m):
                i -= 1
                continue
            nxt_try_buf = cur_buf + c2m[t[:i]]
            nxt_try_decoded = cur_decoded
            nxt_try_bit = cur_bit
            print(nxt_try_buf)
            print(len(nxt_try_decoded))
            print(nxt_try_decoded[-40:])
            print(nxt_try_bit)
            print()
            # baosong
            skip_pattern = ['14071', '34071', '24071', '14051', '34051', '24051']
            if (nxt_try_buf in skip_pattern and nxt_try_bit == '0'): # nxt_try_buf == '10015' and nxt_try_bit == '0'
                i -= 1
                continue
            elif (nxt_try_buf == '10011' and nxt_try_bit == '0'): # nxt_try_buf == '10015' and nxt_try_bit == '0'
                nxt_buf = ''
                nxt_bit = '0'
                nxt_decoded = cur_decoded + '0' * 10 + '1'
                t = t[i:]
                break
            elif (nxt_try_buf == '100212' and nxt_try_bit == '0'): # nxt_try_buf == '10015' and nxt_try_bit == '0'
                nxt_buf = '2'
                nxt_bit = '0'
                nxt_decoded = cur_decoded + '0' * 10 + '1' * 2
                t = t[i:]
                break
            elif (nxt_try_buf == '100211' and nxt_try_bit == '0'): # nxt_try_buf == '10015' and nxt_try_bit == '0'
                nxt_buf = '1'
                nxt_bit = '0'
                nxt_decoded = cur_decoded + '0' * 10 + '1' * 2
                t = t[i:]
                break
            elif (nxt_try_buf == '311001' and nxt_try_bit == '1'): # nxt_try_buf == '10015' and nxt_try_bit == '0'
                nxt_buf = '1'
                nxt_bit = '1'
                nxt_decoded = cur_decoded + '1' * 3 + '0' * 10
                t = t[i:]
                break
            elif (nxt_try_buf == '311003' and nxt_try_bit == '1'): # nxt_try_buf == '10015' and nxt_try_bit == '0'
                nxt_buf = '3'
                nxt_bit = '1'
                nxt_decoded = cur_decoded + '1' * 3 + '0' * 10
                t = t[i:]
                break
            else:
                while (len(nxt_try_buf) > 2):
                    for j in range(1, min(3, len(nxt_try_buf))):
                        if (nxt_try_bit == nxt_try_buf[j]):
                            geshu = nxt_try_buf[:j]
                            nxt_bit = '1' if nxt_try_bit == '0' else '0'
                            int_geshu = int(geshu)
                            if (geshu[0] != '0' and (int_geshu < 30 or (int_geshu < 40 and len(nxt_try_decoded) > 200 ))):
                                nxt_buf = nxt_try_buf[j+1:]
                                nxt_decoded = nxt_try_decoded + nxt_try_bit * int_geshu
                                break
                    else:
                        # shibai
                        i -= 1
                        break
                    nxt_try_bit = nxt_bit
                    nxt_try_buf = nxt_buf
                    nxt_try_decoded = nxt_decoded
                else:
                    # chenggong
                    nxt_bit = nxt_try_bit
                    nxt_buf = nxt_try_buf
                    nxt_decoded = nxt_try_decoded
                    t = t[i:]
                    break
            
        else:
            # shibai
            break
        cur_bit = nxt_bit
        cur_buf = nxt_buf
        cur_decoded = nxt_decoded

    print(len(t))
    print(t[:10])
    return cur_decoded

# dfs(s, '', '', '1')

# m = fail_gao(s)
# print(len(s))

print(len(s))
m = gao_2(s)
print(len(m))
m += '0' * ((8-len(m)) % 8)

mm = long_to_bytes(int(m, 2))
with open('chall.png', 'wb') as f:
    f.write(mm)

baby杯(部分)

baby_左左右右

Zài xiǎo péng yǒu men de yǎn zhōng, jiā mì suàn fǎ de dài biǎo "RSA" huì shì shí me yàng de ne?

gōngyào.pem

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAi1pq+1IiAwTUy0lR9YZJ
gesapAbqswepD1/pRsP5ssoRJYcqx34BHavUelZKIK1Zuc6ku9vCi6kj9G3AlEg0
eAIoLfMjnXetmYVr0xZTKqUVLrCa9YrA4dx/d7vX/0gRJt+BGlxEuVUFJxbmqofW
xtJ0dOVZaQwlZ26XhFtQXP/FaA5E3+CXoSZqDqJec85iJ/kGjo9Hy68HC8pY56sE
mJNdnv/8B7e7aYh9yhOiTK5x5USvXZdTs68TwbxZvtARfVlA5gupMoGYrYEVb1sC
1g0Tpzf+vr+VeKbT6DCk9h8znOobncJdS7w6dAkuFPCQq4aw9eGBi3TfLo0zI025
O7rNlQ159PT2cslEH2elSm39dsgtagh+rJCsv21WVF3r1p9PQinuS5ThmuvM+0lZ
PGV69yRwH0RSdy7aP5ROzWJXdWJx3uDeWNrIrfcMOzHQnTl4Il0GZSX3wuHsq5rJ
a9p4n96EQxLGAlmh206Bpt8ZXgITt8hdIJsk+wHn7pQrC80VSkYqKJf6lF6lD39I
7VMsXCLY/viaMs3SsMrR4Op2YSI7/ttZpTq2FpDaY8FpH00/l7JdWDvnhzhFwhxA
G9S4nmRmw2W4RrSe/xSa71I9UHpcVRCD23C+2Q38TaPzK05DUQ18DmFC1+Ant3Ge
XJ9vjfA8cZNmrkC6NJNQrksCAwEAAQ==
-----END PUBLIC KEY-----

tíshì

ㄆㄧ ㄏㄜˊ ㄎㄩ ㄉㄜ˙ ㄧˋ ㄏㄨㄛˋ ㄨㄟˊ 14888341604833092644320517178995218863140075447248553491998009563290635797577584168541475182868460354002676506510022737991235505863280692834456922818976538567404433536975818048117228043538288574146575189434114636089457163102836992771135916943908638838664754950054366616595720376775483042419894111809594196921094622748829507007225386497860712297983163991922115281874405958425150230425022352399160180729388420737504894531730293184312234027389010694250276180164566305650002005847658634262586502376480156783797707464921684005903262645036582646230195014405925896563524738461846501341559320502121567566177129772692775771082

 mìwén

k?絜啕?<
随娩L?毚?檨F卞?倁娵+?m1矃饏iwb虫?]遜抃Y?銚伃\?u}壞_i婖區*
Y掇伂	c慍M獥葙厾*uC?8R豽奱孾?瞷浗rz凂@薫茑
b脧獤璇bx婎/y;?:?紹2Cp$|寄睈???f闻?F?娄^僅稸夊鬝??6踖m鄐滵U&];篴v?l?3H?-~?熤5K茤%駞M?鴔?形rh淤箷{"娢t?%'N?!`劚<.m.蹘&?貅%kT?!wB€	蝃' =&颥??N?_他c︶.R*鄤4芚贞?僔ㄕAY鶐:)赑?9d7刼'R嘷K??Z韁X瑔伫潶?@5
uz+蒋T"?亼??K?檭V-? k跺笆JC录f疨孝&.苑吠-a?3缰??澐?F珛|导(N[荘ZkQ?7玁鞞+?+65?絝?盭嘚歛|?鉙謺脱?壡?L^

提示是注音的,找到注音表转过来就是异或

ㄆㄧ ㄏㄜˊ ㄎㄩ ㄉㄜ˙ ㄧˋ ㄏㄨㄛˋ ㄨㄟˊ 14888341604833092644320517178995218863140075447248553491998009563290635797577584168541475182868460354002676506510022737991235505863280692834456922818976538567404433536975818048117228043538288574146575189434114636089457163102836992771135916943908638838664754950054366616595720376775483042419894111809594196921094622748829507007225386497860712297983163991922115281874405958425150230425022352399160180729388420737504894531730293184312234027389010694250276180164566305650002005847658634262586502376480156783797707464921684005903262645036582646230195014405925896563524738461846501341559320502121567566177129772692775771082
 
pi  he ku de yi huo wei

根据这个爆破p和q, n是4096位,p^q 是2047 * 2 = 4094位,显然p和q的最高位都是1异或值是0

import sys
n = 56851...
e = 65537
p_xor_q = 1488834...
 
def getpq(p,q, i):
    if p*q > n:
        #print('A', i)
        return 
    tail = (1<<i)-1   #后i位置1
    if (p|tail)*(q|tail) < n:
        #print('B:', i, hex(p|tail), hex(q|tail))
        return 
    if p*q == n:
        print('p=',p)
        print('q=',q)
        return 
    i -= 1
    if p_xor_q & (1<<i) == 0:
        getpq(p^(1<<i), q^(1<<i), i)
        getpq(p,q,i)
    else:
        getpq(p^(1<<i), q, i)
        getpq(p,q^(1<<i),i)
        
print(n.bit_length(), p_xor_q.bit_length())  #4096 2047
sys.setrecursionlimit(3000)
getpq(3<<2046,1<<2047, 2046)
 

得到

p= 24633319543506897387087736095267231275525921935876304351294504175489248530552573901582442755282972664856139503520724875296158770529501318369184640044481916649023736038308440668431647771313759074744914610981612868938195349412963010737491060005285707648895679414833685273040670329653106330561922504799654337819049284345825274464385034774739001213294847528109963285058635741506919825038895381715392741745090004648596155700992389200975891194632207423205369158019005890151152589668261044523237483536623368767578715487910746571519012671067216263119661869095063221820038352918791623753610008710548774716769741462701300185249
q= 23078961565711023895486288383186358334625784951488840242903117718953734482327406362880023856581975493387736953898749589146354039540802607477997696119533586150394891934322807510687925624599507611880416775620076178236786135571917552051011266174847052237036146471916884608507932281075462752244971082347721809591448715143311352152836548087208586387009737023063629639051312610487948450357926939419977727186412536465577808519043368808628305337909072997518901149377484999873834146617841424415959364297665132316873609426171948891122611980026484703119233629116203630097345827333430890755736575155772589249181875564875012432747
p= 24633319543506897387087736095267231275525921935876304351294504175489248530552573901582442755282972664856139503520724875296158770529501318369184640044481916649023736038308440668431647771313759074744914610981612868938195349412963010737491060005285707648895679414833685273040670329653106330561922504799654337819049284345825274464385034774739001213294847528109963285058635741506919825038895381715392741745090004648596155700992389200975891194632207423205369158019005890151152589668261044523237483536623368767578715487910746571519012671067216263119661869095063221820038352918791623753610008710548774716769741462701300185249
q= 23078961565711023895486288383186358334625784951488840242903117718953734482327406362880023856581975493387736953898749589146354039540802607477997696119533586150394891934322807510687925624599507611880416775620076178236786135571917552051011266174847052237036146471916884608507932281075462752244971082347721809591448715143311352152836548087208586387009737023063629639051312610487948450357926939419977727186412536465577808519043368808628305337909072997518901149377484999873834146617841424415959364297665132316873609426171948891122611980026484703119233629116203630097345827333430890755736575155772589249181875564875012432747
 
n = p*q
e = 65537
 
from Crypto.Util.number import bytes_to_long, long_to_bytes
from gmpy2 import invert
c = bytes_to_long(open('flag', 'rb').read())
phi = (p-1)*(q-1)
d = invert(e, phi)
m = pow(c,d,n)
print(m)
print(long_to_bytes(m))
#ctfshow{Fr0M_Y0u_2_zU0_i5_4_G00d_S7r4T39y~}

吃鸡杯

Cop! Run!!

from Crypto.Util.number import *
from flag import flag

n = 1 << 8
p = getPrime(n)
print(p)

P.<t> = PolynomialRing(Zmod(p))
f = t * t + randrange(p)
print(f)

x = [randrange(p)]
x += [f(x[0])]
print([x_ >> (n - ceil(5 * n / 7)) for x_ in x])

flag = bytes_to_long(flag)
y = f(x[-1])
for i in range(7):
    y = f(y)
    flag ^^= int(y)
print(flag)

'''
92946459607669937513774102250057295249718593723232674702212854287358873135783
t^2 + 43844336985235863734419631630425915388298791521868754583032904718644333115590
[3248642833056635029095920782095626337949113592116495266, 4883935221919623989344404485025479346028101682781790392]
193207529097125793778662519051231322609402866155819915933598367395102313904490702547833
'''

EXP

#sage#
n = 1 << 8

p = 92946459607669937513774102250057295249718593723232674702212854287358873135783
a = 43844336985235863734419631630425915388298791521868754583032904718644333115590
s = 3248642833056635029095920782095626337949113592116495266
t = 4883935221919623989344404485025479346028101682781790392

k = (n - ceil(5 * n / 7))
ss = s * 2 ^ k
tt = t * 2 ^ k

M = Matrix(ZZ, [[ss^2+a-tt, 1, 0, 0],
                [      2*ss, 0, 1, 0],
                [        -p, 0, 0, 1]]) * diagonal_matrix(ZZ, [2^(255-2*k), 2^255, 2^(255-k), 1])

v = M.LLL()[0]

# Check coeff
print(v[1] / 2^255)

tms2 = v[0] / (2^(255-2*k))
s0 = v[2] / 2^(255-k)
t0 = tms2 + s0^2

flag = 193207529097125793778662519051231322609402866155819915933598367395102313904490702547833

y = int(tt + t0)
P.<t> = PolynomialRing(Zmod(p))
f = t * t + 43844336985235863734419631630425915388298791521868754583032904718644333115590
y = f(y)

for i in range(7):
    y = f(y)
    flag ^^= int(y)
print(flag)
from Crypto.Util.number import bytes_to_long, long_to_bytes

m = 193207529098498869509546663772608134565688743215282847983592623860862891605878673729661
print(long_to_bytes(m))
#ctfshow{eA5Y__b1var1aN7_c0pper5M17h}

海那边漂来的漂流瓶

感谢@春哥师傅供题

在海的那边漂过来一个漂流瓶,停在了沙滩上。 你把它捡起来,却不知道漂流瓶里的纸上到底写了些啥。

Unlock Hint for 0 points

广州火车站上霸气外露的标语:统一祖国 振兴中华

Unlock Hint for 0 points

靠北耶!E04!

ZJ6 -3 AI6 G8 EL NJ4 EJ/ XJ4 1O3 FU3 RU RUP EJ/ XJ4 S06 54 284 Q/6 J0 , 5J3 VU04 T;6 2J4 431 EJ/ XU3 。 Y4 1O3 D9 G3 S06 VU/6 , U VM4 RU/ EJI4 RU XJ/6 G4 、 VUP 1O3 G4 、 W96 1O3 G4 、 WL6 M06 G4 、 VUP 5J6 VU04 、 VUP 5J6 G4 、 AUL6 XU4 VU04 、 W96 5J/ G4 、 5; CJ84 VU04 、 S06 W.6 VU04 、 MP6 XUP6 VU04 、 RU8 U4 VU04 、 RU8 U4 G4 、 W96 S06 G4 、 EL VM/6 G4 、 QU/6 2J/ VU04 。 ZJ6 X94 EK6 2U6 SO4 BJ/6 G4 T QJ6 WL6 1J4 WJ3 QJ6 WL6 QU6 1J4 T QJ6 WL6 2L3 WJ3 QJ6 WL6 QU6 2U6 C04 M3 QUP UP G.3 Y4 AJ3 QUP RU, 。 FU6 5J/ U.6 M6 XJ4 2J04 RU04 GK4 G6 2U6 M/4 2U4 FM3 2K6 JP4 WU6 , Y94 W96 5J/ G4 M3 5; CJ84 VU04 5 RU0 M06 1P3 U/ E9 G4 S06 1O3 Y.3 VU;4 2U6 ZJ6 -3 AI6 G8 EL NJ4 EJ/ XJ4 CP3 XU4 J94 2U4 G4 T/6 VU04 2J/ VU VU;4 2U6 Y.3 VU;4 , Y4 S06 1J4 1O3 G;4 VU0 RU/ 5; CJ84 VU04 ZP M06 VU; , DJ84 J VU 54 W96 5J/ G4 J4 Z/ FM 、 J B4 FM 5 C.4 , Y94 VU;4 VU VU/6 54 5; CJ84 VU04 1O3 1J4 2U6 5; CJ84 G4 , U06 J VU ( NJ6 T/ 284 2J4 VU ) VU VU/6 54 5; CJ84 VU04 CK6 AO3 5P4 , 5J03 EK4 RU, RUP4 56 RUL3 2U6 284 J0 , DJ84 M,4 284 2J4 VU RUP4 BJ4 W96 5J/ G4 C93 VU04 2U4 FM 。 1U,6 J;4 RU4 183 ZJ6 X94 EK6 M/4 VU WU 94 ZJ3 VU.4 2U6 EK6 G4 1L EJI3 FU3 X96 I6 。 VU; 2JO4 M6 5J/ G0 EL 2; TJ EJO CJ86 G4 U3 TJ04 XU06 W96 J0 VU 04 5J3 UL4 284 T/6 G4 JO6 AJ4 2U6 , DL3 XU;6 2L4 QU/6 C/6 2U4 FM Z8 503 、 WJ3 2U4 FM3 2K6 2U6 T/6 1P3 M3 1U4 AU03 2J G4 ZJ4 RUP4 2J03 WJ6 WJ/ FUP6 TK XU.6 YL4 T/6 YJ3 N9 , ZJ6 -3 AI6 G8 EL NJ4 EJ/ XJ4 2U6 VM03 VU04 RU, DK4 U4 1U4 D9 1J4 ZP BP6 D.3 T.6 AU4 2U6 2J CJO4 FM 1U/4 RU/ EJI4 VM3 2JI M06 1P3 2U 2J4 D9 Z8 2U6 VU; HJP 2U4 294 。

附件给了一堆大写字母和符号的组合用空格隔开。提示是E04。百度发现这个应该就是注音输入法打字的结果。。。
所以我们可以找个注音输入法链接打完上述内容:https://github.com/chinese-opendesktop/cin-tables/blob/master/bopomofo.cin

Ctrl+f搜索,直接使用就行。

打到开头第一个时,根据经验发现是福尔摩沙的注音,然后想到flag就是fu lai ge对应 :服 来 阁

然后我们搜索 ‘’来 阁‘’

找到关键字后回到文本搜索这三个

发现一共两个地方,接下来直接手算即可。

第一处:

flag的内容是吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮的汉字注音首字母拼接

第二处:

flag用ctfshow包裹起来

最终得到

ctfshow{cptbtptpbcptdtptp}

群主说要出简单的题目大家把这题想简单一点

群主曰:

怎么简单怎么来,欢乐为主

AK就AK,我觉得挺好鸭

让人怪不好意思的.png

Unlock Hint for 0 points

当你凝视密文的时候,密文也在凝视着你。

N = 24873777989291448485268365702265085243886872900039809831478881276969311714448924581398692832639705916538111455861057354225427758736198452679468399039512440497290615485190994957684665065261280544484301856860844163436499302230085760545686486398949018187416289923500558688885485672960734334858119391323987554701544773420070317895909846297195832399677291338220818181502181317849952785959097285626009703863257450199781708945715701136683994546852422993684382468187651935055302074609980311161155531603473091857526099148935429447319415714778860215376802270686310782735079899235228731429165106477537031235405221734008734614847
e = 12436888994645724242634182851132542621943436450019904915739440638484655857224462290699346416319852958269055727930528677112713879368099226339734199519756220248645307742595497478842332532630640272242150928430422081718249651115042880272843243199474509093708144961750279344442742836480367167429059695661993777350613653317802356713323129593521588320771616955563426747034967432053960828426250168954828986666929922730060781213890566121107119389060806644531516491192343284701151238691996162679338542186167193568672632227858449997036747029810933106336313085633759799229646747282205612102678724267585967720538082620536177904609
c = 7539424334663709603622451394173266049480031393220309445902319310504736287365860451132752036622339554159799611768328686792828750952551268647863160547774237934958072391797341405165512721597085695555356929495861914056799039140107261439671707574841789330531198534325422015873621769489969596614802282764401661006564546159674397356683650318142728009273827997179696988926599672213482848150751054351595386402597000601684644207559735499031666361222038615475154046453649719203304187309556004660926226182353445661702352380654352874617084419834338343925880593023307238768452509962

EXP

from Crypto.Util.number import long_to_bytes

c = 7539424334663709603622451394173266049480031393220309445902319310504736287365860451132752036622339554159799611768328686792828750952551268647863160547774237934958072391797341405165512721597085695555356929495861914056799039140107261439671707574841789330531198534325422015873621769489969596614802282764401661006564546159674397356683650318142728009273827997179696988926599672213482848150751054351595386402597000601684644207559735499031666361222038615475154046453649719203304187309556004660926226182353445661702352380654352874617084419834338343925880593023307238768452509962
print(long_to_bytes(c))
#ctfshow{xielunyan___KAI!}

The Dedication of Suspect M

A notice letter from Suspect M. Just solve it and capture the flag.

Notice: flag format is ctfshow{} with 0-9 a-f and hyphen(-) in the brace. All letters lowercase.For example: ctfshow{0467c26d-ec10-467b-b1a0-0df379ae9e67}.

解压的时候发现注释

看了大佬的WP太猛了 : https://zhuanlan.zhihu.com/p/388753014

with open('M', 'rb') as f:
    s = f.read()
a=0x5b-0x20 ####010 editor查看,看见大部分相同的16进制,这里的a使得 16进制 + a== 0x32 (Space)############
t = bytes([(x - a)%128 for x in s])
print(t.decode())

with open('flag.txt', 'wb') as f:
    f.write(t)

然后我们打开flag.txt并查看,发现它是一个figlet艺术字,和压缩包注释对上了,而且前几个看上去是ctfshow。逐个看完,可以找出flag。。。

虽然这样说,但最后还是不知道怎么看这个flag。哎,知道的兄弟可以评论区提示下。。感谢

吃瓜杯(部分)

闪电五连鞭·一鞭

[0,
 0,
 0,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231,
 0,
 0,
 0]
from Crypto.Util.number import *

n = 8870619487339789349033932217513908953609539651949986489986889710933094577873155191810742828503059670650154455297603719
e = 3

with open('flag.txt', 'rb') as f:
    m = bytes_to_long(f.read())

assert n > m

Zn = Zmod(n)
P = PermutationGroupElement('(1,6)(2,3,5)(4,7)')
P = Matrix(Zn, P.matrix())

def encrypt(m):
    C = (m * P) ^ e
    return C.list()

EXP

#SAGE#
import gmpy2
n = 8870619487339789349033932217513908953609539651949986489986889710933094577873155191810742828503059670650154455297603719
c = 6940158573485767169443582872275118843545217792197971962103010557916847970940437712181778807436191892307187137338300231

d = gmpy2.invert(3, euler_phi(n))
m = pow(c, d, n)
bytes.fromhex(hex(m)[2:])
#ctfshow{W4r_Dull_Eeeee_LLL3333_A_n0_F14sH_@w@}

闪电五连鞭·二鞭

查看代码
 from Crypto.Util.number import *
import random
random.seed(0x36D)

n = 3950848271664122675439855009329233027357977239695163232943132810210035583520735079984423511153607529820284200137188647
e = 3

with open('flag.txt', 'rb') as f:
    m = bytes_to_long(f.read())

assert n > m

Zn = Zmod(n)
P = PermutationGroupElement('(1,14,25,8,23,15)(2,22,17)(3,18,13,33,11,30,26,27,10,6,16,31,28,21,29,36,7,9)(4,35,12,32,20,5,24)(19,34)')
P = Matrix(Zn, P.matrix())
A = Matrix(Zn, 36, 36, lambda x, y: random.randint(0, 0x36D))
B = A * P * A^-1

def encrypt(m):
    C = (m * B) ^ e
    return C.list()

EXP

#sage#
import random
random.seed(0x36D)
n = 3950848271664122675439855009329233027357977239695163232943132810210035583520735079984423511153607529820284200137188647
Zn = Zmod(n)
P = PermutationGroupElement('(1,14,25,8,23,15)(2,22,17)(3,18,13,33,11,30,26,27,10,6,16,31,28,21,29,36,7,9)(4,35,12,32,20,5,24)(19,34)')
P = Matrix(Zn, P.matrix())
A = Matrix(Zn, 36, 36, lambda x, y: random.randint(0, 0x36D))
B = A * P * A^-1
print(B^3)

import gmpy2
n = 3950848271664122675439855009329233027357977239695163232943132810210035583520735079984423511153607529820284200137188647
e = 3
P1 = 34929570281
P2 = 45257138441
P3 = 37075595933
P4 = 52247556719
P5 = 51535960127
P6 = 52587303023
P7 = 50078700401
P8 = 65879634563
P9 = 39080096201
P10 = 56431742447
P11 = 65430660761
k=3631726152245557951349544604305122093557137441233475943486700146282835574044414322766971425339642907262597894115705095
c=266139750184072256867523233914663711299040516073239592856002179890534272023823522825949062175260062964182042569893693
phi=(P1-1)*(P2-1)*(P3-1)*(P4-1)*(P5-1)*(P6-1)*(P7-1)*(P8-1)*(P9-1)*(P10-1)*(P11-1)
c=c*gmpy2.invert(k,n)%n
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(m)
from Crypto.Util.number import long_to_bytes

m= 3918714243685203036186589827211911289370613228561024831894367241260617506100660249344167578509674848439423687137313917
print(long_to_bytes(m))
#ctfshow{Tr4D1t10NaL_Kun9_Fv_.<-St0p_w3_speak_36D}

闪电五连鞭·三鞭

查看代码
 from Crypto.Util.number import *
import random
random.seed(0x36D)

n = 25126409997644048715497037905442671105116158875704245711785280791201683049008805107543997350200944348915833337286069203
e = 3

with open('flag.txt', 'rb') as f:
    m = bytes_to_long(f.read())
assert n > m

Zn = Zmod(n)
P = PermutationGroupElement('(1,3,6,29,25,34,22,33,10,16,7)(2,21,19,17,31,9,5,30,27,35,32,11)(4,20,28,23,18,15)(8,26,14,12)(36,24,13)')
P = Matrix(Zn, P.matrix())
A = Matrix(Zn, 36, 36, lambda x, y: random.randint(0, 0x36D))
B = A * P * A^-1

def encrypt(m):
    C = (m * B) ^ e
    return C

matrix_map = {"I": Matrix(Zn, matrix.identity(36)), "B": B, "C": encrypt(m)}

def server_add(matrix_map):
    print("第一个矩阵:")
    A = input("> ").strip()
    print("第二个矩阵:")
    B = input("> ").strip()
    C = matrix_map[A]+matrix_map[B]
    print(f"这两个矩阵之和的迹是:{C.trace()},迹你实在是太美~")
    return C

def server_product(matrix_map):
    print("第一个矩阵:")
    A = input("> ").strip()
    print("第二个矩阵:")
    B = input("> ").strip()
    C = matrix_map[A]*matrix_map[B]
    print(f"这两个矩阵之积的迹是:{C.trace()},迹你实在是太美~")
    return C

def server_kproduct(matrix_map):
    print("矩阵:")
    A = input("> ").strip()
    print("乘数:")
    k = input("> ").strip()
    k = int(k)
    B = k * matrix_map[A]
    print(f"数乘结果的迹是:{B.trace()},迹你实在是太美~")
    return B

def server_power(matrix_map):
    print("矩阵:")
    A = input("> ").strip()
    print("幂次:")
    k = input("> ").strip()
    k = int(k)
    B = matrix_map[A] ^ k
    print(f"求幂结果的迹是:{B.trace()},迹你实在是太美~")
    return B

def server_save(A, matrix_map):
    print("存个小档? (Y/N)")
    s = input("> ").strip().upper()
    if s == "Y":
        print("运算结果叫啥名呢?")
        S = input("> ").strip()
        matrix_map[S] = A
        print("存上档咯!")

WELCOME = """
欢迎来打第三鞭!
在这一鞭中,你可以尝试打出两个矩阵的和,积。
或者一个矩阵的数乘,幂次。
但是由于av50183113,所以我只会告诉你运算结果的迹,因为迹你太美。
"""

MENU = """
请开始你的表演:
[S] 打印矩阵
[+] 两矩阵相加
[*] 两矩阵相乘
[K] 一矩阵数乘
[^] 一矩阵求幂
[Q] 886
"""

print(WELCOME)

while True:
    print(MENU)
    try:
        opt = input("> ").strip().upper()
        if (opt == "S"):
            print("迹你太美……baby……迹你实在是太美……")
            for k, v in matrix_map.items():
                print(f"{k}: {v.trace()}")
        elif (opt == "+"):
            M = server_add(matrix_map)
            server_save(M, matrix_map)
        elif (opt == "*"):
            M = server_product(matrix_map)
            server_save(M, matrix_map)
        elif (opt == "K"):
            M = server_kproduct(matrix_map)
            server_save(M, matrix_map)
        elif (opt == "^"):
            M = server_power(matrix_map)
            server_save(M, matrix_map)
        elif (opt == "Q"):
            print("再见!")
            break
        else:
            print("李在……赣神魔?")
    except:
        print("这波和闪电鞭配合得不是很好……")

连接靶机,打印矩阵得到c

请开始你的表演:
[S] 打印矩阵
[+] 两矩阵相加
[*] 两矩阵相乘
[K] 一矩阵数乘
[^] 一矩阵求幂
[Q] 886

> S
迹你太美……baby……迹你实在是太美……
I: 36
B: 0
C: 6132850429120268033633936981284349136648384723096412687538721042263421948426268557612819228946095777979680453577577726

交互的过程只会告诉你任意矩阵的迹,但我们会发现同余式

C≡M3B3 => tr(C)≡M3 tr(B3) 接下来就按前面那样做就行

代码如下:

from Crypto.Util.number import long_to_bytes
import gmpy2
c=6132850429120268033633936981284349136648384723096412687538721042263421948426268557612819228946095777979680453577577726
n = 25126409997644048715497037905442671105116158875704245711785280791201683049008805107543997350200944348915833337286069203
e = 3
P1 = 60561137381
P2 = 62259609689
P3 = 59742623363
P4 = 62787656051
P5 = 59072838359
P6 = 62725971677
P7 = 64819665749
P8 = 40813118459
P9 = 58190950619
P10 = 49550187209
P11 = 62853419633
phi=(P1-1)*(P2-1)*(P3-1)*(P4-1)*(P5-1)*(P6-1)*(P7-1)*(P8-1)*(P9-1)*(P10-1)*(P11-1)
c=gmpy2.invert(3,n)*c%n
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(m)
print(long_to_bytes(m))
#ctfshow{14799df6-195a-4b52-b387-4dbe78d6fe67}

闪电五连鞭·四鞭

断鞭了。。。。后面的不会了

大鸟转转转

为响应群主“怎么简单怎么来”的号召,特补上一道古典密码。

明文密文都是大写字母。

请解出正确的明文后,把明文转换成小写,并加上格式所包含的花括号。

Unlock Hint for 0 points

pycipher,你值得拥有

 

python反序列化:

import pickle
x = pickle.load(open('nimage.pickle', 'rb'))
print(x)

#{'UMKEHRWALZE': 'B', 'WALZENLAGE': '123', 'GRUNDSTELLUNG': 'WYF', 'RINGSTELLUNG': '???', 'STECKERVERBINDUNGEN': ['WO', 'DE', 'JB', 'HN', 'XI'], 'KLARTEXT': 'CTFSHOW?????????????????????????????', 'GEHEIMTEXT': 'MXKXBTIOOZHFTGGTTPTRNXJUGASUTVBNSNGS'}

 EXP

from pycipher import Enigma
import string
dic = string.ascii_uppercase

for x in dic:
    for y in dic:
        for z in dic:
            eng = Enigma(settings=('W','Y','F'),rotors=(1,2,3),reflector='B',
                 ringstellung=(x,y,z),steckers=[('W','O'),('D','E'),
                 ('J','B'),('H','N'),('X','I')])
            flag = eng.decipher('MXKXBTIOOZHFTGGTTPTRNXJUGASUTVBNSNGS')
            if flag.startswith('CTFSHOW'):
                print((x,y,z),flag.lower())
#ctfshowshameoncanadianelectricskrman

月饼杯II(部分)

ctfshow_login

查看代码
 from random import randint
from Crypto.Util.number import *

MASK = (1 << 1024) - 1

CTFSHOW_MEMBERS = [
    'Joker',
    'h1xa',
    'Daniu',
    'FW_Mumuzi',
    'cheyenne',
    'striving',
    'ThTsOd',
    'bit',
    'Lazzaro',
    'Y4tacker',
    'ISHAO',
    'aliga',
    'whwhwzwz',
    'XunYing',
    'cs',
    'Ricky',
    'FW_Suica',
    'duck0123',
    'yuchouxuan',
    'MiGooli',
    'owod',
    'yu22x',
    'ZM.J',
    'Yasso',
    'daliangba',
    '7herightp4th',
    'zealot',
    '0x7e',
    'i_kei',
    'V3geD4g',
    'paidx0',
    'lorlike',
    'saulgoodman',
    'Asofia',
    'ENJOEY',
    'g4_simon',
    'werewolfcjj',
    'lewiserii',
]

CTFSHOW_MEMBERS = [f'{mem}@CTFshow'.encode() for mem in CTFSHOW_MEMBERS]

def get_login_keys():
    x = randint(1, p-2)
    y = pow(g, x, p)
    return x, y

def generate_token(username, x):
    while True:
        u = bytes_to_long(username) & MASK
        k = randint(2, p-2)
        if GCD(k, p - 1) != 1:
            continue 
        r = pow(g, k, p)
        s = (u - x*r) * inverse(k, p-1) % (p-1)
        if s == 0:
            continue
        return (r,s)

def verify_token(username, r, s, y):
    u = bytes_to_long(username) & MASK
    # No cheating
    if any([x <= 0 or x >= p-1 for x in (u,r,s)]):
        return False
    return pow(g, u, p) == (pow(y, r, p) * pow(r, s, p)) % p

def check_login(username):
    return any([mem in username for mem in CTFSHOW_MEMBERS])

def login(username, r, s, y):
    if verify_token(username, r, s, y):
        if check_login(username):
            return flag
        else:
            return '[Error] You are NOT a CTFshow member!'
    else:
        return '[Error]: Token verification failure!'

if __name__ == "__main__":
    with open("flag.txt", 'rb') as f:
        flag = f.read()

    p = getPrime(1024)
    g = 7
    
    _, y = get_login_keys()
    print('Welcome to CTFshow login system!')
    print('Login as a CTFshow member to capture the flag!')
    print(f"Here is the public key: {(p, y)}")
    print('However, the private key is lost, so you must have saved your login token properly :)')
    print(f'Please send your username and the corresponding token (r,s)')
    username = input('username (in hex): ')
    username = bytes.fromhex(username)
    r = int(input('r (in hex): '), 16)
    s = int(input('s (in hex): '), 16)
    msg = login(username, r, s, y)
    print(msg)

来自大佬的详解:https://zhuanlan.zhihu.com/p/412445573?utm_id=0

EXP

from Crypto.Util.number import *
from random import randint

y = 
p = 
g = 7
while (True):
    i, j = randint(2, p-2), randint(2, p-2)
    if GCD(j, p-1) != 1:
        continue
    r = pow(g, i, p) * pow(y, j, p) % p
    s = -r * inverse(j, p-1) % (p-1)
    m = s * i % (p-1)
    m = b'Daniu@CTFshow'.hex() + f'{m:0260x}'
    print(m)
    print(f'{r:x}')
    print(f'{s:x}')
    break

然后根据结果进靶机验证,多试几次哎!看运气了

切记务必一定要简单

Unlock Hint for 0 points

在分解模数N的时候,除了yafu、factorDB之类现成的工具,我们还要学习一些经典算法背后的思想

Unlock Hint for 0 points

此题对算力无要求。

正解运行在普通台式机上,5秒之内能出结果。

查看代码
 from Crypto.Util.number import *
import random, sys

def get_prime(base, offset):
    l = base - (1 << offset)
    r = base + (1 << offset)
    p = random.randrange(l, r) | 1
    while (not isPrime(p)):
        p += 2
    return p

if __name__ == "__main__":
    p = getPrime(1127)
    q0 = p * 13 // 17
    q = get_prime(q0, 573) # Konami
    with open('flag.txt', 'rb') as f:
        flag = bytes_to_long(f.read())
    N = p * q
    assert isPrime(p) and isPrime(q) and flag < N
    e = 0x10001
    c = pow(flag, e, N)
    print(f"N = {N}")
    print(f"e = {e}")
    print(f"c = {c}")

EXP

import gmpy2
N = 1493243460651837240907755828409596953643273516620788791882808304933815698934769806878542956676094323369916576394776922273947413197402358682424421508260435509311751304485340105839094566381087472060138016306509585978654313462551491325464144177312969080105153091440869166432234632199346017571589193908085240266806162121873837933288524667210771765654287762652053472598394916108739024760200326789292445132444116839110181121290636681042267055592807182947536646214303813450991349496938143734326002648893041960403417304634806718931389501775850178357770869497156715581405797364207250974687993765349678001989310417349280086097303497013323466995357631718089005398924281459474800691970088923
e = 65537
c = 817303866409838168048496946736194565034961720572859788251699214203923149919828771889752427441601807717431384341501311326065858056056963899077423084888183838146621200140320918435640402622989082410773713050633667678748181085233988490930457434923141582400155142111147729061917882414061852967512024330930111763694603450389877126041342586282799540701016114545951263728804723940771112455161468023657646465441277792442488230821479001046113748683225911635952539169133341323324929632926317795595326365299995976290742963519904861662630465894612893282034152718744410574559962758786681403988139391593183400338916452066322010666020431256629458381535221158397717601459178046206926067685906529
n=int(isqrt(4*13*17*N))+1
for i in range(2^22):
    a=n+i
    b_=gmpy2.iroot(a^2-4*13*17*N,2)
    if(b_[1]):
        b=b_[0]
        p1=(a+b)//26
        q1=(a-b)//34
        if(p1*q1==N):
            phi1=(p1-1)*(q1-1)
            d1=gmpy2.invert(e,phi1)
            m1=pow(c,d1,N)
            print(m1)
        else:
            p2=(a+b)//34
            q2=(a-b)//26
            phi2=(p2-1)*(q2-1)
            d2=gmpy2.invert(e,phi2)
            m2=pow(c,d2,N)
            print(m2)
from Crypto.Util.number import long_to_bytes

m= 233573570471120061643115191944321850825139761220924643223190330884233371155284792530098513945461019144786181386
print(long_to_bytes(m))
#ctfshow{54dc7478-a129-4e2a-8048-2973db0c060f}

张八炫CTFshow三结义

张兄、八神、炫兄于西踢爱抚秀中,备下大牛草泥马祭礼等项,三人焚香再拜而说誓曰:“念张兄、八神、炫兄,虽然异姓,既结为兄弟,则同心协力,救困扶危;上报国家,下安黎庶;不求同年同月同日生,只愿同年同月同日死。皇天后土,实鉴此心。背义忘恩,天人共戮!”誓毕,拜张兄为兄,八神次之,炫兄为弟。祭罢天地,复宰牛设酒,聚秀中勇士,得三百馀人,就西踢爱抚秀中痛饮一醉。

Unlock Hint for 0 points

此题可能需要一定的算力以及耐心。

如果你觉得当前容器所给出的问题太难解出,不妨重开一个容器。

from Crypto.Util.number import *
from secret import zang, ba88, xuan, p, q, e

# F91 is my wife forever
assert isPrime(e) and (e < 91)

N = p*q
ps = list(map(bytes_to_long, (zang, ba88, xuan)))
cs = [pow(i,e,N) for i in ps]
s = sum(ps) # UNITE
print(f"N = {N}")
print(f"cs = {cs}")
print(f"s = {s}")
N = 22513535784468534129834889952523600239032304278910998501105900682673776113350086826756615329191267862830620141314443420272923880882076826686259042696572064061949594448360556376609260095622408033431777901874215286128098340062484924433446933983584648252740926032471612130460728239144178948188623164123085587683688364690360703076134467505771160575059483144352203860220081587148531078520420086256124210856164488743875161749610246520906583756587895161690023608010414373040569877730756836886878124049343183998623360446458808952650748017145431365332783323874920154037847285864497808188542239729481880572932881488610061350291
cs = [14874449798763988933884252650917412114457398270675912171911023825257495780957272391944441736744357060753631221158294678280376901964287981408999134006241250429661604795155268684392199572841335302972364241195131896996653085322058772137905221393510472925630078890060082195559378401066443391185374477872533431842814511163344908122670826694565112866225075834089672869320270482191652045979705132074309267683881052427028567629363364327199458223186998271748238010228612821896310944737914751728773579355947383944130691445363301060608841306850401793916418709251291577834645572075941078503219998550634608638501940932038607993821, 16649533406090023953272059193014303332455192457315273600200743895551749918960427922106926196246501673529460691089414613761524848329540270908216886281427348456942588788644126985719453875573687912414741452974252334978159204002297542844564029378650243942655891705598955258589342762908026485389279153922398569321187591503281512801304444257603142973635463435721267012330724941674779739104528253371577812160432187967157183893354848161378517649736201419993530269310066107305884815370384146133462471994836013261174345578097175014829819582974479055988281525257236600265810518670286206271778413645608113113282341278148692412760, 2456126013518923920319078878401329629869505314670684961792386028044389234839758774669128638392684442064458886883524186175056425012986428515672297411136238977274109814918208863358649875896153695066460162809508842414704107464968041253402020024364218390175590007476729624516471683503362767698525130090741127367837017074064160674529991934180178625710965190528609139698329167406730805240815005974738717180061853684728101499090318017734203427207858726525951979014503879769069785553059310203854476537765987752888915081453972286441337539223185015271735065678998535674157795822109198306702504020271895896467619044887299532657]
s = 131301991665964274594625113451411554159

EXP

#sage#
import sympy

N = 22513535784468534129834889952523600239032304278910998501105900682673776113350086826756615329191267862830620141314443420272923880882076826686259042696572064061949594448360556376609260095622408033431777901874215286128098340062484924433446933983584648252740926032471612130460728239144178948188623164123085587683688364690360703076134467505771160575059483144352203860220081587148531078520420086256124210856164488743875161749610246520906583756587895161690023608010414373040569877730756836886878124049343183998623360446458808952650748017145431365332783323874920154037847285864497808188542239729481880572932881488610061350291
cs = [14874449798763988933884252650917412114457398270675912171911023825257495780957272391944441736744357060753631221158294678280376901964287981408999134006241250429661604795155268684392199572841335302972364241195131896996653085322058772137905221393510472925630078890060082195559378401066443391185374477872533431842814511163344908122670826694565112866225075834089672869320270482191652045979705132074309267683881052427028567629363364327199458223186998271748238010228612821896310944737914751728773579355947383944130691445363301060608841306850401793916418709251291577834645572075941078503219998550634608638501940932038607993821, 16649533406090023953272059193014303332455192457315273600200743895551749918960427922106926196246501673529460691089414613761524848329540270908216886281427348456942588788644126985719453875573687912414741452974252334978159204002297542844564029378650243942655891705598955258589342762908026485389279153922398569321187591503281512801304444257603142973635463435721267012330724941674779739104528253371577812160432187967157183893354848161378517649736201419993530269310066107305884815370384146133462471994836013261174345578097175014829819582974479055988281525257236600265810518670286206271778413645608113113282341278148692412760, 2456126013518923920319078878401329629869505314670684961792386028044389234839758774669128638392684442064458886883524186175056425012986428515672297411136238977274109814918208863358649875896153695066460162809508842414704107464968041253402020024364218390175590007476729624516471683503362767698525130090741127367837017074064160674529991934180178625710965190528609139698329167406730805240815005974738717180061853684728101499090318017734203427207858726525951979014503879769069785553059310203854476537765987752888915081453972286441337539223185015271735065678998535674157795822109198306702504020271895896467619044887299532657]
s = 131301991665964274594625113451411554159
PR.<x,y,z>=PolynomialRing(Zmod(N))
for e in range(1,91):
    if(sympy.isprime(e)):
        f1=x^e-cs[0]
        f2=y^e-cs[1]
        f3=z^e-cs[2]
        f4=x+y+z-s
        G=Ideal([f1,f2,f3,f4]).groebner_basis()
        if(len(G)!=1):
            print(G)

耐心等待。。。

我的木头啊!!!

我的宝贝木头怎么被别人拿去做了栅栏,该怎么让他把我的宝贝木头换回来

密文:

c6_I_@t216MG_0q_Uf673JTYYzBXs{31QJmTTg=hw63XZFZiHho5GzE}

考点:W栅栏+base家族

http://www.atoolbox.net/Tool.php?Id=777在线工具

括号里面在base最后得到

 ctfshow{base16_base32_base64_base58_base}

一封信

有一天,小明收到了一封名为mooncake的信,你可以帮他破解吗?

🙃💵🌿🎤🚪🌏🐎🥋🚫😆✅👉🔄🎤👌⌨👑🎅😍🍎🚫☂😀😀🐘🐍🙃🤣☀🍎🔬☂🥋🎈🍎😂🍌🐎🌊🔄🎅🚫🌏👌🎃🔬😡👣🚪🍴🚰🦓🕹😆👉ℹ⏩✉🛩🌉📂🌿🔄😀🍌🌿😎⏩🤣😂🍎🏎🔄⌨🌿✉⌨🙃☃🍎☃🚫🍍😂😂⌨🗒🗒

表情包解码,密钥就是mooncake  https://aghorler.github.io/emoji-aes/

ctfshow{Happy_Mid-Autumn_Festival}

击剑杯(部分)

单向加密

21892299583455516902678177407943098723020343792737269219307899917648316295261201016328488524278932283999750824537049252476708912581411433116481435169820171800812269837405200686395697568215005205362068960832774807526976480752697635422484817926191507531940434634990099905635630699300684624818348075269761353018523447067460493194043463499009990512649370320429973934883223194043463499009990592737269219307899917677787420494356677625885484473810535422484817926191507531940434634990099905927372692193078999176777874204913530185234470674604948075269764356677625885484473810583621143489848422977218922995834555169026218922995834555169026777874204959425114757512643212875125=I2GWRFMO33EWUZM

斐比寻常

考点:斐波那契

EXP

s = '21892299583455516902678177407943098723020343792737269219307899917648316295261201016328488524278932283999750824537049252476708912581411433116481435169820171800812269837405200686395697568215005205362068960832774807526976480752697635422484817926191507531940434634990099905635630699300684624818348075269761353018523447067460493194043463499009990512649370320429973934883223194043463499009990592737269219307899917677787420494356677625885484473810535422484817926191507531940434634990099905927372692193078999176777874204913530185234470674604948075269764356677625885484473810583621143489848422977218922995834555169026218922995834555169026777874204959425114757512643212875125'

for num in range(128):
    fibs = [1,1]
    for i in range(num-2):
        fibs.append(fibs[-2]+fibs[-1])
#print(fibs)
for i in range(32,len(fibs)):
    if(str(fibs[i]) in s):
        s = s.replace(str(fibs[i]),chr(i+1))
print(s)
#ctfshow{g00d_j0b_u_f1nd_f1b0nacc1}

么西么西?

么西么西?

歪比歪比?

歪比巴卜?

Are you good 马来西亚?

考点:DTMF

EXP

hz1 = [1209,1336,1477,1633]
hz2 = [697,770,852,941]
table = ['1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D']

s = '1336-697 1477-697 1477-697 1336-770 1209-852 1477-697 1336-770 1209-852 1336-941 1209-770 1209-852 1209-697 1209-697 1336-697 1336-941 1336-941 1477-770 1209-697 1477-770 1209-770 1336-697 1209-852 1477-697 1209-697 1209-697 1477-770 1209-770 1209-852 1336-852 1336-770 1336-852 1336-941 1336-852 1209-770 1477-697 1209-770 1209-770 1477-852 1209-852 1336-697 1477-770 1336-852 1209-770 1336-852 1209-697 1477-697 1477-697 1477-697 1336-941 1209-770 1477-697 1477-697 1209-770 1209-852 1477-770 1336-852 1209-852 1336-941 1477-852 1209-697 1336-697 1336-770 1336-697 1336-770 1336-770 1477-697 1336-697 1209-697 1336-852 1477-697 1477-770 1477-852 1336-697 1209-697 1336-852 1336-852 1477-697 1336-697 1336-697 1336-697 1209-770 1336-697 1209-697 1336-697 1336-770 1477-770 1477-852 1477-852 1477-697 1336-852 1336-770 1477-697 1477-770 1477-770 1336-697 1477-770 1209-852 1336-941 1336-770 1209-697 1336-852 1336-697 1477-770 1336-852 1336-941 1209-852 1209-697 1336-941 1209-770 1209-697 1336-941'
s = s.split(' ')
flag = ''
for i in s:
    _hz1 = int(i[:4])
    _hz2 = int(i[-3:])
    for k in range(len(hz1)):
        if(hz1[k] == _hz1):
            for j in range(len(hz2)):
                if(hz2[j] == _hz2):
                    flag += table[j*4+k]
                    break
print(flag)
import libnum
print(libnum.n2s(int(flag)))
#ctfshow{204254a8-8acf-44cd-9bef-91914782ff94}

摆烂杯

春哥VS曾哥

在第一届马桶电视台的“快乐爷们”比赛上,春哥以微弱票数落后于曾哥。

春哥需要你的帮助来战胜曾哥,成为这个宇宙中最纯的纯爷们!

+-------------+         +-------------+
|      *      |         |   *     *   |
|  *********  |         |    *   *    |
|     *       |         | *********** |
|   *******   |    V    | * *  *  * * |
|    *        |         | *  * * *  * |
| *********** |         | *********** |
|   *     *   |         |             |
|  *********  |         |  *********  |
| * *     * * |    S    |  *       *  |
|   *******   |         |  *********  |
|   *     *   |         |  *       *  |
|   *******   |         |  *********  |
+-------------+         +-------------+

曾哥给你正偶数x和y的值,需要春哥给出正整数n,使得
n mod x = y mod n
成立即可

春哥每回答正确一次,就能在快乐爷们的比赛上获得更多的投票!
帮助春哥战胜曾哥,成为最纯的纯爷们!

挑战进度 [1/233]
(x, y) = (14841211642978820954069852575300, 42280954400278626304294421011093363736)
给出正整数n的值:
n = 

EXP

from pwn import *
p=remote('pwn.challenge.ctf.show',28254)
def pwn():
    z=p.recvuntil(']\n')
    a=str(p.recvline())
    b=a.find('= (')
    c=a.find(',',9)
    d=int(a[b+3:c])#x
    e=int(a[c+2:-4])#y
    if(d>=e):
        p.sendline(str(d+e))
    else:
        f=e%d
        g=(e-f)//d
        h=g*d+f//2
        p.sendline(str(h))
for i in range(233):
    pwn()
    print('进行了',i,'轮爆破')
p.interactive()
[*] Switching to interactive mode
给出正整数n的值:
n = 春哥纯爷们,铁血真汉子!
--------------------------------
=== [第一届“快乐爷们”颁奖典礼] ===
助力春哥成功,春哥最后成为了整个宇宙最纯的纯爷们!
这是春哥的礼物:ctfshow{20f6695e-3373-484d-8dc7-0fb1b223be42}

比烂为主

焦头烂额,烂醉如泥。滚瓜烂熟,海枯石烂。

天真烂漫,破铜烂铁。焦沙烂石,鸱张鱼烂。

查看代码
 #!/usr/bin/env python
from hashlib import sha256
from Crypto.Util.number import *
from secret import flag, x

never_gonna_give_you_up = getPrime(128)
never_gonna_let_you_down = getPrime(128)
never_gonna_run_around_and_desert_you = getPrime(101)

def sign(message, public_key, private_key, n):
    p, q, g, y = public_key
    x = private_key
    k = pow(n * never_gonna_give_you_up + never_gonna_let_you_down, never_gonna_run_around_and_desert_you, q)
    r = pow(g, k, p) % q
    h = int(sha256(message).digest().hex(),16)
    s = (h + x * r) * inverse(k, q) % q
    return (r, s)

def verify(message, signature, public_key):
    p, q, g, y = public_key
    r, s = signature
    r %= q
    s %= q
    assert (r != 0 and s != 0), "NAIVE!"
    w = inverse(s,q)
    h = int(sha256(message).digest().hex(),16)
    u1 = (h * w) % q
    u2 = (r * w) % q
    v = ((pow(g,u1,p) * pow(y,u2,p)) % p) % q
    return v == r

REAL_SHIT = b"I'm a lazy dog!"

BANNER = """
+-------------+
|   *  *   *  |
|   *   *  *  |
|   * * * *   |
| * ** *****  |
| * *         |
| * *         |
| * *         |
|   *  *****  |
|   *         |
|  * *        |
|  * *        |
| *   ******* |
+-------------+

赛事预告: 
比赛名称:ctfshow 摆烂杯 
题目范围:web pwn re misc crypto osint 
题目难度:比烂为主
出题奖励:小份零食礼包
比赛奖励:No.1 巨型零食大礼包
比赛时间:2021年12月24日(周五) 18时整 
比赛时长:48小时 
比赛地址:https://ctf.show/challenges 
投稿邮箱:ctfshow@163.com
"""

MENU = """
[S]ign a message
[V]erify a signature
[G]et flag
[Q]uit
"""

p = 5830410037749547775189245525168918395747363340469807269291718742183814993936817592735262715915879602282249783993968023975099219221323072938605595470459623163126514593995334867344581974290718516752259378064523160010731630848372096789829688620977534625418042717783152391320231563441611047615987945411947074380827751513951208800076656880887541345913934590496332433036743826067033700224359048313855854960843342719268606487143700859456518149623446870445628489881562349440391974416618715512757656830149401253698416423920563660593867251944686917357283228838292330248455750631794980962909862340357643390200563598481041665739
q = 89879135382578731346673843691182780491200282741605331154983882460848740288943
g = 3036574992920223772250338584313974966892939032538629708046720668444956071054307320204635708292091452534235575158505387612798672846101638873982278287387803438764912775944168478521204544925514050450544802147701711167722506267136001245250862233107197865899458167569355135488221182759479681328082327449364576899530469589987892834104390908886440362267402148929694884940168387414269571079309037803880592265516128051687209930799213552028072675347732311504313031872660559576780702919912483902285590354850230968523319609587926112057010327421097518688875811681494733985588983708383345905914523321763478009082916547027506887449
y = 1825339742796901157845239480003358145893636112094511961320205592521669110199034249225428796440245568576051889797537933524337634539711627544578147191029774138174397458079191481625614553664312018055538582991391573222810351262803931151231577005324571986636722469699945585083164013784423319189695442707353395949982699652598353850119461071539420862137096857945164274259294065006699885585311394740730361072189899926530358440241322938460800796822710277137842465412412084712930885209474457802901282885758112884074516660002811808647126713109949943348743131316285896353841289415789801440552082051529082422665008767987865894918

assert (p-1) % q == 0
assert pow(g, x, p) == y

public_key = (p,q,g,y)
private_key = x

used_k = []

def main():
    try:
        print(BANNER)
        print("I... I, I like the REAL SHIT!")
        print("U... U, U like the REAL SHIT!")
        for i in range(5):
            print(MENU)
            choice = input(">>> ").upper()
            if choice == 'S':
                print("Because I'm very nice, I decide to give you an opportunity to pick the value of n.")
                n = input("n = ")

                if len(n) > 16:
                    print("Too long, too simple!")
                    return
                
                n = bytes_to_long(n.encode("utf-8"))

                if n == 0:
                    print("Sometimes naive!")
                    return

                if n in used_k:
                    print("You always make big news!")
                    return

                used_k.append(n)

                message = input("message = ")
                message = message.encode("utf-8")
                if message == REAL_SHIT:
                    print("Never gonna give you up!")
                    return
                    
                signature = sign(message, public_key, private_key, n)
                print("Here is your signature:")
                print(signature)

            elif choice == 'V':
                message = input("message = ")
                message = message.encode("utf-8")
                r = int(input("r = "))
                s = int(input("s = "))
                signature = (r, s)
                if verify(message, signature, public_key):
                    print("Verification AOLIGEI!")
                else:
                    print("Verification GG!")
                    
            elif choice == 'G':
                r = int(input("r = "))
                s = int(input("s = "))
                signature = (r, s)
                if verify(REAL_SHIT, signature, public_key):
                    print("AOLIGEI! Here is you flag.")
                    print(flag)
                    break
            elif choice == 'Q':
                print("886!")
                break
            else:
                raise ValueError
    except:
        print("Never gonna let you down!")
        
if __name__ == "__main__":
    main()

经典的DSA,构造重用k的情形把私钥解出来,再去计算对应的ban掉的字符串的签名

EXP

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

p = remote('pwn.challenge.ctf.show',28267)
c1 = 89879135382578731346673843691182780491200282741605331154983882460848740288944
c1 = str(long_to_bytes(c1).decode("utf-8"))
c2 = 1
c2 = str(long_to_bytes(c2).decode("utf-8"))
p1 = 5830410037749547775189245525168918395747363340469807269291718742183814993936817592735262715915879602282249783993968023975099219221323072938605595470459623163126514593995334867344581974290718516752259378064523160010731630848372096789829688620977534625418042717783152391320231563441611047615987945411947074380827751513951208800076656880887541345913934590496332433036743826067033700224359048313855854960843342719268606487143700859456518149623446870445628489881562349440391974416618715512757656830149401253698416423920563660593867251944686917357283228838292330248455750631794980962909862340357643390200563598481041665739
q = 89879135382578731346673843691182780491200282741605331154983882460848740288943
g = 3036574992920223772250338584313974966892939032538629708046720668444956071054307320204635708292091452534235575158505387612798672846101638873982278287387803438764912775944168478521204544925514050450544802147701711167722506267136001245250862233107197865899458167569355135488221182759479681328082327449364576899530469589987892834104390908886440362267402148929694884940168387414269571079309037803880592265516128051687209930799213552028072675347732311504313031872660559576780702919912483902285590354850230968523319609587926112057010327421097518688875811681494733985588983708383345905914523321763478009082916547027506887449
y = 1825339742796901157845239480003358145893636112094511961320205592521669110199034249225428796440245568576051889797537933524337634539711627544578147191029774138174397458079191481625614553664312018055538582991391573222810351262803931151231577005324571986636722469699945585083164013784423319189695442707353395949982699652598353850119461071539420862137096857945164274259294065006699885585311394740730361072189899926530358440241322938460800796822710277137842465412412084712930885209474457802901282885758112884074516660002811808647126713109949943348743131316285896353841289415789801440552082051529082422665008767987865894918
p.sendline('S')
p.sendline(c1)
p.sendline('hash')
p.recvuntil('Here is your signature:\n')
r1 = int(p.recvuntil(',')[1:-1])
p.recvuntil(' ')
s1 = int(p.recvuntil('\n')[:-2])
p.sendline('S')
p.sendline(c2)
p.sendline('hashhash')
p.recvuntil('Here is your signature:\n')
r2 = int(p.recvuntil(',')[1:-1])
p.recvuntil(' ')
s2 = int(p.recvuntil('\n')[:-2])
print(r1)
print(r2)
h1 = int(hashlib.sha256(b'hash').digest().hex(), 16)
h2 = int(hashlib.sha256(b'hashhash').digest().hex(), 16)
h3 = int(hashlib.sha256(b'I\'m a lazy dog!').digest().hex(), 16)
k = (h1 - h2) * gmpy2.invert(s1 - s2, q) % q
x = (s1 * k - h1) * gmpy2.invert(r1, q) % q
s3 = (h3 + x * r1) * gmpy2.invert(k, q) % q
p.sendline('G')
print(r1)
print(s3)
p.sendline(str(r1))
p.sendline(str(s3))
p.interactive()
#ctfshow{c3b36ebc-083d-44f9-ac85-ac52409d69fd}

easy-peasy

from Crypto.Util.number import *
from secret import flag

p = getPrime(1024)
q = getPrime(1024)
n = p * q
print(f'n = {n}')

l = len(flag)
assert(l == 86)
m = bytes_to_long(b'\x00' * (l - 1) + flag + b'\x00' * (l - 2))
e = 3
c = pow(m, e, n)
print(f'c = {c}')

# n = 23570098360097260908266914080954003513706885568390448463720576188146956287111601604870247233822682630020002051748117520481402155749832096007629686239669192722978473890311246293580246256300691145653885805730865515297134808702766299205253761028235483781919393575836334910012714628455073300114978717047912395404034141622115001451888302617428376998024080880564792294546406688814397757714979980790018933407614160131827023349206138480523080173634617167828920519758917549492886733519381497665596997617399404664611446202014908853898043742964782757859701755202188366852773164911994663079171498909577012208742001609095258401847
# c = 7802816471025387606454709075933309958303134972861203739854774032383575355964299097074709350633475519273512630813578801152996777689686451397201513854823239337669091889776200179028891111154423623765139235199507280104544068425347533121731521700106757148551520759776111224072064131087547685154285120156917449926992033491342535410929828988598182819897435365878832122138552492908774845437576910276499625679469289655841639181182040186931130789588869657335253479416209378458303531995734157105918063227453396477282662136225029972745246845372963076381252679409317314514131852117346576265346926741908194011319430767975281696400

EXP

import gmpy2
from Crypto.Util.number import long_to_bytes
n = 23570098360097260908266914080954003513706885568390448463720576188146956287111601604870247233822682630020002051748117520481402155749832096007629686239669192722978473890311246293580246256300691145653885805730865515297134808702766299205253761028235483781919393575836334910012714628455073300114978717047912395404034141622115001451888302617428376998024080880564792294546406688814397757714979980790018933407614160131827023349206138480523080173634617167828920519758917549492886733519381497665596997617399404664611446202014908853898043742964782757859701755202188366852773164911994663079171498909577012208742001609095258401847
c = 7802816471025387606454709075933309958303134972861203739854774032383575355964299097074709350633475519273512630813578801152996777689686451397201513854823239337669091889776200179028891111154423623765139235199507280104544068425347533121731521700106757148551520759776111224072064131087547685154285120156917449926992033491342535410929828988598182819897435365878832122138552492908774845437576910276499625679469289655841639181182040186931130789588869657335253479416209378458303531995734157105918063227453396477282662136225029972745246845372963076381252679409317314514131852117346576265346926741908194011319430767975281696400
t=gmpy2.invert(pow(2,672),n)
c=c*(pow(t,3))%n
print(c)
for i in range(100000):
    cc=c+i*n
    m,s=gmpy2.iroot(cc,3)
    if s:
        print(m)
        print(long_to_bytes(m))
#ctfshow{345Y_p345Y_4_p13C3_OF_R54_1f_you_533_7H15_yOU_W1ll_KnoW_hoW_7o_5oLV3_17_R1gh7}

你不知道的事

你不知道我为什么离开你

我坚持不能说放任你哭泣

多的是 你不知道的事

#!/usr/bin/env python3
from Crypto.Util.number import*
from secret import p, q, r, m_list

e = 0x10001
n = p*q
nn = pow(p + q, 2)
with open("output.txt", "w") as f:
    tuple(map(lambda x: f.write(f'{x}\n'), (n, (nn - q * (2*p + q)) * r, [pow(r*bytes_to_long(msg), e, n) for msg in m_list])))
350336392818436241006673037360455809220839996064115958462187015485286512057249436547019440062476649505443514098651738159936121443646573582225310523818271104125942886768457217432701426740679016495543992063443366799958766683560661914549464955891710192126614387127366837074901768224628914954689298193756322570196354569620880635510875493806413363847282105594042557667498260791070135569202547919624912099244617108584069460439264231911058930334324022280935682866973559182590509520282167103796695191146958618454814602326531578778259966288593
573093739774281739880497465324092685263915823711852876441834745432568456410102221625375719650292773308032126727181604580236005690908413401576392415559681407745759190144623584347393843006073348197853986086070753589176933840749906637794750425773239166088374393181412845584313742954460701512735153591058956195341230519797798688214294736235453275254874652309267456792260703313363849389064452654585829043355258273931042493838326722259170962855681691567256589120400056064299744659657453065693403307846123412508196914434521591426714103879627371861534251164866853895610531462603087304418181716450557557058898211610235236862425844998997400240639796531132088333397810397479956293705685915597274969354131571826078665118460184593089011322359637358183286463294006375124453420203761834366477474458228510789700322929
[89898944582584020973789466950549408457830939038932249358387612503655795195555422096884799833666742251922472168882857830300816696066287374771223806483320076135289419958839199190498346237915314853272171414388365031403780665326501025174272016787448838195302364018334985629018329002884195674154394723239566844839856417658507710285638929410732920405186497291220408511246377616309537413191798628362924454461591275252204904700199384552556182441714242435048049052849924346923184307804958806765832772245829114683867345667626131391216696899689, 33812096515084618256452999893788088643920391401345153934513672548189747624447462256929481120088559504147546206496009978477670219684471464846374805269490982711526189632840319476694031165040509612461031037648842800590564014250560755810419521454243873196046994087699973694601771430727339272822037734155999106640385474808535709328128758566536567671671830150141566358873618604215340293370920009424704341994836991762627074734590893234791360899702652597495786232636330758721367480673134068863004189116844336060469741073692904371927139133722, 165597780736305003544731692526718694749728874202404240957432570699448379364482346437150347527832010790233999217142080300732670075125412674512503980126900838991252255164396883558549394116950798518926689440199110080228819117138781860917403950951967540970781541231010268193512414521594202106343921742119549651371730625167392845202521095381018336989463974801068484087072560065035649874446258848941496165775497316520649484444881183733860284051655238231636623911375618798690243476530246948439456236235401757338854891063282217775958794995745, 343251901609139542790113721164276680098978640414899039013667054116917413622808455594636178385019352052479200575976527788323766101507955663148714586248544957973599508855562447120289288572324215560847075890352824057136074574991712337176629893468027728547868226055216064005013547658466062296320675989519066547785291332321157363331264717742352976949093961387251696286193469303638414643596210259330285879950850500285599085498327203000562836085330967791310939794275556792949996672546744246652126493764793860406858652233358095852750878540081, 235558105517391327158628807333643769354192032940101393420332989713938205670505266624207961749730046003806116954190050761036483820885689002715832066788622173495117477589484435790306803669296578562896874152068142513068134869082505431417379744201527484731564032852458988008319108511119176172180777686608628256793768481218312094231331674417809296209078403224182128847928034138428461092574467963043436998953480785056106219665263203628123390561367953968685529615140735922690792960539507764001349095265873613774266818288573196305003243070778, 206298434704433522845578108831428110003790119487931970738888039164536917807234886047156371252698839186942305601748833972037310756303355179810558700138908971432421388606481030563222653741828528058342710871625859076908576529437180635995804921109213240361355222584200854186867174895690064552128078187608016067225982760659583758234983722052092257728304169872710854406782157743817628582324989498358685913170041241246640992240324865882698155754351377568740671178211925302608074173797143559096684194291298251909091573996528657077192853181260, 36487367417507265630935593365779630473676964287536766558005664163045352296272489048542949235874130457192000405426331684490434707010018827118902878187337490784093222472568744442539283588671102779015032926396387260501920905328795279131487712044269047848633567671879093387147342485236898502427257453100280521600748798766053248002511321476363489185199023928655234168190945495882429772128843733558229234023959538562667994768319132887453685752782219568160149867876167562202009091920357293918699750499383044786342224656399599051204381739004, 309271280118395537586429344515401906816041052708153406469776432295726933625817306667305532317592678081843468516403646798245212166051522673554599771416359093679365707647048360132177615596129334882080769416741195541820024300070308193919243339428816326284229538805386520669378190822939952968945373773708537153918307617796049994943589208832996080074737815964953695819438815693553128281952711145471733312674749474562474876721698774304347719865787749770926045900616913272452288808766681076718053329732116904151613148980379250671714736445362, 323455469885380404569320346558397183450561615531953001767207037908862624213596789538428906826510706882759547099956559147639179408191712248879253394984304144177939097113688614339132503359514062401536150993887057270412598698921210276643517660663957284896862049372552685579873164247324298838427031934120305100245197507668286412245927082014734818302849041404249651712101104345560490339664127211725924552614889054902096778798057491548216092262516251483892444257497651545579130199267759495494008199333958561051854052996377401281449374844134, 340273329238629083001327160999510645254991441462478242063143137905833038098072043370534813829841242189326663899950174580692484226040773837264378264628798472456337303988207440541027300360259533883932344911135772685621042291058406371074448709451739318233872073094812866435247028965381114312995920240420393991426211326560644063614138793760655228337080075592706210814962322959865284491207497354560587490749862967280004283692054803772925802355389235040164681128367421928105235602197434705771946707319171123855548430926739956654585759979072, 9955581057640031760417924041920756881533665340907131458643940497306573566006697114094784223729429194818022621617622995124774853765104805207556635385513717217754835264955349672191290466975902789744974887812451242796384827531968140600710093600841958023236583008517851958267386814619531789479024265847003804898757662563984920806557105955006601925437495049783614963812218055267671051411627591065389686753632983785451144348177336048827450107056685244841625065261846023056268929462465071537831246746478233852118451808652331499089658656197]

给的hint数据具有因子p,使用gcd把n分解

EXP

import gmpy2
from Crypto.Util.number import *
n=350336392818436241006673037360455809220839996064115958462187015485286512057249436547019440062476649505443514098651738159936121443646573582225310523818271104125942886768457217432701426740679016495543992063443366799958766683560661914549464955891710192126614387127366837074901768224628914954689298193756322570196354569620880635510875493806413363847282105594042557667498260791070135569202547919624912099244617108584069460439264231911058930334324022280935682866973559182590509520282167103796695191146958618454814602326531578778259966288593
a=573093739774281739880497465324092685263915823711852876441834745432568456410102221625375719650292773308032126727181604580236005690908413401576392415559681407745759190144623584347393843006073348197853986086070753589176933840749906637794750425773239166088374393181412845584313742954460701512735153591058956195341230519797798688214294736235453275254874652309267456792260703313363849389064452654585829043355258273931042493838326722259170962855681691567256589120400056064299744659657453065693403307846123412508196914434521591426714103879627371861534251164866853895610531462603087304418181716450557557058898211610235236862425844998997400240639796531132088333397810397479956293705685915597274969354131571826078665118460184593089011322359637358183286463294006375124453420203761834366477474458228510789700322929
c=[89898944582584020973789466950549408457830939038932249358387612503655795195555422096884799833666742251922472168882857830300816696066287374771223806483320076135289419958839199190498346237915314853272171414388365031403780665326501025174272016787448838195302364018334985629018329002884195674154394723239566844839856417658507710285638929410732920405186497291220408511246377616309537413191798628362924454461591275252204904700199384552556182441714242435048049052849924346923184307804958806765832772245829114683867345667626131391216696899689, 33812096515084618256452999893788088643920391401345153934513672548189747624447462256929481120088559504147546206496009978477670219684471464846374805269490982711526189632840319476694031165040509612461031037648842800590564014250560755810419521454243873196046994087699973694601771430727339272822037734155999106640385474808535709328128758566536567671671830150141566358873618604215340293370920009424704341994836991762627074734590893234791360899702652597495786232636330758721367480673134068863004189116844336060469741073692904371927139133722, 165597780736305003544731692526718694749728874202404240957432570699448379364482346437150347527832010790233999217142080300732670075125412674512503980126900838991252255164396883558549394116950798518926689440199110080228819117138781860917403950951967540970781541231010268193512414521594202106343921742119549651371730625167392845202521095381018336989463974801068484087072560065035649874446258848941496165775497316520649484444881183733860284051655238231636623911375618798690243476530246948439456236235401757338854891063282217775958794995745, 343251901609139542790113721164276680098978640414899039013667054116917413622808455594636178385019352052479200575976527788323766101507955663148714586248544957973599508855562447120289288572324215560847075890352824057136074574991712337176629893468027728547868226055216064005013547658466062296320675989519066547785291332321157363331264717742352976949093961387251696286193469303638414643596210259330285879950850500285599085498327203000562836085330967791310939794275556792949996672546744246652126493764793860406858652233358095852750878540081, 235558105517391327158628807333643769354192032940101393420332989713938205670505266624207961749730046003806116954190050761036483820885689002715832066788622173495117477589484435790306803669296578562896874152068142513068134869082505431417379744201527484731564032852458988008319108511119176172180777686608628256793768481218312094231331674417809296209078403224182128847928034138428461092574467963043436998953480785056106219665263203628123390561367953968685529615140735922690792960539507764001349095265873613774266818288573196305003243070778, 206298434704433522845578108831428110003790119487931970738888039164536917807234886047156371252698839186942305601748833972037310756303355179810558700138908971432421388606481030563222653741828528058342710871625859076908576529437180635995804921109213240361355222584200854186867174895690064552128078187608016067225982760659583758234983722052092257728304169872710854406782157743817628582324989498358685913170041241246640992240324865882698155754351377568740671178211925302608074173797143559096684194291298251909091573996528657077192853181260, 36487367417507265630935593365779630473676964287536766558005664163045352296272489048542949235874130457192000405426331684490434707010018827118902878187337490784093222472568744442539283588671102779015032926396387260501920905328795279131487712044269047848633567671879093387147342485236898502427257453100280521600748798766053248002511321476363489185199023928655234168190945495882429772128843733558229234023959538562667994768319132887453685752782219568160149867876167562202009091920357293918699750499383044786342224656399599051204381739004, 309271280118395537586429344515401906816041052708153406469776432295726933625817306667305532317592678081843468516403646798245212166051522673554599771416359093679365707647048360132177615596129334882080769416741195541820024300070308193919243339428816326284229538805386520669378190822939952968945373773708537153918307617796049994943589208832996080074737815964953695819438815693553128281952711145471733312674749474562474876721698774304347719865787749770926045900616913272452288808766681076718053329732116904151613148980379250671714736445362, 323455469885380404569320346558397183450561615531953001767207037908862624213596789538428906826510706882759547099956559147639179408191712248879253394984304144177939097113688614339132503359514062401536150993887057270412598698921210276643517660663957284896862049372552685579873164247324298838427031934120305100245197507668286412245927082014734818302849041404249651712101104345560490339664127211725924552614889054902096778798057491548216092262516251483892444257497651545579130199267759495494008199333958561051854052996377401281449374844134, 340273329238629083001327160999510645254991441462478242063143137905833038098072043370534813829841242189326663899950174580692484226040773837264378264628798472456337303988207440541027300360259533883932344911135772685621042291058406371074448709451739318233872073094812866435247028965381114312995920240420393991426211326560644063614138793760655228337080075592706210814962322959865284491207497354560587490749862967280004283692054803772925802355389235040164681128367421928105235602197434705771946707319171123855548430926739956654585759979072, 9955581057640031760417924041920756881533665340907131458643940497306573566006697114094784223729429194818022621617622995124774853765104805207556635385513717217754835264955349672191290466975902789744974887812451242796384827531968140600710093600841958023236583008517851958267386814619531789479024265847003804898757662563984920806557105955006601925437495049783614963812218055267671051411627591065389686753632983785451144348177336048827450107056685244841625065261846023056268929462465071537831246746478233852118451808652331499089658656197]
e=65537
p=gmpy2.gcd(n,a)
q=n//p
r=a//pow(p,2)
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
for i in range(len(c)):
    m=pow(c[i],d,n)//r
    print(long_to_bytes(m))
print(long_to_bytes(p))
print(long_to_bytes(q))
#ctfshow{10553d2e-a044-465b-9eb9-361d211bfeea}

卷王杯(部分)

概率RSA

连接靶机得到

Welcome to CTFshow the king of juan cup!

PublicKey:

N = 122833738906284888100946964203429293219026335612565869047933508262272793463606966512013065349558876320466128494031594170759204622304626408901331148270932784562542015474865881970380948070800622871976076756297754364622158752938209458335514328760040917346579397345760184841000470065288448174449310734841081088551

e = 65537

c = 106366402269468450427824707894273326962805204677764933858564074876371771973503949670992865114072146466993270093294859440966190409925883366198980571011809950468832979822107366967964245292791542683155759472220928415312721662138602632137998952777842885281048218992030770667714925378927430247924039163347156310292

temp_c = 

来看看大佬的解决方法:https://blog.csdn.net/qq_53283643/article/details/123423241

由于交互时间太长,请耐心等待。。

EXP

# https://introspelliam.github.io/2018/03/27/crypto/RSA-Least-Significant-Bit-Oracle-Attack/
from pwn import *
from Crypto.Util.number import *
import re

if len(sys.argv) > 1:
    p = remote('pwn.challenge.ctf.show', 28144)
else:
    p = remote('pwn.challenge.ctf.show', 28144)
# context.log_level = 'debug'
def oracle(c):
    l = []
    for i in range(20):
        p.sendline(str(c))
        s = p.recvuntil(b"temp_c = ")
        l.append(int(re.findall(b"\)\s*=\s*([0-9]*)", s)[0]))
    flag0 = 0
    flag2 = 0
    for i in range(20):
        if l[i] % 2 != 0:
            flag0 = 1
        if l[i] > 10000:
            flag2 = 1
    return [flag2, flag0]


def main():
    ss = p.recvuntil(b"temp_c = ")
    N = int(re.findall(b"N\s*=\s*(\d+)", ss)[0])
    e = int(re.findall(b"e\s*=\s*(\d+)", ss)[0])
    C = int(re.findall(b"c\s*=\s*(\d+)", ss)[0])
    print("N=", N)
    print("e=", e)
    print("c=", C)
    c = (pow(2, e, N) * C) % N
    LB = 0
    UB = N
    i = 1
    while LB != UB:
        flag = oracle(c)
        print(i, flag)
        if flag[1] % 2 == 0:
            UB = (LB + UB) // 2
        else:
            LB = (LB + UB) // 2
        c = (pow(2, e, N) * c) % N
        i += 1
    print(LB)
    print(UB)
    for i in range(-128, 128):
        temp = LB
        temp += i
        if pow(temp, e, N) == C:
            print(long_to_bytes(temp))
            exit(0)


if __name__ == '__main__':
    main()
    p.interactive()
#ctfshow{253cc3b2-1003-4e24-9f68-1d740c73b21c}

密码签到

密文:

Y3NldHRfZl9jc2FyaF95b3Nwd2l0JTdCbW9qcCF1bCU3RA==

base64+URL+栅栏

最后栅栏解码

ctfshow{just_a_simple_crypto!}

芜湖起飞

起飞芜湖

这波啊这波是……

查看代码
 from Crypto.Cipher import AES
from Crypto.Util.number import *
from Crypto.Util.Padding import pad
import random

def woohoo():
    a = random.getrandbits(32)
    b = random.getrandbits(32)
    c = random.getrandbits(32)
    d = random.getrandbits(32)
    return (a<<96)+(b<<64)+(c<<32)+(d)

BANNER = """
+-------------+
|    *   *    |
|    *   *    |
| *********** |
|    *   *    |
|             |
|  *********  |
|      *      |
|     *       |
| *********** |
|    *  *     |
|    *  *     |
|   *   *   * |
| **    ***** |
+-------------+

赛事预告: 
比赛名称:ctfshow 卷王杯 
题目难度:无 
出题奖励:usb小台灯+周边钥匙扣 
比赛奖励:单项第1送定制妹子贴纸,单项AK取前3 
比赛时间:2022年2月25日(周五) 18时整 
比赛时长:48小时 
比赛地址:https://ctf.show/challenges 
投稿邮箱:ctfshow@163.com
"""

MENU = """
+-----------------+
|[E]ncrypt        |
|[T]est encryption|
|[8]86            |
+-----------------+
"""

if __name__ == '__main__':
    print(BANNER)
    # 我只泄露一点线索
    # 是谁为爱走钢索
    for i in range(130):
        print(MENU)
        option = input("> ").lower()
        if option == "e":
            print("Enter your message.")
            msg = input("> ").encode()
            msg = pad(msg, AES.block_size)
            key = woohoo()
            iv = woohoo()
            key = long_to_bytes(key).rjust(AES.block_size, b"\x00")
            iv = long_to_bytes(iv).rjust(AES.block_size, b"\x00")
            
            c = AES.new(key, AES.MODE_CBC, iv=iv)
            ct = c.encrypt(msg)
            
            iv = b"never gonna give you up"
            
            print(f"Ciphertext (hex): {ct.hex()}")
            print(f"Key (hex): {key.hex()}")
            print(f"IV (hex): {iv.hex()}")
        elif option == "t":
            flag = open("flag.txt", "rb").read()
            msg = pad(flag, AES.block_size)
            key = woohoo()
            iv = woohoo()

            key = long_to_bytes(key)
            iv = long_to_bytes(iv)
            
            c = AES.new(key, AES.MODE_CBC, iv=iv)
            ct = c.encrypt(msg)
            
            key = b"never gonna let you down"
            
            print(f"Ciphertext (hex): {ct.hex()}")
            print(f"Key (hex): {key.hex()}")
            print(f"IV (hex): {iv.hex()}")
        elif option == "8":
            print("Sa yo na la!")
            break
        else:
            print("What r u DOIN?")
    else:
        print("Never gonna run around and desert you")

考点:

思路就是收集624个连续随机数然后预测后面的key

key是给了的,但iv被字符串掩盖了,我们利用ECB模式恢复即可

from pwn import *
from Crypto.Cipher import AES
from Crypto.Util.number import *
from randcrack import RandCrack
p=remote('pwn.challenge.ctf.show',28189)
def woohoo():
    a = rc.predict_getrandbits(32)
    b = rc.predict_getrandbits(32)
    c = rc.predict_getrandbits(32)
    d = rc.predict_getrandbits(32)
    return (a<<96)+(b<<64)+(c<<32)+(d)

def split1(m):
 temp=bin(m)[2:].rjust(128,'0')
 for i in range(4):
  rc.submit(int(temp[32*i:32*(i+1)],2))

rc=RandCrack()
pay='hashhashhashhas'
pay1=bytes_to_long(b'hashhashhashhas\x01')
for i in range(78):
 p.sendline('e')
 p.recvuntil('> ')
 p.sendline(pay)
 p.recvuntil('Ciphertext (hex): ')
 c=int(p.recvline()[:-1],16)
 p.recvuntil('Key (hex): ')
 key=int(p.recvline()[:-1],16)
 key1 = long_to_bytes(key).rjust(AES.block_size, b"\x00")
 aes=AES.new(key1,AES.MODE_ECB)
 iv=bytes_to_long(aes.decrypt(long_to_bytes(c)))^pay1
 split1(key)
 split1(iv)


p.sendline('t')
p.recvuntil('Ciphertext (hex): ')
c=int(p.recvline()[:-1],16)
p.recvuntil('IV (hex): ')
ivv=int(p.recvline()[:-1],16)
print(bin(ivv))
key = woohoo()
iv = woohoo()
print(bin(iv))
key = long_to_bytes(key)
iv = long_to_bytes(iv)
c=long_to_bytes(c)
aes=AES.new(key,AES.MODE_CBC,iv)
print(aes.decrypt(c))
#ctfshow{dd784a04-17a8-45ca-8cc5-bb60e98e5391}

真·简单·不卷·现代密码签到

真(实)
简单
不卷
现代
签到

from Crypto.Util.number import bytes_to_long
from secrets import p,q,r,s,t,flag

n = p * q * r * s * t
e = 2
m = bytes_to_long(os.urandom(500) + flag)
c = pow(m,e,n)

print(p,q,r,s,t,sep='\n')
print(c)

'''
145332367700944303747548912160113939198078051436029477960348968315913956664143693347226702600438608693933768134575289286283267810723137895903153829001826223446477799895493265422562348917012216790077395795861238257357035152687833639085415763850743538206986781418939737511715957738982536382066693822159860701263
116660458253067608044065523310547233337730583902133756095473339390057738510707447906971188577217274861047379404014140178165569604404468897712846876108444468370709141219302291601408652742006268186059762087155933131837323952675627966299810891805398890428420575425160696531236660480933905879208166090591482794763
157931722402853245421436270609912823260313730941283152856444641969403238646482562190531038393124087232554754746464603598717356255570166081501573727336977292059427220330169044611674973569766966838498453232642731737958791706086957762244686953294662693939604300864961637325536379321027705854708492453330690705531
100973451687449518854742673778783266158999451072058606348222018797891147675959983616210003484476577612134482311993701677242007759556951494382833070563369964294544839433671087037596159753825249018950693369209927951667775267086896180395776150188902057785214767230658487267587289809918132337927575673868568976679
93960345071948255233882121683650797512129333868351496468898834736770441398743300745703393838320587998953678254272245400344928586394089488734271897540051673996675973642347859306921527430850673334243441180183460927865980713929789963587608547554858491264614271309608925634272282292964002897650355047792764365447
9144597920381774885442906257311149465702295057238600973973598305004391534618770363098565074541384771979931799878381439264848137810353858418200992191234142740194489573540381681161219332611454834544291634628456257670178843484698324641739324687497388018406214041657278323855749902661752448796122517061920880552011343608609622885787617238758769398972009949575526258430282648817039091284796330585349957724522615105102735930258969562103112238020133587096826386028128471852377225525357348919204333121695432662339443004327748973224423132988376298843862056631045488285859621661802413201793962883794915513510467912312842687601478117040419013468059983777273699192408773551806581458197324620065210523913467414181480875280203580147077789063808832356486197271376615883221558265591069223727607585313240243619515521180600435114131162272519949101464089935441251751426683447701142156416866113627126765919641034042927519834229168536331952275698122511502745177547569813354280565828372968703810158857859460406828090199683324760956105682902577189283246483314689365570862217407333103243336691401424548702387876409228977278498691200028282744239512091373110111792177228979867318546462714521296256938374618636206565791541769138267080789842400796973226733816939794717596194090232425688504890234304977612220790858557639246367437740975495450011676714198668471438814299689325208882261918460708833888406187912527346628912894921059735420931656953236560178909180587372589456926690219114173193202048332172538564489660440225377822914097420807957784201785024166011709377791129
'''

类似于rabin,直接有限域开方

EXP

#sage#
p=145332367700944303747548912160113939198078051436029477960348968315913956664143693347226702600438608693933768134575289286283267810723137895903153829001826223446477799895493265422562348917012216790077395795861238257357035152687833639085415763850743538206986781418939737511715957738982536382066693822159860701263
q=116660458253067608044065523310547233337730583902133756095473339390057738510707447906971188577217274861047379404014140178165569604404468897712846876108444468370709141219302291601408652742006268186059762087155933131837323952675627966299810891805398890428420575425160696531236660480933905879208166090591482794763
r=157931722402853245421436270609912823260313730941283152856444641969403238646482562190531038393124087232554754746464603598717356255570166081501573727336977292059427220330169044611674973569766966838498453232642731737958791706086957762244686953294662693939604300864961637325536379321027705854708492453330690705531
s=100973451687449518854742673778783266158999451072058606348222018797891147675959983616210003484476577612134482311993701677242007759556951494382833070563369964294544839433671087037596159753825249018950693369209927951667775267086896180395776150188902057785214767230658487267587289809918132337927575673868568976679
t=93960345071948255233882121683650797512129333868351496468898834736770441398743300745703393838320587998953678254272245400344928586394089488734271897540051673996675973642347859306921527430850673334243441180183460927865980713929789963587608547554858491264614271309608925634272282292964002897650355047792764365447
c=9144597920381774885442906257311149465702295057238600973973598305004391534618770363098565074541384771979931799878381439264848137810353858418200992191234142740194489573540381681161219332611454834544291634628456257670178843484698324641739324687497388018406214041657278323855749902661752448796122517061920880552011343608609622885787617238758769398972009949575526258430282648817039091284796330585349957724522615105102735930258969562103112238020133587096826386028128471852377225525357348919204333121695432662339443004327748973224423132988376298843862056631045488285859621661802413201793962883794915513510467912312842687601478117040419013468059983777273699192408773551806581458197324620065210523913467414181480875280203580147077789063808832356486197271376615883221558265591069223727607585313240243619515521180600435114131162272519949101464089935441251751426683447701142156416866113627126765919641034042927519834229168536331952275698122511502745177547569813354280565828372968703810158857859460406828090199683324760956105682902577189283246483314689365570862217407333103243336691401424548702387876409228977278498691200028282744239512091373110111792177228979867318546462714521296256938374618636206565791541769138267080789842400796973226733816939794717596194090232425688504890234304977612220790858557639246367437740975495450011676714198668471438814299689325208882261918460708833888406187912527346628912894921059735420931656953236560178909180587372589456926690219114173193202048332172538564489660440225377822914097420807957784201785024166011709377791129
PR.<x>=PolynomialRing(Zmod(p))
f=x^2-c
aes1=f.roots()
PR.<x>=PolynomialRing(Zmod(q))
f=x^2-c
aes2=f.roots()
PR.<x>=PolynomialRing(Zmod(r))
f=x^2-c
aes3=f.roots()
PR.<x>=PolynomialRing(Zmod(s))
f=x^2-c
aes4=f.roots()
PR.<x>=PolynomialRing(Zmod(t))
f=x^2-c
aes5=f.roots()
for i1 in aes1:
    for i2 in aes2:
        for i3 in aes3:
            for i4 in aes4:
                for i5 in aes5:
                    m=int(crt([int(i1[0]),int(i2[0]),int(i3[0]),int(i4[0]),int(i5[0])],[p,q,r,s,t]))
                    m=m.to_bytes(1000,'big')
                    if b'ctfshow'in m:
                        print(m)
#ctfshow{D0_y0u_R3aLly_Kn0w_Ra8IN_alg0RI7HM?}

单身杯(部分)

The Dancing Men

考点:跳舞的小人

对应解码得到

ctfshow{Everyone_Loves_Taoshen}

古典base

The flag is:YsMQZk3wSzi4RZ0N0MmGxm0TcQMQZA21mtm4hNQOUNvG3Gw2dNLJYZ3kTkz9

考点:栅栏 + base64

ctfshow的base64编码是:Y3Rmc2hvdw==

栅栏解码得到

Y3Rmc2hvd3swZGQ1NGNkMS0xMmQ3LTQzNmQtOGJkZi00ZmUwYzk4MTA4N2Z9

base64解码

ctfshow{0dd54cd1-12d7-436d-8bdf-4fe0c981087f}

伪装成RSA的MUSC

感谢@三哈师傅供题,太棒了!

nnkyiee是什么意思呢?

flag格式ctfshow{}

Unlock Hint for 0 points

hint1:敲击码

Unlock Hint for 0 points

hint2:压缩包密码纯数字,非爆破密码考点

.. .. ... . . .. ... .. .. ... . . .. ... .. .. . . ... . . ...

提示敲击码

对照敲击码表得出 22 31 12 32 23 11 23 22 11 31 13 即GLBMHAHGALC

对应提示:nnkyiee是什么意思呢? 九键?

对应九键位置可得 45264244252 即压缩包密码,打开压缩包

p = 104791011181838632984653274103788907544368791187076335471213944302284807790748266682463882231027996693193572906324997830449026622973759383503770415564182978292591648950046318334646695444450310198889173256818225657021740635305655975465047235964535452899499225672868835617089387862240683251385991237767922785241
q = 90960275501044744928190829668121052091907954961680699856419749850071871964532625791461291878837850007468243999602408861075793822642812918261908705981765163097854558645253227202861087920836248185116835897960441132756288108873425215132591817120886993422056486860736156966942973556049071468967279588398766107387
我e呢?
c = 4760904535528937856481690262397732355407727622511444072793643008141049985355461179480947416206998527526080939575085820881304511476110146502666062305981955205407338190002810791950980724498999422997162030791074913110508848669455374727003737734373054800682699103953435264256125566100583042576647316240024759470816653960355845811060204737625557855881058175018971502763224693108395514674517119000539255761180454879538780379694450171070008832544248927030602002726819086629963953652235265972324121785879653123472819473679133833118153759368617324927859670207154545276222169571548729874270877516947380905110040442091750015568

发现没有e 根据文本名字套!都能套!!!点阵还可以转换为摩斯电码,1个 . 代表 . ,两个是 - 三个是空格 ,得到

-- ..- -- ..- --.. ..

解码得到

MUMUZI

再次九键转数字得: e = 686894

考点:e与phi不互素

EXP

import gmpy2
from Crypto.Util.number import *

# 当e约去公约数后与phi互素
def decrypt(p, q, e, c):
    n = p * q
    phi = (p - 1) * (q - 1)
    t = gmpy2.gcd(e, phi)
    d = gmpy2.invert(e // t, phi)
    m = pow(c, d, n)
    print(m)
    msg = gmpy2.iroot(m, t)
    print(msg)
    if msg[1]:
        print(long_to_bytes(msg[0]))
e=686894
p = 104791011181838632984653274103788907544368791187076335471213944302284807790748266682463882231027996693193572906324997830449026622973759383503770415564182978292591648950046318334646695444450310198889173256818225657021740635305655975465047235964535452899499225672868835617089387862240683251385991237767922785241
q = 90960275501044744928190829668121052091907954961680699856419749850071871964532625791461291878837850007468243999602408861075793822642812918261908705981765163097854558645253227202861087920836248185116835897960441132756288108873425215132591817120886993422056486860736156966942973556049071468967279588398766107387
c= 4760904535528937856481690262397732355407727622511444072793643008141049985355461179480947416206998527526080939575085820881304511476110146502666062305981955205407338190002810791950980724498999422997162030791074913110508848669455374727003737734373054800682699103953435264256125566100583042576647316240024759470816653960355845811060204737625557855881058175018971502763224693108395514674517119000539255761180454879538780379694450171070008832544248927030602002726819086629963953652235265972324121785879653123472819473679133833118153759368617324927859670207154545276222169571548729874270877516947380905110040442091750015568

decrypt(p, q, e, c)
#flag{6fdc75bc-bc40-43de-9243-7e6816ef617e}

七夕杯(部分)

密码签到

大牛在今年的hvv过程中,渗透进某业务系统,发现了密文,可是不知道如何解出明文,你能帮他找出来吗?

已知密文由两部分组成,后面的推测为秘钥

密文如下:

y3rmc2hvd3tjcnlwdg9fc2lnbmlux2lzx2vhc3l9-a0004008a0

分析密匙和密文长度

print(len(bin(int('a0004008a0', 16))[2:]))
#40
print(len("y3rmc2hvd3tjcnlwdg9fc2lnbmlux2lzx2vhc3l9"))
#40

都是40,把密匙打印出来

print(bin(int('a0004008a0', 16))[2:])
1010000000000000010000000000100010100000

猜测密文按密钥相应位改变了大小写

EXP

from base64 import b64decode as b64
key = bin(int('a0004008a0', 16))[2:]
c = "y3rmc2hvd3tjcnlwdg9fc2lnbmlux2lzx2vhc3l9"
for i in range(len(c)):
    if key[i] == '1':
        c = c[:i] + c[i].upper() + c[i + 1:]
flag = b64(c)
print(flag)
#ctfshow{crypto_signin_is_easy}

Lucky 𝟕

感谢@Z 师傅供签到题

七夕,你的幸运数字 —— 7

查看代码
 from Crypto.Util.number import bytes_to_long, getPrime
from secret import flag

l = len(flag)
assert l == 56
x = bytes_to_long(flag[:l//2])
y = bytes_to_long(flag[l//2:])

p = getPrime(1024)
e = 0x10001

x = pow(x, e, p)
y = pow(y, e, p)

a = (7 * x + x * y + 77 * y ** 7) % p
b = (x ** 7 + 777 * y) % p

print(f'p = {p}')
print(f'a = {a}')
print(f'b = {b}')

# p = 160676801612994301361202519503059426958636739446670462398261976532859847492256822690640058297338763725128097587993428329580105931247817467950370089691908132361316857330836120708767594061772979871315614755470773991633234068651435625372887767258609941208307491359777513843529144444836847722372845148836203335627
# a = 30318995909014771647618268716833486449002423009996671727903532973647046764624121316716790986592523978549131384964872198795285872746623966910764159262479160147876027157581577141632378119375701270068263640642243000011932466519579133761464923463402462812787531220639360431295348786697861069940729757964584951972
# b = 51036630170491152581994259808984114372634216659979376101433163181132141957563047348137651942358538069256102718534893846618166559129391336639526588292370462975735415885732360576961407017238385374280336346614960555565504032093702784952402038043052556719843691506943605133036720410419999467125928578673380637828

使用 Sylvester 结式法直接解即可

# Sage
from sage.matrix.matrix2 import Matrix

def resultant(f1, f2, var):
    return Matrix.determinant(f1.sylvester_matrix(f2, var))

p = 160676801612994301361202519503059426958636739446670462398261976532859847492256822690640058297338763725128097587993428329580105931247817467950370089691908132361316857330836120708767594061772979871315614755470773991633234068651435625372887767258609941208307491359777513843529144444836847722372845148836203335627
a = 30318995909014771647618268716833486449002423009996671727903532973647046764624121316716790986592523978549131384964872198795285872746623966910764159262479160147876027157581577141632378119375701270068263640642243000011932466519579133761464923463402462812787531220639360431295348786697861069940729757964584951972
b = 51036630170491152581994259808984114372634216659979376101433163181132141957563047348137651942358538069256102718534893846618166559129391336639526588292370462975735415885732360576961407017238385374280336346614960555565504032093702784952402038043052556719843691506943605133036720410419999467125928578673380637828
e = 0x10001

P.<x, y> = PolynomialRing(Zmod(p))
f1 = 7 * x + x * y + 77 * y ** 7 - a
f2 = x ** 7 + 777 * y - b

hx = resultant(f1, f2, y)
rx = hx.univariate_polynomial().roots()
x, _ = zip(*rx)
y = [((b - i^7) * inverse_mod(777, p)) % p for i in x]

d = inverse_mod(e, p-1)

for i in range(len(x)):
    m1 = pow(x[i], d, p)
    m2 = pow(y[i], d, p)
    try:
        print(bytes.fromhex(hex(m1)[2:]).decode(),end='')
        print(bytes.fromhex(hex(m2)[2:]).decode())
    except:
        pass
#ctfshow{1t_Is_S0o0o0o0o_3A5Y_70_50Lv3_m0duLaR_EqUAt10nS}

77×SES

来签到,简单加密标准(SES, Simple Encryption Standard)......

查看代码
 from Crypto.Util.Padding import pad
from secret import flag

S = [
    0x11,0x79,0x76,0x8b,0xb8,0x40,0x02,0xec,0x52,0xb5,0x78,0x36,0xf7,0x19,0x55,0x62,
    0xaa,0x9a,0x34,0xbb,0xa4,0xfc,0x73,0x26,0x4b,0x21,0x60,0xd2,0x9e,0x10,0x67,0x2c,
    0x32,0x17,0x87,0x1d,0x7e,0x57,0xd1,0x48,0x3c,0x1b,0x3f,0x37,0x1c,0x93,0x16,0x24,
    0x13,0xe1,0x1f,0x91,0xb3,0x81,0x1e,0x3d,0x5b,0x6c,0xb9,0xf2,0x83,0x4c,0xd5,0x5a,
    0xd0,0xe7,0xca,0xed,0x29,0x90,0x6f,0x8f,0xe4,0x2f,0xab,0xbe,0xfe,0x07,0x71,0x6b,
    0x59,0xa3,0x8a,0x5e,0xd7,0x30,0x2a,0xa0,0xac,0xbd,0xd4,0x08,0x4f,0x06,0x31,0x72,
    0x0d,0x9f,0xad,0x0b,0x23,0x80,0xe6,0xda,0x75,0xa8,0x18,0xe2,0x04,0xeb,0x8e,0x15,
    0x64,0x77,0x2b,0x03,0xa1,0x5d,0xb4,0xb1,0xf0,0x97,0xe3,0xe8,0xb0,0x05,0x86,0x38,
    0x56,0xef,0xfa,0x43,0x94,0xcb,0xb6,0x69,0x5f,0xc7,0x27,0x7c,0x44,0x8d,0xf3,0xc8,
    0x99,0xc2,0xbc,0x82,0x65,0xdb,0xaf,0x51,0x20,0x7f,0xc3,0x53,0xf4,0x33,0x4d,0x50,
    0xee,0xc5,0x12,0x63,0x9b,0x7b,0x39,0x45,0xa9,0x2d,0x54,0xdc,0xdf,0xd6,0xfd,0xa7,
    0x5c,0x0c,0xe9,0xb2,0xa2,0xc1,0x49,0x00,0xae,0xea,0x58,0x6d,0xce,0x88,0xf8,0x96,
    0xde,0x1a,0x0f,0x89,0xd3,0x7a,0x46,0x22,0xc6,0xf9,0xd9,0x84,0x2e,0x6a,0xc9,0x95,
    0xa5,0xdd,0xe0,0x74,0x25,0xb7,0xfb,0xbf,0x9c,0x4a,0x92,0x0e,0x09,0x9d,0xf6,0x70,
    0x61,0x66,0xc0,0xcf,0x35,0x98,0xf5,0x68,0x8c,0xd8,0x01,0x3e,0xba,0x6e,0x41,0xf1,
    0xa6,0x85,0x3a,0x7d,0xff,0x0a,0x14,0xe5,0x47,0xcd,0x28,0x3b,0xcc,0x4e,0xc4,0x42
]

def xor(block):
    for i in range(4):
        for j in range(4):
            block[i][j] ^= block[(i + 2) % 4][(j + 1) % 4]

def add(block):
    for i in range(4):
        for j in range(4):
            block[i][j] += 2 * block[(i * 3) % 4][(i + j) % 4]
            block[i][j] &= 0xFF

def sub(block):
    for i in range(4):
        for j in range(4):
            block[i][j] = S[block[i][j]]

def rotate(row):
    row[0], row[1], row[2], row[3] = row[3], row[1], row[2], row[0]

def transpose(block):
    copyBlock = [[block[i][j] for j in range(4)] for i in range(4)]
    for i in range(4):
        for j in range(4):
            block[i][j] = copyBlock[j][i]

def swap(block):
    block[0], block[2] = block[2], block[0]
    block[3], block[2] = block[2], block[3]
    block[0], block[1] = block[1], block[0]
    block[3], block[0] = block[3], block[0]
    block[2], block[1] = block[1], block[2]
    block[2], block[0] = block[0], block[2]
    rotate(block[0]); rotate(block[0])
    rotate(block[1]); rotate(block[1]); rotate(block[1])
    rotate(block[2])
    rotate(block[3]); rotate(block[3]); rotate(block[3])
    for i in range(3):
        for j in range(4):
            ii = ((block[i][j] & 0XFC) + i) % 4
            jj = (j + 3) % 4
            block[i][j], block[ii][jj] = block[ii][jj], block[i][j]
    s = 0
    for i in range(4):
        for j in range(4):
            s += block[i][j]
    if s % 2: 
        transpose(block)

def round(block):
    sub(block)
    add(block)
    swap(block)
    xor(block)

def encryptBlock(block):
    mat = [[block[i * 4 + j] for j in range(4)] for i in range(4)]
    for _ in range(77):
        round(mat)
    return [mat[i][j] for i in range(4) for j in range(4)]

def encrypt(msg):
    msg = list(pad(msg, 16))
    enc = []
    for i in range(0, len(msg), 16):
        enc += encryptBlock(msg[i : i + 16])
    return bytes(enc)

print(encrypt(flag).hex())

# f000ae7e94f48ef99da6390f99a08701cf16d63596bebac938ec36004d54b73d1712c2f38926c3bcc5e5f42c4d55b57ef1070a7b443677b3cc4372d9a41a4775

EXP

from Crypto.Util.Padding import pad
import gmpy2

SUB_KEY = [
    0x11,0x79,0x76,0x8b,0xb8,0x40,0x02,0xec,0x52,0xb5,0x78,0x36,0xf7,0x19,0x55,0x62,
    0xaa,0x9a,0x34,0xbb,0xa4,0xfc,0x73,0x26,0x4b,0x21,0x60,0xd2,0x9e,0x10,0x67,0x2c,
    0x32,0x17,0x87,0x1d,0x7e,0x57,0xd1,0x48,0x3c,0x1b,0x3f,0x37,0x1c,0x93,0x16,0x24,
    0x13,0xe1,0x1f,0x91,0xb3,0x81,0x1e,0x3d,0x5b,0x6c,0xb9,0xf2,0x83,0x4c,0xd5,0x5a,
    0xd0,0xe7,0xca,0xed,0x29,0x90,0x6f,0x8f,0xe4,0x2f,0xab,0xbe,0xfe,0x07,0x71,0x6b,
    0x59,0xa3,0x8a,0x5e,0xd7,0x30,0x2a,0xa0,0xac,0xbd,0xd4,0x08,0x4f,0x06,0x31,0x72,
    0x0d,0x9f,0xad,0x0b,0x23,0x80,0xe6,0xda,0x75,0xa8,0x18,0xe2,0x04,0xeb,0x8e,0x15,
    0x64,0x77,0x2b,0x03,0xa1,0x5d,0xb4,0xb1,0xf0,0x97,0xe3,0xe8,0xb0,0x05,0x86,0x38,
    0x56,0xef,0xfa,0x43,0x94,0xcb,0xb6,0x69,0x5f,0xc7,0x27,0x7c,0x44,0x8d,0xf3,0xc8,
    0x99,0xc2,0xbc,0x82,0x65,0xdb,0xaf,0x51,0x20,0x7f,0xc3,0x53,0xf4,0x33,0x4d,0x50,
    0xee,0xc5,0x12,0x63,0x9b,0x7b,0x39,0x45,0xa9,0x2d,0x54,0xdc,0xdf,0xd6,0xfd,0xa7,
    0x5c,0x0c,0xe9,0xb2,0xa2,0xc1,0x49,0x00,0xae,0xea,0x58,0x6d,0xce,0x88,0xf8,0x96,
    0xde,0x1a,0x0f,0x89,0xd3,0x7a,0x46,0x22,0xc6,0xf9,0xd9,0x84,0x2e,0x6a,0xc9,0x95,
    0xa5,0xdd,0xe0,0x74,0x25,0xb7,0xfb,0xbf,0x9c,0x4a,0x92,0x0e,0x09,0x9d,0xf6,0x70,
    0x61,0x66,0xc0,0xcf,0x35,0x98,0xf5,0x68,0x8c,0xd8,0x01,0x3e,0xba,0x6e,0x41,0xf1,
    0xa6,0x85,0x3a,0x7d,0xff,0x0a,0x14,0xe5,0x47,0xcd,0x28,0x3b,0xcc,0x4e,0xc4,0x42
]

SUB_KEY_REV = [-1]*256
for i in range(256):
    SUB_KEY_REV[SUB_KEY[i]]=i

def dexor(block):
    for i in range(3,-1,-1):
        for j in range(3,-1,-1):
            block[i][j] ^= block[(i + 2) % 4][(j + 1) % 4]

def deadd(block):
    for i in range(3,-1,-1):
        for j in range(3,-1,-1):
            if i>0:
                block[i][j] -= 2 * block[(i * 3) % 4][(i + j) % 4]
                block[i][j] &= 0xFF
            else:
                block[i][j] = (block[i][j]*gmpy2.invert(3,256))%256

def desub(block):
    for i in range(4):
        for j in range(4):
            block[i][j] = SUB_KEY_REV[block[i][j]]

def derotate(row):
    row[3], row[1], row[2], row[0] = row[0], row[1], row[2], row[3]

def detranspose(block):
    copyBlock = [[block[i][j] for j in range(4)] for i in range(4)]

    for i in range(4):
        for j in range(4):
            block[i][j] = copyBlock[j][i]

def deswap(block):
    s = 0
    for i in range(4):
        for j in range(4):
            s += block[i][j]
    if (s % 2): detranspose(block)

    for i in range(3):
        for j in range(4):
            ii = ((block[i][j] & 0XFC) + i) % 4
            jj = (j + 3) % 4
            block[i][j], block[ii][jj] = block[ii][jj], block[i][j]
    for i in range(3):
        for j in range(4):
            ii = ((block[i][j] & 0XFC) + i) % 4
            jj = (j + 3) % 4
            block[i][j], block[ii][jj] = block[ii][jj], block[i][j]

    derotate(block[3]); derotate(block[3]); derotate(block[3])
    derotate(block[2])
    derotate(block[1]); derotate(block[1]); derotate(block[1])
    derotate(block[0]); derotate(block[0])

    block[2], block[0] = block[0], block[2]
    block[2], block[1] = block[1], block[2]
    block[3], block[0] = block[3], block[0]
    block[0], block[1] = block[1], block[0]
    block[3], block[2] = block[2], block[3]
    block[0], block[2] = block[2], block[0]


def deround(block):
    dexor(block)
    deswap(block)
    deadd(block)
    desub(block)

def decryptBlock(block):
    mat = [[block[i * 4 + j] for j in range(4)] for i in range(4)]
    for _ in range(77):
        deround(mat)
    return [mat[i][j] for i in range(4) for j in range(4)]

def decrypt(c):
    p = []
    for i in range(0,len(c),16):
        p+=decryptBlock(c[i:i+16])
    return bytes(p)

c = list(bytes.fromhex('f000ae7e94f48ef99da6390f99a08701cf16d63596bebac938ec36004d54b73d1712c2f38926c3bcc5e5f42c4d55b57ef1070a7b443677b3cc4372d9a41a4775'))
print(decrypt(c))
#ctfshow{le4RNin9_h0w_70_revER5e_5IMple_Se5_i5_iN7Ere57InG}

一生所爱

最基础的DTFM

题目给了一个音频文件

第一步,打开音频。可以发现里面有吱吱声,和我们平时听到的拨号音不太一样,结合题目可以猜测是DTFM的变形。

二、分析音频、仔细观察频谱会发现,它的频率集中在3.5-8khz左右,而且声音较小。标准的dtmf频率如下,正好16个对应着16进制,然后e和f呢?很显然是*和#。
同时我们注意到标准dmf的最低频率为0.697kHz,而最高品为1.633kHz与我们在频谱中的观察到的数字正好差了5倍。

三、提取flag。
知道了原理,接下来就好办了,想办法把它提取出来就行了,提取指定频段的信息最简单的方法当然是fft变换,这涉及到了一个时间窗的问题,白话就是按键时间是多长,间隔是多长。
仔细观察一下就会发现按键长短、间隔时间都是一致的,而且,4分半左右的地方,还有一段静音区方便分析。然后会发现另一个整数出现了,每个按键按下100ms,间隔50ms,共150ms。
接下来就是fft提取数据,然后解base64取得flag
import matplotlib.pyplot as plt ,libnum,  torchaudio as ta,base64,numpy as np
hf = [i//2 for i in [1209, 1336, 1477, 1633]]
lf = [i // 2 for i in [697, 770, 852, 941]]
kb = [['1', '2', '3', 'A'], ['4', '5', '6', 'B'], ['7', '8', '9', 'C'], ['E', '0', 'F', 'D']]
x = ta.load('flag.mp3')
datao = (x[0][0].numpy())
framerate = x[1]
df = int(framerate*0.15)
strflag = ''
for i in range(0,len(datao),df):
    wave = datao[i+df//3: i+df]
    ffta =  np.abs(np.fft.fft(wave))
    lmax = ffta[lf]
    lindx = np.where(lmax==lmax.max())[0][0]
    hmax = ffta[hf]
    hindx = np.where(hmax==hmax.max())[0][0]
    strflag += kb[lindx][hindx]
    print( kb[lindx][hindx],end='')
    plt.clf()
    plt.plot(ffta[300:900])
    plt.pause(0.02)
flag = base64.b64decode(libnum.n2s(int(strflag,16))).decode()
print(flag)

优势在我

不论怎么讲

会战兵力

是八十万对六十万

优势在我!

from Crypto.Util.number import *
import hashlib
import sys
from private import d

def pr(x, end="\n"):
    sys.stdout.write(str(x)+end)
    sys.stdout.flush()

BANNER = """
比赛名称:七夕杯
题目难度:优势在我
比赛奖励:排名1:华为手环6_Pro+定制夏日T-shirt
排名2-10:定制夏日T-shirt
比赛时间:2022年8月4日(周四) 18时整
比赛时长:24小时
地址:https://www.ctf.show/challenges
投稿邮箱:ctfshow@163.com
投稿奖励:绿盟扩展坞一个
"""

N = 18546721845979927569500143751660105533561486316231224465080625317376238264944740878457193385226698959802719372533690834284860737851929107163579187879895388120942312652954549671398264315985738386063687826049340153475764762320419809887400141782272319772175613926330746384510813184415900331770119033044622690940477810277396517358312757248120240055407842257982535105406966617903737782220404404644459553334905091694987679788339901767262741660223359618116200505397580036748964773373441655648565481823043475551779287949673519191553190302422175246969165641890331993628578551062334369824625164536808726394693221961254696074691
e = 65537
p = 24074624372939710957902553829568388349796810585932597965247721110129830468800036256026076982213498961372616008101708874099574700088150475222639563817914865052788850184089778132465415340980378135746900061263517304153485433985299953682148733981366808528082636204740025363446729188464380931250501761664305346381138286856186476986484913576109916879190154878781616175599052154216615394032414499234529973797040464698872321982946683153298157064531262284470661150270186224788419122959403896437988552792877168892664837002108590144855389176310488655364026719942320436915792611600545729690463037233338070404315644982404557646573
g = 2

with open("flag.txt", "rb") as f:
    flag = f.read()
flag = bytes_to_long(flag)
assert flag < N

def strange_tales(x):
    msg1 = b"Never gonna make you cry" + x
    msg2 = b"Never gonna say goodbye" + x
    return bytes_to_long(hashlib.sha512(msg1).digest() + hashlib.sha512(msg2).digest())

def full_of_foolish_talk(x):
    k = getRandomRange(0, p - 1)
    r = pow(g, k, p)
    e = strange_tales(str(r).encode() + b"Never gonna tell a lie and hurt you")
    s = (k - x * e) % (p - 1)
    return r, s

pr(BANNER)
pr(f"We're no strangers to love: {pow(flag, e, N)}")
pr("You know the rules and SO DO I")
while True:
    pr("> ", end="")
    c = int(input())
    m = pow(c, d, N)
    r, s = full_of_foolish_talk(m)
    pr(f"Never gonna give you up: {r}")
    pr(f"Never gonna let you down: {s}")

连接靶机得到

welcome 2 ctfshow

We're no strangers to love: 625640025290909145494859179740750085836529770712392190932859794664517156752284252068670551998249827466907389239815333326108411581208318702586300062560838020626698935000780880037242060289689986122090965811484558058120439002576112545810282470143216602489450603489396999117065325877024464373485779904264784594981479653928169402003013372162697937178764546192050078482907277523698866579612017934847328379161892961196356387059581716665527479097440070931472838328426553186849936118796738903116424277343166398984606512320780980685388961756995597966418281112356348953920244656116973947399411374848791090980721417397382828847
You know the rules and SO DO I

这题直接看官方WP吧:https://ctf-show.feishu.cn/docx/doxcnMfyzo4Ohm3GMBqnOexo6gX

新手杯

easy_base

问就是base加密(其实是编码

密文:=0XezFWZfNXafRjNlNXYit3dvh2cmR3Y

写个脚本逆一下再base64解码

s = '=0XezFWZfNXafRjNlNXYit3dvh2cmR3Y'
print(s[::-1])
#Y3Rmc2hvd3tiYXNlNjRfaXNfZWFzeX0=
#ctfshow{base64_is_easy}

天知地知

好不容易要到了妹子手机号,却是加密的,怎么办,兄弟们很急,在线等!听说妹子是佛山的 加密后的手机号:

(+86)981935301754

格式ctfshow{妹子手机号} 提交的时候,不用+86, * 不要给机主打电话,更不要骚扰机主,不然我报警啦*

提示两者之差

分析发现,电话是12位的,而且是9开头,那么国内绝大部分手机号是1开头,所以用10相减就是1了
然后12位,所以减去的数要比他大,所以被减数就是13位,第一位是1,后面12位是0,得到1000000000000

EXP

print("ctfshow{"+str(1000000000000-981935301754)+"}")
#ctfshow{18064698246}

凯撒密码

查看代码
 from string import ascii_lowercase
from random import shuffle,randint

table=list(ascii_lowercase)
shuffle(table)
flag='ctfshow{xxx}'
key=randint(0,25)
text=[]
for i in flag:
    if i in table:
        text.append(table[(table.index(i)+key)%26])
    else:
        text.append(i)
print(table)
print(text)
# ['h', 'g', 'u', 'p', 'o', 'v', 'n', 'b', 'i', 'j', 'y', 'k', 'a', 'z', 'w', 'q', 't', 'l', 'r', 'd', 'x', 'e', 's', 'm', 'c', 'f']
# ['r', 'y', 'd', 't', 'x', 'c', 'i', '{', 'y', 'x', '1', 't', '_', 'u', 't', '_', 'z', '1', 'd', 'd', 'a', 'q', 'h', 'y', '_', 'r', '4', 'q', 't', 'n', 'a', '!', '!', '}']

EXP

table=['h', 'g', 'u', 'p', 'o', 'v', 'n', 'b', 'i', 'j', 'y', 'k', 'a', 'z', 'w', 'q', 't', 'l', 'r', 'd', 'x', 'e', 's', 'm', 'c', 'f']
text=['r', 'y', 'd', 't', 'x', 'c', 'i', '{', 'y', 'x', '1', 't', '_', 'u', 't', '_', 'z', '1', 'd', 'd', 'a', 'q', 'h', 'y', '_', 'r', '4', 'q', 't', 'n', 'a', '!', '!', '}']
# 爆破秘钥
for key in range(0,26):
    flag=''
    for i in text:
        if i in table:
            flag+=(table[(table.index(i)+key)%26])
        else:
            flag+=i
    print(str(flag))
# ctfshow{th1s_is_d1ffrent_c4esar!!}

新手村难度

在网游世界里,新手村永远是故事开始的起点,是玩家与游戏发生“初恋”的地方。可以说玩过网络游戏的没有人不知道新手村这个词,可以用“天下谁人不识君”来形容。于是也就有了 “网游谁人不知新手村!”

【提示】crypto4 提示为:幂次必为奇数

查看代码
 from Crypto.Util.number import *
from sympy import totient as phi
import sys
import random

def pr(x, end='\n'):
    sys.stdout.write(f'{x}{end}')
    sys.stdout.flush()

def newbie(naive, p):
    if (len(naive) == 0):
        return 1
    NB = 1
    PH = phi(p) # AAHPH
    for i in range(len(naive)-1, -1, -1):
        if (NB > 4396): # clearlove picked the blind monk
            return pow(naive[0], int(newbie(naive[1:], PH) + PH), int(p))
        NB = naive[i] ** NB
    return NB % p

BANNER = '''
+-------------------+
|     *             |
|     **     ****** |
|  ******** ******* |
|  ******** ***     |
|   *    ** ***     |
|    *  *** ***     |
| *************     |
| ***************** |
|     **    ******* |
|     **    *** **  |
|  ******** *** **  |
|     **    *** **  |
|   * ****  *** **  |
|  ** ** ** **  **  |
|  *  **  ****  **  |
| **  **   ***  **  |
|   ****  **    **  |
|                   |
+-------------------+

比赛名称:新手杯
比赛时间:2022年10月3日20时,共48小时
比赛类型:个人赛
比赛难度:新手村难度
比赛奖品:神兽抱枕(女用)
题目投稿:ctfshow@163.com
投稿奖品:神兽抱枕(男用)
投稿截止:10月1日20时
'''

pr(BANNER)

p = getPrime(64)
while True:
    p = getPrime(64)
    if (p % 15 == 2):
        break

with open('flag.txt', 'rb') as f:
    flag = f.read()
flag = f'0{bytes_to_long(flag):b}'

pr(f'{p = }')
pr(f'{len(flag) = }')
while True:
    pr('> ', end='')
    seed = int(input())
    random.seed(seed)
    newbie_flag = list(flag)
    random.shuffle(newbie_flag)
    sometimes_naive = [int(x) * 2 + 3 for x in newbie_flag]
    pr(f'{newbie(sometimes_naive, p) = }')

贴贴大佬的WP https://blog.csdn.net/qq_53283643/article/details/127225158

EXP


import random
import tqdm
from pwn import *
from Crypto.Util.number import *

re = remote('pwn.challenge.ctf.show', 28181)
re.recvuntil(b'p = ')
p = int(re.recvline().decode()[:-1])
if p % 4 != 3:
    re.close()
    exit()
re.recvuntil(b'len(flag) = ')
flag_len = int(re.recvline().decode()[:-1])
print(p, flag_len)
flag = [-1 for i in range(flag_len)]
INDEX = []
SEED = []
seed = 0
while len(SEED) != flag_len:
    random.seed(seed)
    randlist = list(range(flag_len))
    random.shuffle(randlist)
    indexx = list(range(flag_len)).index(randlist[0])
    if indexx not in INDEX:
        INDEX.append(indexx)
        SEED.append(seed)
    seed += 1
assert len(SEED) == flag_len
for i in tqdm.tqdm(range(len(SEED))):
    re.recvuntil(b'> ')
    re.sendline(str(SEED[i]).encode())
    re.recvuntil(b'newbie(sometimes_naive, p) = ')
    c = int(re.recvline().decode()[:-1])
    check = pow(c, (p - 1) // 2, p)
    flag[INDEX[i]] = 0 if check == 1 else 1
flag = [str(i) for i in flag]
print(long_to_bytes(int(''.join(flag), 2)))
 
re.close()

年CTF

初一

2023是兔年,密码也是。聪明的小伙伴们,你能破解出下面的密码吗?
感谢大菜鸡师傅出题
flag格式是ctfshow{xxxxxx}.或许密码也有密码。
密文是:
U2FsdGVkX1+M7duRffUvQgJlESPf+OTV2i4TJpc9YybgZ9ONmPk/RJje

考点:兔子流,key是2023

初五

神秘人送来了半个世纪前的无线电信号,但是只能分别出以下的密文:
YDHML_QKA_PDK_HVD_NAHI_OQ_K_GR
据说上面的无线电信号代表的是中文,由红岸基地发往半人马星系
半个世纪过去了,你能破解它的涵义吗?
提交flag请加上ctfshow{}格式,如ctfshow{新春快乐} 感谢大菜鸡师傅出题

关键字:纯中文 半个世纪前 用下划线分割
可以看到信息主要有
YDHML
QKA
PDK
HVD
NAHI
OQ
K
GR
直接仓颉编码解码,链接: http://cangjie.quchacha.com/YDHML.html

但发现NAHI查不到,猜测是兔

最终得到flag

ctfshow{新春快乐兔年大吉}

2023愚人杯

easy_base

4C455A5645334C44474A55484D5A42544F5132574956525A50464E464F4E4C474D4656454D334359474A554751564B4949493255535532464E42544643504A35

大牛的密码

查看代码
 from Crypto.Util.number import *
from flag import flag
from Crypto.Util.Padding import pad
from random import *
def s_box(a):
    box=[i for i in range(a)]
    shuffle(box)
    return box
BLOCK=16
flag=pad(flag,BLOCK)
S_BOX=s_box(len(flag))
m=[i for i in flag]
def swap(a,b):
    tmp = a
    a = b
    b = tmp
def encrypt1(m):
    enc=[m[i:i+BLOCK] for i in range(0,len(m),BLOCK)]
    for i in enc:
        for j in range(BLOCK):
            aa=j*7%BLOCK
            swap(i[j],i[aa])
def encrypt2(m):
    for i in range(16):
        m=[m[i] for i in S_BOX]
    return m
encrypt1(m)
c=encrypt2(m)
print(S_BOX)
print(c)
'''
[9, 31, 32, 38, 20, 1, 22, 4, 8, 2, 11, 21, 7, 18, 46, 23, 34, 3, 19, 12, 45, 30, 27, 37, 5, 47, 28, 36, 0, 43, 39, 10, 29, 14, 40, 24, 33, 16, 17, 6, 42, 15, 26, 41, 44, 25, 35, 13]
[99, 111, 102, 11, 107, 49, 11, 53, 121, 48, 114, 117, 11, 95, 112, 95, 109, 115, 11, 95, 101, 95, 119, 117, 79, 123, 111, 48, 110, 95, 121, 116, 121, 125, 116, 11, 119, 11, 97, 67, 11, 11, 11, 11, 11, 99, 110, 104]
'''

分析:

encrypt1()函数就是交换位置,最后又换回来了,所以不影响。

encrypt2()函数也是一样,根据 S _ B O X 中的元素进行重新排序,逆一下就好

EXP

S_BOX = [9, 31, 32, 38, 20, 1, 22, 4, 8, 2, 11, 21, 7, 18, 46, 23, 34, 3, 19, 12, 45, 30, 27, 37, 5, 47, 28, 36, 0, 43,
         39, 10, 29, 14, 40, 24, 33, 16, 17, 6, 42, 15, 26, 41, 44, 25, 35, 13]
c = [99, 111, 102, 11, 107, 49, 11, 53, 121, 48, 114, 117, 11, 95, 112, 95, 109, 115, 11, 95, 101, 95, 119, 117, 79,
     123, 111, 48, 110, 95, 121, 116, 121, 125, 116, 11, 119, 11, 97, 67, 11, 11, 11, 11, 11, 99, 110, 104]
for k in range(16):
    tmp, c = c, []
    for i in range(len(S_BOX)):
         c.append(tmp[S_BOX.index(i)])
print(''.join([chr(i) for i in c]))
# ctfshow{y0u_c5n_make_y0u1_own_CryptO}

Comedy

题目描述:

Is it just me, or is it getting crazier outthere?

import gmpy2, libnum
from secret import flag1, flag2

m = libnum.s2n(flag1)
assert m.bit_length() < 200
B = gmpy2.next_prime(libnum.s2n(flag2))
A = (2022 - 2023 * m) % B
leak = pow(2, 2023, B)
print(A)
print(leak)
# 493275281479560936332761096886786925792234184811353209227551802099268192839677496844153534128991899414803550843408607188612593757622064753867565869035222715177143938385039508273050267347710495512806264863554858016145161165422812554800693811328453743229819656381224407015421235005940088439590887928051969351426291843586132741521121351667152673680122929827805479163871436776753859965413192837591532468372
# 238829196127128263156194898141748280130190920343265228257398802867203846004703877952990524473329125233083096275276064071930416561616135910190674099345267027039386328203653489152769309498199556401574021633071022874689081585677578010276529507102304828451681000682208089162940529052283763507244593173690786957816545746540436261888398732172965945762569416702401859253725696471593023885944262561159982327952

from Crypto.Util.number import *

A = 493275281479560936332761096886786925792234184811353209227551802099268192839677496844153534128991899414803550843408607188612593757622064753867565869035222715177143938385039508273050267347710495512806264863554858016145161165422812554800693811328453743229819656381224407015421235005940088439590887928051969351426291843586132741521121351667152673680122929827805479163871436776753859965413192837591532468372
leak = 238829196127128263156194898141748280130190920343265228257398802867203846004703877952990524473329125233083096275276064071930416561616135910190674099345267027039386328203653489152769309498199556401574021633071022874689081585677578010276529507102304828451681000682208089162940529052283763507244593173690786957816545746540436261888398732172965945762569416702401859253725696471593023885944262561159982327952
kb0 = 2 ** 2023 - leak
B = kb0 // (kb0 // A)
m = (B - A + 2022) // 2023
print(long_to_bytes(m) + long_to_bytes(B))
# b'ctfshow{UNKNOWN_MODULUS_T0_BR1NG_L3UGHTER_AND_J@Y_TO_TH3_W0RLD}

ecc_mini

from Crypto.Util.number import *
from secret import flag
flag=bytes_to_long(flag)
a =getPrime(256)
b =getPrime(256)
p =getPrime(256)
m1=int(str(flag)[:5])-4585
m2=int(str(flag)[5:])
#EllipticCurve([a1, a2, a3, a4, a6]) -- y^2+(a1)xy+(a3)y=x^3+(a2)x^2+(a4)x+(a6)
E = EllipticCurve(GF(p), [a, b])
X=E.lift_x(m1)
Y=7*X
m = E.random_point()
G = E.random_point()
k = getPrime(256)
K = k * G
r = getPrime(256)
c1 = m + r * K
c2 = r * G
w2=m[0]*m2
print(f"p = {p}")
print(f"a = {a}")
print(f"b = {b}")
print(f"k = {k}")
print(f"E = {E}")
print(f'Y = {Y}')
print(f"c1 = {c1}")
print(f"c2 = {c2}")
print(f"w2 = {w2}")
'''
p = 71397796933602469825964946338224836258949974632540581233301840806613437378503
a = 106105288190268015217241182934677375171023341761047638573248022053052499733117
b = 76170541771321874396004434442157725545076211607587599314450304327736999807927
k = 58155941823118858940343657716409231510854647214870891375273032214774400828217
E = Elliptic Curve defined by y^2 = x^3 + 34707491256665545391276236596452538912073367128507057339946181246439062354614*x + 4772744837719404570039488103932889286126236975047018081148463521123562429424 over Finite Field of size 71397796933602469825964946338224836258949974632540581233301840806613437378503
Y = (33237936857741483513705672980652927705102229733798436323453609986072499230366 : 52619411226266177137991318059937693955038910547834999771526408984808553907338 : 1)
c1 = (37414446283406201193977113266234367761786780230360175925999700345196415953455 : 17037724145039910971426670298726906655653040365428438334942732090559637519851 : 1)
c2 = (60560423732267272277570046154733119097475794979191838027420415113112056962844 : 54372226143125971429691267751299496959531971082475860532181772357190222938465 : 1)
w2 = 16315249811700998894876359855091105114973337718373913477026230968747515636405
'''

第一部分可知m1是五位,爆破一下

import tqdm

p = 71397796933602469825964946338224836258949974632540581233301840806613437378503
a = 106105288190268015217241182934677375171023341761047638573248022053052499733117
b = 76170541771321874396004434442157725545076211607587599314450304327736999807927
E = EllipticCurve(GF(p), [a, b])

for m1 in tqdm.tqdm(range(10000, 99999)):
    try:
        X = E.lift_x(m1 - 4585)
        Y = 7 * X
        if Y[0] == 33237936857741483513705672980652927705102229733798436323453609986072499230366:
            print(m1)
            break
    except:
        pass
# 62428

第二部分:

from Crypto.Util.number import inverse, long_to_bytes
p = 71397796933602469825964946338224836258949974632540581233301840806613437378503
a = 106105288190268015217241182934677375171023341761047638573248022053052499733117
b = 76170541771321874396004434442157725545076211607587599314450304327736999807927
k = 58155941823118858940343657716409231510854647214870891375273032214774400828217
c1 = (37414446283406201193977113266234367761786780230360175925999700345196415953455, 17037724145039910971426670298726906655653040365428438334942732090559637519851)
c2 = (60560423732267272277570046154733119097475794979191838027420415113112056962844, 54372226143125971429691267751299496959531971082475860532181772357190222938465)
w2 = 16315249811700998894876359855091105114973337718373913477026230968747515636405

E = EllipticCurve(GF(p), [a, b])

m1 = 62428
c1 = E(c1)
c2 = E(c2)
m = c1 - k * c2
m2 = w2 * inverse(int(m[0]), p) % p
print(long_to_bytes(int(str(m1) + str(m2))))

# b'ctfshow{the_answer_is_it}'

easy_xor

from Crypto.Util.number import *
from secret import flag

assert len(flag[8:-1])==23
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
e = 65537
c1 = m^p
c2 = pow(m,e,n)
print(f'c1 = {c1}')
print(f'c2 = {c2}')
print(f'n = {n}')
'''
c1 = 151198307301713399973545627808177783191262282577048906899567665485020342464366268384613589477129150406859219553325982275344405383612415523342568367197935454935162234419239807109194526080836070453102172720442102673200212658553214847476648456720629906051324248179394810385918370092764118401652990951968387233220
c2 = 7894512574379281106340582833782408137686355961537832816105517328532111343730615739255485918919146012721446905489729048235088965936700563973759759039693443386542070451737445467143517377017890468837697907596398070608179281207203217576205857817411996178441661371846647602166663752324880657668362355493701482869858528298247422875427747085642627978367348931707497113936723122393282697211257939351221141536029828744507560524637999804394951722319070365576391442828074457050403771353328835153787572457070779602728359333021922987279454923820866436212282592764768470608545881718922440010751845730974331917142224339664090863915
n = 20873587976264698212013861921447267548758723109929620330136081844796427967720295581580927324390713931549639540337285515365487607593546367886570408812338077846317206794057714877394609181224434104303259411081376607299962306250984285173463537669954845497211859940191392861121877814873939865829555350848523691546006073264112091406848179785659505299775196062799482197712761744192962658799557108701192680225134300686608396391566674966897700511638643429161735764600752699251493599533703928135311599575989253347234975026924804433742500175666009324057320386262109587593814197687132304704244158862263859846356497849518103755981
'''

考点:coppersmith求m

EXP

#sage#
c1 = 151198307301713399973545627808177783191262282577048906899567665485020342464366268384613589477129150406859219553325982275344405383612415523342568367197935454935162234419239807109194526080836070453102172720442102673200212658553214847476648456720629906051324248179394810385918370092764118401652990951968387233220
n = 20873587976264698212013861921447267548758723109929620330136081844796427967720295581580927324390713931549639540337285515365487607593546367886570408812338077846317206794057714877394609181224434104303259411081376607299962306250984285173463537669954845497211859940191392861121877814873939865829555350848523691546006073264112091406848179785659505299775196062799482197712761744192962658799557108701192680225134300686608396391566674966897700511638643429161735764600752699251493599533703928135311599575989253347234975026924804433742500175666009324057320386262109587593814197687132304704244158862263859846356497849518103755981
PR.<x> = Zmod(n)[]
f = (c1 >> 256 << 256) + x

p = int(f.small_roots(X=2**256, beta=0.4)[0])
m = c1 ^^ p
print(m)
#151198307301713399973545627808177783191262282577048906899567665485020342464366268384613589477129150406859219553325982275344405383612415523342568367197935454935162234419239807109194526080836070453102172720442102673200212658553214847478348380942200089553037214212933197111944706195982779106735050530754229725309
from Crypto.Util.number import long_to_bytes

m=151198307301713399973545627808177783191262282577048906899567665485020342464366268384613589477129150406859219553325982275344405383612415523342568367197935454935162234419239807109194526080836070453102172720442102673200212658553214847478348380942200089553037214212933197111944706195982779106735050530754229725309
print(long_to_bytes(m))
#ctfshow{m_xor_p_but_coppersmith}

菜狗杯

密码签到

密文为: 63746673686f777b77656c636f6d655f325f636169676f755f6375707d

HEX解码

ctfshow{welcome_2_caigou_cup}

Caesar

密文如下: Zhofrph wr FWIvkrz yhjhwdeoh grj fxs!

flag格式为 ctfshow{明文}

区分大小写,包含空格

凯撒解码

ctfshow{Welcome to CTFshow vegetable dog cup!}

0x36d

密文:

😫🙄👰😰👣🙋😱👧👌👷👯👩😴👖👫👚🙃👹👏👏😶👳😫👕🙂🙊👵👶👨👰👮🙉👶👵👸👲👺👮👑😶👴😫🙊👫😴👬👹👤👑😱👗🙃👐😶

提示: 有没有一种可能,标题就是密码?

表情包解码,网站https://txtmoji.com/

测试发现 密码为题目0x36d的十进制877

然后解码得到

ctfshow{emoji_is_funny}

类型-7

密文如下: 094F5A0F0A0D1805103B0B3D143117183B720438350A45550967674D1E064F2969784440455A460F1A1B

Type7混淆加密,是一种可逆的XOR密码,某科设备做ospf 接口认证的时候可以配置加密类型为Type7。
解密网站:
ctfshow{Wow_u_Kn0w_Ci$c0_Type7_P@ssword!}

g4的密码小课堂

查看代码
 # -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-11-11 13:46:24
# @Last Modified by:   h1xa
# @Last Modified time: 2022-11-11 13:46:32
# @email: h1xa@ctfer.com
# @link: https://ctfer.com


# D0_U_kn0w_wh4t_1s_double_p_q?
from Crypto.Util.number import *
import gmpy2
from secret import flag

m = bytes_to_long(flag)
p1 = getPrime(256)
p2 = gmpy2.next_prime(p1)
q1 = getPrime(256)
q2 = gmpy2.next_prime(q1)
n = p1*p2*q1*q2
e = 65537
c = pow(m, e, n)
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')

'''
n = 32481415283829255738340971974996440308678927230347135108620374939715138530763511922162670183907243606574444169915409791604348383760619870966025875897723568019791384873824917630615306169399783499416450554084947937964622799112489092007113967359069561646966430880857626323529067736582503070705981530002918845439
e = 65537
c = 13000287388412632836037240605681731720629565122285665653580432791960428695510699983959843546876647788034949392762752577597448919397451077080119543495058705350347758604475392673242110787093172219487592930482799866421316089027633497253411081184454114601840835490688775466505809830410778091437211186254631834255

'''

EXP

from Crypto.Util.number import *
import gmpy2

n = 32481415283829255738340971974996440308678927230347135108620374939715138530763511922162670183907243606574444169915409791604348383760619870966025875897723568019791384873824917630615306169399783499416450554084947937964622799112489092007113967359069561646966430880857626323529067736582503070705981530002918845439
e = 65537
c = 13000287388412632836037240605681731720629565122285665653580432791960428695510699983959843546876647788034949392762752577597448919397451077080119543495058705350347758604475392673242110787093172219487592930482799866421316089027633497253411081184454114601840835490688775466505809830410778091437211186254631834255

def factor(n):
    pq_list = []
    a = gmpy2.iroot(n, 2)[0]
    while 1:
        B_2 = pow(a, 2) - n
        if gmpy2.is_square(B_2):
            b = gmpy2.iroot(B_2, 2)[0]
            p1q1= a - b
            p2q2 = a + b
            pq_list.append([p1q1, p2q2])
            if len(pq_list) == 2:
                break
        a += 1  
    return pq_list

pq_list = factor(n)

X1, Y1 = pq_list[0]
X2, Y2 = pq_list[1]

p1 = gmpy2.gcd(X1, X2)
q1 = gmpy2.gcd(Y1, Y2)

p2 = X2 // p1
q2 = Y2 // q1

phi = (p1 - 1)*(q1 - 1)*(p2 - 1)*(q2 - 1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
flag = long_to_bytes(m)
print(flag)

# ctfshow{you_Know__doub1e_g2_1s_g4_s1m0n}

ACMer也想要玩密码学

附件:https://ctfshow.lanzoub.com/iAXKs0foq74h

由于附件信息太多这里附上地址自行下载。

教程如下:

#include <stdio.h>

// 输入数据
int input[1024];
// 每行的标识位
int lineTag[1024];
// 每列的标识位,列标从最低位开始从0增长
int columnTag[31];

/** 计算当前数据的第一行校验码 */
void checkColumn(int size) {
    for (int column = 0; column != 31; ++column) {
        columnTag[column] = 1;
        for (int line = 1; line != size; ++line) {
            columnTag[column] ^= (input[line] >> column) & 1;
        }
    }
}

/** 计算当前数据的第一列校验码 */
void checkLine(int size) {
    for (int line = 1; line != size; ++line) {
        lineTag[line] = 1;
        for (int column = 0; column != 31; ++column) {
            lineTag[line] ^= (input[line] >> column) & 1;
        }
    }
}

/** 纠正 */
void correct(int size) {
    checkColumn(size);
    checkLine(size);
    for (int line = 1; line != size; ++line) {
        // 判断输入数据中的行标识和计算出来的行标识是否一致
        if (((input[line] >> 31) & 1) == lineTag[line]) continue;
        // 不一致说明当前行存在错误,遍历列查找错误位置
        for (int column = 0; column != 31; ++column) {
            // 判断输入数据中的列标识和计算出来的是否一致
            // 如果不一致就表示成功定位到错误信息的位置
            if (columnTag[column] == ((input[0] >> column) & 1)) continue;
            // 反转错误信息所在位的值
            int value = (input[line] >> column) & 1;
            if (value) input[line] &= ~(1 << column);
            else input[line] |= 1 << column;
            return; // 最多只有一个错误,找到后直接退出
        }
    }
}

int main() {
    int size = 0;
    for (int i = 0; ; ++i) {
        if (!~scanf("%d", &input[size])) break;
        ++size;
    }

    correct(size);

    for (int line = 1; line != size; ++line) {
        for (int column = 30; column != -1; --column) {
            printf("%d", (input[line] >> column) & 1);
        }
        printf("\n");
    }
    return 0;
}
'''
1001101100100001010001000010010
1011011001101010010011110010111
0111010000111101111001111010010
1010100011000111111010001000000
1101110011010100110101001100010
1110001101010011001010100111011
0111111000111011110000110111111
0001011110000110101110110101100
1000000110101101001101101010000
1101110011010010100100110110001
1010000011011110010010000010111
1011100001100011101011100101111
1011010111000011001010101000101
0001100001110100001100110101001
0001101101001011101101000111010
0010111111110000000101101110100
1100111000001000111001000111101
1101100001001100010100100000111
1010110011001010000000101101101
0110110010100110001011101000000
1011011110111010100001110111011
0001011100001111000001111000110
0100010110111000110010111101110
1010111101011110010011011111011
0100000010110001011101111111101
0101011101110011110000100011001
1111100111110110001000101001000
0111100101011111110100001101110
0101001001100001011011001110001
1110010100000101111010011010011
1000110001010011100100111101000
1111001101001111101010011001101
'''

EXP

str = "tthgYfobWGhnenk;WaxcZe7:b`x9ldgr"

key = []
with open("bitkey.txt") as f:
    for line in f:
        key.append((int(line,2)%11))

for i in range(len(str)):
    print(chr(ord(str[i])^key[i]),end="")
 '''
 suka_and_Migool1_are_g00dfr1ends
 '''

Base47

感谢@一哈师傅供题,太棒了!

神必字符: E9CV^T+HT5#X36RF4@LAU703+F$E-0N$@68LMXCVDRJJD5@MP#7MUZDTE?WWLG1S#L@+^66H@59KTWYK8TW0RV

神必字典:

0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+

EXP

>>> (lambda a, b: __import__('libnum').n2s(sum([b.index(a[i]) * (len(b) ** (len(a) - i - 1)) for i in range(len(a))])))('E9CV^T+HT5#X36RF4@LAU703+F$E-0N$@68LMXCVDRJJD5@MP#7MUZDTE?WWLG1S#L@+^66H@59KTWYK8TW0RV', '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+')
b'ctfshow{AbaAba_AbaAbaAba_Ababababa_Never_Gonna_Give_You_Up}'

@bash

密文如下: OLEVNFNFAR

考点:埃特巴什码

ctfshow{LOVEMUMUZI}

This is Sparta

密文如下: WFlni~seseds~_lh ~@codyc~_owoot~Bm guf~oev rsTy ec ha!tgufon!oeplwj? t!a{i!Ca gy_@Tba oi}

WFlni~seseds~_lh   ~@codyc~_owoot~Bm guf~oev rsTy ec ha!tgufon!oeplwj? t!a{i!Ca gy_@Tba oi}

考点:斯巴达密码棒(当然也可以是栅栏密码,栏数为13)解码得:

好用的解密网站 千千秀字

最后附上菜狗杯官方WP

https://ctf-show.feishu.cn/docx/UpC6dtDqgo7VuoxXlcvcLwzKnqh

CTFSHOW密码之旅到此结束!!!!🥳🥳

 

posted @ 2023-11-09 23:51  Kicky_Mu  阅读(735)  评论(0编辑  收藏  举报