buu 异性相吸 & yxx

异性相吸

题目描述:

buu 异性相吸 & yxx_第1张图片

buu 异性相吸 & yxx_第2张图片

题目分析(两种解法):

第一种:
  • 文件中并没有过多提示,只有异性相吸这一提示,那么便想到了异或

异或:
逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型,符号为 xor 或 eor 或 ⊕(编程语言中常用^)
计算机中异或是以二进制数据为基础进行运算的;也就是说当代码中使用到异或运算时,都会先将两个条件进行转换,转换成二进制数据后,再进行运算。运算规则:两个操作数的同位中,如果值相同(都是0或者都是1)则为0,不同(一个是0,一个是1)则为1,即:

1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1

  • 由此我们便能想到用010打开文件,取两文件的二进制数进行异或,得到异或值后再将其转化为字符串
    buu 异性相吸 & yxx_第3张图片
    buu 异性相吸 & yxx_第4张图片

  • 解密脚本如下:

import libnum
c = '00000111 00011111 00000000 00000011 00001000 00000100 00010010 0101010100000011 00010000 01010100 01011000 01001011 01011100 01011000 0100101001010110 01010011 01000100 01010010 00000011 01000100 00000010 0101100001000110 00000110 01010100 01000111 00000101 01010110 01000111 0101011101000100 00010010 01011101 01001010 00010100 00011011'.replace(' ','')
k = '01100001 01110011 01100001 01100100 01110011 01100001 01110011 0110010001100001 01110011 01100100 01100001 01110011 01100100 01100001 0111001101100100 01100001 01110011 01100100 01100001 01110011 01100100 0110000101110011 01100100 01100001 01110011 01100100 01100001 01110011 0110010001110001 01110111 01100101 01110011 01110001 01100110'.replace(' ','')
m = ''
for i in range(len(c)):
    if c[i] == k[i]:
        m += '0'
    else:
        m += '1'
print(libnum.b2s(m))
  • 得到:flag{ea1bc0988992276b7f95b54a7435e89e}
第二种:

直接python打开要读取的文件进行异或转换
(注:要读取的文件和所写的代码要放入同一个文件夹中)
代码如下:

key = open("key.txt", 'rb').read()
cipher = open("密文.txt", "rb").read()

flag = []
result = ""
for i in range(len(key)):
    flag.append(key[i] ^ cipher[i])
    result += chr(flag[i])
print(flag)
print(result)

yxx

和上面一题解法一模一样,这里就不过多解说了

  • 得到:flag{xor_xor_xor_biubiubiu} xor为异或符号

收获与体会:

要我说以后遇到这种有两串文字,一串是乱码(看不懂的字符),一串是看得懂的字母,且形式还挺相同的,如:

m: asadsasdasdasdasdasdasdasdasdasdqwesqf

m: lovelovelovelovelovelovelovelove

c: ἇ̀Ј唒ဃ塔屋䩘卖剄䐃堂ن䝔嘅均ቄ䩝ᬔ

c: V

0
0
0

如果没有其他有用的提示,那么就用异或来做,也只能用异或来做,但关键是做题的时候要想得到这种方法

你可能感兴趣的:(buuctf,密码学,安全)