hillstone-crypto
山石摸底密码。
首先是AD原题三道
Normal RSA
就是rsa初试炼,使用openssl解开就行
Easy Chall
pyc反编译,用的https://tool.lu/pyc
然后把过程逆回去就行了。
Railfence
这个题的关键是异形篱笆。没找到自动化工具,手画了一下。
然后其他古典密码
safer_than_rot13
看到比rot13安全想到维吉尼亚,用https://www.guballa.de/vigenere-solver和https://quipqiup.com/fen分别试了试,就出来了。
flag_in_your_hand
网页分析,加密就是ascii上的凯撒,解密即可。
然后本地跑起来网页,解决问题。
Hill
希尔密码,因为只有4位,用计算器求逆之后直接摸了个答矩阵乘出来,最后求模结束。
求出来模发现好像是倒序的,正过来就行了。
试了多次之后搜了搜flag,发现是XMAN的,套上,完成。
enc
差点被骗,看了hint才发现原来是不懂加密与编码
zero one转化01,转16进制看到=,于是转字符解base64得到摩斯电码,解电码得flag,懒得配格式了,所以直接搜了一下。
fanfie
都说了是仿射密码,直接爆破12*26种可能性看跟B32后的“BIT"的关系得到k=13,m=4,然后就解出来了对应的B32,再解码即可。
Enigma
其实是先做的这个题,【因为对enigma和turing有执念】,然后解出来发现是BITCTF然后感觉他跟前一个题都一个格式所以就直接用BIT试上个题了。但是这个题无论是BIT还是BITS都交不上,恼。
大概过程是类似于manytimes,把某个符号用题中所说的xor转换为空格依次穷举,最后得到文段
1 2 3 4 5 6 7 Britische Passagier-Konvoi beschmutzt bei 60 Grad Norden und 15 Grad Westen. Nehmen Sie es sofort 06:30, Das Wetter ist heute klar. Regen am Abend Advance Ihre Einheit 1 Grad Norden und 2 Grad Osten Der Code f9r den Tag ist BITCTF{Focke-Wulf Fw 200} Berichte der britischen Marine9berwachung in Ihrer Region. Gehen Sie undercover Wir verfehlen Torpedos. Nur 2 9brig. Senden Sie die Lieferungen sofort
但交不上。
Meitantei-Konan
题目提到二进制,打开文段发现有两个奇怪的大写字母。所以先提取大写字母转换二进制(今天突然意识到,直接第一个出现就是1就行,毕竟没有先导零)转16进制发现等号,直接丢base得到结果。
对称密码
SM
看了半天不知道这仨文件啥意思,后来读流程明白了:enc_flag,prime_list,result,那就从r入手。
读流程,发现ps里的512个数,尾0个数均不相同,然后前边的1用来隔断。那我们就可以进行对bchoose的恢复,思路是,如果未处理的最后一位是1则说明这个长度的数一定被选了,否则其他位都为0弄不出1,然后把这个数踢出去就行了,依次还原拿到choose密钥,解答。
DES-OFB
这个题提到弱密钥的问题,回去翻了翻密码学导论的视频,找了四个弱密钥试了试,解密出来了。
Crackme_c
一点钟才看这个题,知道是白盒算法,但是实在没有逆向的欲望,就鸽掉了。
公钥密码
FR
这个题是铜匠的特例我知道,但是上周做的时候就没能找到比较好的脚本,自己也不太会写sage,就本来想放掉。但看有人拿了一血心有不甘最后搜到了一个只有常数项的脚本拿来用,然后跑出来了。
脚本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 from binascii import hexlify, unhexlify from string import printable def str_to_num(s): return int(hexlify(s), 16) def num_to_str(s): hexed = hex(s)[2:] if len(hexed) % 2 == 1: hexed = "0" + hexed return unhexlify(hexed) def gcd(a, b): while b: a, b = b, a % b return a.monic() def franklinreiter(c_1, c_2, e_1, e_2, N, a, b): P.<X> = PolynomialRing(Zmod(N)) g_1 = X^e_1 - c_1 g_2 = (a*X + b)^e_2 - c_2 # get constant term result = -gcd(g_1, g_2).coefficients()[0] return result from Crypto.Util.number import * e=97 n = 84269628806628781622507370036906808448839409721977257257396947220517063278172143243373016442536940094975199987168688897097566864807761212932118112781104578316146789965949837582463220212424879653817674186105043635959164819551849838163407474186956994154343889566259817124112823393438177178491833184663625002307 c1 = 4367045304656659698449596198948655706573350092598126520098334085945664595511123103061115913724966329224613426945287709048189812525429266880245845308509596870556543628717643821736193593457634176070986308217908141706740064366214831497923020037957821377535506846586876895644294528719184849601842193542503770105 c2 = 18439195353553734943512734644675774925515052571887978283192748995024360104715734306851342648521178376040518910878900749929914172981658210215016295962358232190555718924582980345277742925695082593615543248816707387990770234530122132967572178361530081382967982613654681901780215929839067687184916612502957185234 diff=929687493544402957343392779L # from python script plain = num_to_str(franklinreiter(c1, c2, e, e, n, 1, diff)) print(plain)
简单的RSA
还是铜匠,其实就是低位被反转了嘛hhhhhh,直接上高位攻击的脚本。
用了RSA-and-LLL的脚本,华丽失败。开始搜striving的博客,最后找到了能用的高位攻击脚本。
在这之前先通过ed分解old pq.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def getpq(n, e, d): p = 1 q = 1 while p == 1 and q == 1: k = d * e - 1 g = random.randint(0, n) while p == 1 and q == 1 and k % 2 == 0: k /= 2 y = pow(g, k, n) if y != 1 and gcd(y - 1, n) > 1: p = gcd(y - 1, n) q = n / p return p, q
然后上高位即可。
不过cop的原理我还是不太懂,只能是一直蹭脚本的样子,希望以后能学明白。
EzRSA
这个题之前和striving一起搞过,核心在于p=gcd((b-2021)**2021-a,n)