记录cryptohack的一些笔记
xor
异或具有一些性质,异或与顺序无关,与0异或数据保持不变,与自身异或结构为0,所以一个数据本身异或两次值不变。
KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
由所给信息以及异或的性质可得:f^k1^k2^k3=f1 –> f^k1^k1^k23^k23=f1^k1^k23,即f=f1^k1^k23
所以题解为
要注意在使用xor函数时数据需要从16进制的数据转换为byte类型,或者字符串或者纯数字的形式
1 | from Crypto.Util.number import long_to_bytes |
得到flag
1 | b'crypto{x0r_i5_ass0c1at1v3}' |
xor的后两题非常相似
题解为
1 | from Crypto.Util.number import long_to_bytes |
得到一串字节串
1 | b'\x10\x10\x10\x10\x10\x10\x10C\x1aXP;N^,\x0f\x10?\x02K\x1dC\x17\x1bQSL4\x11\x1b^\x05\x19' |
所以推得密钥就是\x10
所以讲上面代码中的‘crtpto{’更改为’\x10’即可
得到flag:crypto{0x10_15_my_f4v0ur173_by7e}
第二题以同样的方式拿到了一个字节串
1 | b'myXORke+y_Q\x0bHOMe$~seG8bGURN\x04DFWg)a|\x1dTM!an\x7f' |
推测密钥就是myXORkey,结果正确,但是观看题解后发现密钥一共8位,而输入的‘crypto{’只有7位,所以前7位是正确的,最后一个y可以由字符串的结尾一定是‘}’来得到,copy一下大佬的题解做个纪念(doge
1 | from pwn import xor |
数论
第一题就是最简单的求最大公因数,本来以为辗转相除法就够简单了,没想到还有个现成的gcd()函数,调用一下math库,把两个参数放进去即可得到最大公因数为1512