来自一个学不明白堆的菜的研究:
工具一把梭
这里需要一个小工具,叫ciphey,命令行调用即可对密文进行解密,挺方便的。具体的安装方法csdn就有,有一些地方需要注意一下,但还是很快能安装完毕。安装完毕后使用命令行调用:
直接就返回明文以及具体的解答方式。
像这样:
经典给出一堆乱码,像这种:
base64以及凯撒等简单密码
这里装好相应的库,对着密文一通decode就能(大概?解出最最简单的题目了
比如:
var="************************************" flag='NSSCTF{' + base64.b16encode(base64.b32encode(base64.b64encode(var.encode()))) + '}' print(flag)
小明不小心泄露了源码,输出结果为:4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D,你能还原出var的正确结果吗?
|
这种就看着加密方式一步一步逆回去咯:
import base64
ans="4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D"
var2=base64.b64decode(base64.b32decode(base64.b16decode(ans))) var2=var2.decode() print("NSSCTF{"+var2+"}")
|
当然如果遇到纯粹的凯撒,那直接工具一把梭也是可以的
RSA以及其共模攻击
这里就涉及一点数论知识了,还没有学习太深入,只能照葫芦画瓢抄一抄简单脚本:
这是题目附件:
from gmpy2 import * from Crypto.Util.number import *
flag = '***************'
p = getPrime(512) q = getPrime(512) print("p=",p) print("q=",q) m1 = bytes_to_long(bytes(flag.encode()))
n = p*q e1 = getPrime(32) e2 = getPrime(32) print()
flag1 = pow(m1,e1,n) flag2 = pow(m1,e2,n) print('flag1= '+str(flag1)) print('flag2= '+str(flag2)) print('e1= ' +str(e1)) print('e2= '+str(e2)) print('n= '+str(n))
|
解题脚本:
import libnum import gmpy2 from Crypto.Util.number import *
flag1=100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
flag2=86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
e1= 3247473589 e2= 3698409173
n=103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
def rsa_gong_N_def(e1,e2,c1,c2,n): e1, e2, c1, c2, n=int(e1),int(e2),int(c1),int(c2),int(n) print("e1,e2:",e1,e2) s = gmpy2.gcdext(e1, e2) print("mpz:",s) s1 = s[1] s2 = s[2] if s1 < 0: s1 = - s1 c1 = gmpy2.invert(c1, n) elif s2 < 0: s2 = - s2 c2 = gmpy2.invert(c2, n) m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n return int(m)
m=rsa_gong_N_def(e1,e2,flag1,flag2,n) print(m) print(libnum.n2s(int(m)).decode())
|
中间被注释掉的部分是为了处理更难级别的题目,但在此题暂时还用不上。
暂时先到这里吧,RSA其中原理以及逆元还不是很清楚,摆烂(