来自一个学不明白堆的菜的研究:

工具一把梭

这里需要一个小工具,叫ciphey,命令行调用即可对密文进行解密,挺方便的。具体的安装方法csdn就有,有一些地方需要注意一下,但还是很快能安装完毕。安装完毕后使用命令行调用:

ciphey -t "需要解密的密文"

直接就返回明文以及具体的解答方式。

像这样:

经典给出一堆乱码,像这种:

base64以及凯撒等简单密码

这里装好相应的库,对着密文一通decode就能(大概?解出最最简单的题目了

比如:

var="************************************"
flag='NSSCTF{' + base64.b16encode(base64.b32encode(base64.b64encode(var.encode()))) + '}'
print(flag)

小明不小心泄露了源码,输出结果为:4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D,你能还原出var的正确结果吗?

这种就看着加密方式一步一步逆回去咯:

#4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D

import base64

ans="4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D"
#var=base64.decode(base64.b64decode(base64.b32decode(base64.b16decode(ans))),var)
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))


#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
#e1= 3247473589
#e2= 3698409173
#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

解题脚本:

#from xenny.ctf.crypto.modern.asymmetric.rsa import same_module

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)


# def de(c, e, n): #因为此时的m不是真正的m,而是m^k,所以对m^k进行爆破
# k = 0
# while k<1000: #指定k小于1000
# mk = c + n*k
# flag, true1 = gmpy2.iroot(mk, e) #返回的第一个数值为开方数,第二个数值为布尔型,可整除为true,可自行测试
# if True == true1:
# # print(libnum.n2s(int(flag)))
# return flag
# k += 1

# for e1 in range(2,e1e2):
# if e1e2%e1==0: #爆破可整除的e
# e2=e1e2//e1
# c=rsa_gong_N_def(e1, e2, c1, c2, n)
# e=gmpy2.gcd(e1,e2)
# m1=de(c, e, n)
# if m1: #指定输出m1
# print(libnum.n2s(int(m1)))

#m = same_module.attack(n, e1, e2, flag1, flag2)
m=rsa_gong_N_def(e1,e2,flag1,flag2,n)
print(m)
print(libnum.n2s(int(m)).decode())

中间被注释掉的部分是为了处理更难级别的题目,但在此题暂时还用不上。

暂时先到这里吧,RSA其中原理以及逆元还不是很清楚,摆烂(