引言
开学半个月了,原本定的每日一题计划至今还没有实施(咕咕咕)
新学期首次CTF社团培训,让我们按方向分组每周做题发到博客上
(然而搞crypto的好像只有我一个😂)
想起寒假的cryptohack任务还有一大部分没搞,就突然感觉很无力很挫败
然后决定转战BUUOJ
希望这个系列能一直做下去
也当是写日记了
Rabbit
Rabbit, Tank, Best Match
不好意思,搞错了😂
题目就是一串加密字符:U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
然后搜一下Rabbit加密
解密网站:http://www.jsons.cn/rabbitencrypt/
当然,解出了题目是不够的
一个关于Rabbit加密的文档:https://www.ietf.org/rfc/rfc4503.txt
Rabbit流密码(Rabbit Stream Cipher)简介:
Rabbit流密码是由Cryptico公司(http://www.cryptico.com)设计的,
Rabbit输入128bit的密钥和64bit的IV初始向量,每次迭代后从513bit内部状态中生成128bit的伪随机序列。最大加密消息长度为
2
64
2^{64}
264 bytes,即16TB,若消息超过该长度,则需要更换密钥对剩下的消息进行处理。
那么,什么是IV初始向量呢?
在密码学的领域里,初始向量(英语:initialization vector,缩写为IV),或译初向量,又称初始变量(starting variable,缩写为SV),是一个固定长度的输入值。一般的使用上会要求它是随机数或拟随机数(pseudorandom)。使用随机数产生的初始向量才能达到语义安全(消息验证码也可能用到初始向量),并让攻击者难以对原文一致且使用同一把密钥生成的密文进行破解。(摘自wiki)
篱笆墙的影子
老谜语人了
一看题目就知道这是个栅栏密码
密文:felhaagv{ewtehtehfilnakgw}
m = 'felhaagv{ewtehtehfilnakgw}'
c = ''
for i in range(0, len(m), 2):
c += m[i]
for i in range(1, len(m), 2):
c += m[i]
print(c)
RSA
题目:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flag提交
RSA加密原理:
选择两个大素数p和q,计算出模数N = p * q
计算φ = (p−1) * (q−1) 即N的欧拉函数,然后选择一个e (1<e<φ),且e和φ互质
取e的模反数为d,计算方法: e * d ≡ 1 (mod φ)
对明文m进行加密:c = pow(m, e, N),得到的c即为密文
对密文c进行解密,m = pow(c, d, N),得到的m即为明文
import gmpy2
p = 473398607161
q = 4511491
e = 17
phi = (p-1) * (q-1)
print('d = ' + str(gmpy2.invert(e, phi)))
结语
炸鱼一时爽,一直炸鱼一直爽(doge)
希望能坚持