翻转字节中的最后一位

2 投票
1 回答
2216 浏览
提问于 2025-04-17 22:42

我们的最终目标是翻转位置X的字节的最后一位。假设我们从一个网站获取了一个字符串,然后进行base64解码,这样我们就能处理它了:

IV = "2RDs+xm/AxtYj+XViJmBPQ=="
IV = base64.b64decode(IV)

解码后得到的内容看起来像是(����X��Ո��=),虽然看起来像垃圾数据,但我们可以用它。处理这些数据的最好方法是把它放到一个列表里。

woop = list(IV)

在这个例子中,我们想要翻转第二个字节的最后一位。Python的计数是从零开始的,所以我们需要把计数器减1。否则,我们就会指向第三个字节!要翻转任何东西,我们可以用异或(XOR)操作和1进行运算。不过,我现在遇到了一个问题……

CounterX = CounterX - 1
woop[CounterX] = chr(ord(IV[CounterX]) ^ 1)
woop = "".join(woop)
IV = woop

我很确定这样会翻转整个字节。那我该怎么做才能只翻转IV[CounterX]这个字节的最后一位呢?

1 个回答

2
  • base64.decode 这个函数会返回一个字符串。
  • 在 Python 2.x 版本中,字符串总是以字节的形式存在!
    • 如果你在用 Python 3,可能需要调用 bytes(IV) 来确保处理的是 8 位的块……不过我不太确定,因为我不常用 Python 3。
  • 用一些整数进行异或运算,比如 some_int XOR 1,只会改变最低位的字节。
    • 你可以通过 print bin(0xff ^ 0x01) 来验证这一点。

那么,我们再回到你为什么觉得看到的行为不是这样的呢?能给我们一个例子来说明这个问题吗?

撰写回答