像恺撒密码sytn对应的flag
在字母表中的序列
s 第19位 f 第6位
y 第25位 l 第12位
变异恺撒
基础的恺撒密码是将明文中的字符,按照固定的偏移量向后(或向前)进行偏移,从而形成密文
变异恺撒密码也应该是基于这个原理
根据打开附件中的内容,推断开头应该是flag,那么结合ASCII表
发现第一个a向后移5位得到f,第二个f向后移6位得到l,Z向后移动7位得到a
综上规律,应该是初始位移5,然后依次向后加1
str="afZ_r9VYfScOeO_UL^RWUc"
k=5
for i in str:
print(chr(ord(i)+k),end='')
k+=1
RSA的最简单的形式
import libnum
p = 473398607161
q = 4511491
e = 17
n = p * q
f_n = (p-1)*(q-1)
d = libnum.invmod(e, f_n)
print(d)
丢失的MD5
import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
#主要修改的是下面这行,加了encode('utf-8'),然后用大括号将括起来update后的语句括起来
m.update(('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM').encode('utf-8'))
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print(des)
以为是一种简单的密钥破解密文,看了wp才知道,是要异或,果然越长的提示,往往就藏了东西在里面。
01信息从文件中Hex信息转为二进制可以得到。
首先异性是相吸的,先看异性,异性在就是性别对立的,那么在计算机中对立的就比较清楚的就是二进制0和1是对立的。然后看相吸,可以看到异或的原则,相同为0,不同为1。
编写脚本
flag
RSA
这题首先获得两个文件一个是pub.key和flag.enc
在选择用wireshark打开flag.enc时,提示打开错误,
打开pub.key,发现也不是常见得n e d p 等相关信息
因此采用脚本,获取e,n
f=open("C:\\Users\\BIGbig\\Desktop\\123\\pub.key","r")
key=RSA.import_key(f.read())
f.close()
e=key.e
n=key.n
print(e)
print(n)
将n进行分离后获得p、q 网站http://factordb.com/index.php?
最后脚本获取flag
RSARoll
下载文件后,获取一个txt文本
根据内容发现-{920139713,19} 前面的应该是n,后面的应该是e
根据RSA算法 p、q应该是n的公因子
d = gmpy2.invert(e, (p - 1) * (q - 1))
然后
flag = ''
for c in crypto_text:
m = gmpy2.powmod(c, d, n)
flag += chr(m)
就可以获取flag了
Dangerous RSA
下载下来附件后,根据相关信息属于是RSA的
但是相较于普通的RSA
信息像是由十六进制构成的
低加密指数攻击:
假设e=3, 公钥中的加密指数e很小,但是模数n很大
有RSA加密公式: C=M^e % n (C密文,M明文)
则:
当M^e < n 时,
C = M^e ,所以对C开方就能得到M
当M^e > n 时,此时用爆破的方法
假设我们 M^e / n 的商为 k 余数为C,
则M^e = kn + C,对K进行爆破,只要k满足 kn + C能够开e次方就可以得明文
根据这个写一个脚本就可以得到flag了
#python3
## -*- coding: utf-8 -*-#
from gmpy2 import iroot
import libnum
e = 0x3
n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793
c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365
k = 0
while 1:
res = iroot(c+k*n,e) #c+k*n 开3次方根 能开3次方即可
#print(res)
#res = (mpz(13040004482819713819817340524563023159919305047824600478799740488797710355579494486728991357), True)
if(res[1] == True):
print(libnum.n2s(int(res[0]))) #转为字符串
break
k=k+1
#b'flag{25df8caf006ee5db94d48144c33b2c3b}'