【问题标题】:Find initial value of a XOR list查找 XOR 列表的初始值
【发布时间】:2018-02-19 12:56:48
【问题描述】:

我有一个数字池,其中一个数字 X 已与所有其他数字进行异或运算。从这些比较中,最小 XOR 值以排序格式存储在列表中。

我怎样才能找回 X ?

例如

List: { 3, 2, 1, 0, 15, 14, 13, 12 }
Looking for X so that:
X ^ 3 < X ^ 2 < X ^ 1 <... < X ^ 12

可能不是只有一个X,甚至没有X。当我们不知道XOR的初始值和结果而只是比较值时,有没有办法恢复XOR的过程?鉴于我们知道整个数字池,如何有效地解决这个问题?

【问题讨论】:

  • 太模糊了。如果您可以提供示例输入/输出,我们可能会进行调查。
  • 还要注意二进制 XOR 是可交换的。即a XOR b 等于b XOR a
  • 你知道初始池的内容吗?
  • @TobySpeight 是的,池是已知的。

标签: c++ cryptography xor


【解决方案1】:

你可能做不到。

XOR 是一个非常特殊的运算。它的特性使得仅给定一个操作数或结果就无法计算出任何东西。

如果A xor B == C,那么我们有所有其他五个表达式:

  • C xor A == B
  • B xor C == A
  • C xor B == A
  • A xor C == B
  • B xor A == C

如果您看到这一点,您应该知道不可能从另一个值中获取一个值。第三个总是需要两个。

【讨论】:

  • 排序约束有影响吗?这是问题的有趣部分。
  • @TobySpeight 绝对不是。
【解决方案2】:

这在很大程度上取决于您的输出。问题可能是欠约束的,给出了许多可能的 X 值。或者它可能是不可能的(没有 X 满足约束)。

一种方法是将仅在最高有效位上不同的值配对。如果每对中较小的出现在较大的之前,则 MSB 必须为 0;如果较大的先出现,则 MSB 必须为 1。

有了这些知识,我们可以考虑仅在前两位不同的对,依此类推。

【讨论】:

  • 这意味着我必须将列表的数量与整个池进行比较?我一直在寻找 O(N^2) 的解决方案。
  • 不,我的意思是您在列表中找到的值对。在示例中,我们有 31,它们仅在 2¹ 位上有所不同。 3 出现在 1 之前,因此必须设置 X 的第 1 位。以此类推。
  • 您能详细说明一下吗?我怎样才能通过这种方式找到 X?
  • 我不愿意对此进行进一步的推理,因为您没有证明自己的进步 - 用勺子喂养解决方案不是我来这里的原因。跨度>
  • 我的解决方案是找到所有池的 XOR,然后让列表检查最接近的池。但是ofc是很不够的,所以我来这里就位操作寻求一些帮助
【解决方案3】:

如果输出中的某些条件为真,则可以相当有效地确定 X 的值。

例如: 如果值 15 在输出数组中,那么您会知道 X 是其他数字之一的二进制补码。此外,如果值 0 在输出数组中,您会知道这是 X 与自身进行异或的结果。

然而,具有高效时间复杂度的通用算法会很困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2020-03-07
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多