【问题标题】:xor function in pythonpython中的异或函数
【发布时间】:2014-04-08 16:37:51
【问题描述】:

如果有人可以帮助我在 python 中使用 XOR 函数,我会很高兴。

例如,我有两条非常大的消息(大约 300 个符号),它们是用十六进制代码编写的 我怎样才能正确地对它们进行异或? 我尝试使用通用函数并转换为其他类型,但我无法做到这一点(

我不知道我需要转换哪种类型的数据?

【问题讨论】:

  • 您能否澄清一下,消息中的“符号”在文本中是十六进制的,即像 "46 6f 6f" 这样的字符串?
  • 对了,就是 -->> e877a5e68bea88d61b93ac5ee0d562e8e9...
  • 1.看起来您正在尝试进行加密。使用现有的加密库而不是自己滚动。 2. 你的投入和期望的产出是什么?你试过什么?

标签: python xor


【解决方案1】:

如果我正确地回答了你的问题,如果你有 2 个十六进制数字表示为字符串:

a = "e877a5e68bea88d61b93ac5ee0d562e8e9"
b = "23fe3231699ade23482"

您可以使用某种掩码对它们中的任何一个进行异或,方法是转换为 int,并应用按位异或运算符:

xor_result = int(a, 16) ^ int(b, 16)

print '%x' % xor_result

如果你想保持原来的格式

string_xor_result = hex(xor_result)[2:]

【讨论】:

  • 最好的方法是尝试一下,但是python有任意精度的int,所以应该没问题。
  • 正如 Xavier 所说,python 可以处理非常非常大的整数(唯一的限制来自机器可用内存),所以 300 位十六进制数(~16 ** 300)不是问题.
  • 如果它包括将结果转换回十六进制数字字符串,我会投票赞成...
  • 顺便问一下,它适合不同长度的字符串吗? ——
  • @user1813163,是的,从技术上讲,较短的字符串(较小的数字)将在前面加上前导零。
【解决方案2】:

遍历字符串 chars,然后将每个 char 转换为 int (int(a,16)),然后应用 xor,使用 hex 重新转换为十六进制,使用 [2:] 去除前导 '0x',最后加入所有内容

stra = 'abc'
strb = 'abd'
''.join(hex( int(a,16) ^ int(b,16) )[2:] for a,b in zip(stra, strb))

请注意,正如 cmets 中所指出的,它仅在两个字符串具有相同长度时才有效。否则较长字符串的某些字符将被忽略。

【讨论】:

  • 如果两个字符串的长度不相等,这不会中断吗?
  • 这取决于你所说的 break :)。 zip 将仅返回其参数的最小长度的元组。 zip('abc','ab')[('a', 'a'), ('b', 'b')]
  • 我将忽略其中一个值的一部分称为“损坏”。
【解决方案3】:

如果两个字符串长度不同,可以加一行,循环()

stra = raw_input("msg: ")
strb = raw_input("key: ")
strb = cycle(strb)

print ''.join(hex( int(a,16) ^ int(b,16) )[2:] for a,b in zip(stra, strb))

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多