查找XOR列表的初始值

时间:2018-02-19 12:56:49

标签: c++ cryptography xor

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

如何检索X?

e.g。

# create example data 
x = read.table(header = TRUE, stringsAsFactors = FALSE, text = 
"Taxon                                   B     Tip
Nitrosotalea_devanaterra                   1  Methanothermobacter_thermautotrophicus
Nitrososphaera_gargensis                   1  Methanobacterium_beijingense
Nitrososphaera_sca5445                     1  Methanobacterium_bryantii
Nitrososphaera_sca2170                     1  Methanosarcina_mazei
Methanobacterium_beijingense               1  Persephonella_marina
Methanobacterium_bryantii                  1  Sulfurihydrogenibium_azorense
Methanothermobacter_thermautotrophicus     1  Balnearium_lithotrophicum
Methanosarcina_mazei                       1  Isosphaera_pallida
Koribacter_versatilis                      1  Methanobacterium_beijingense
Acidicapsa_borealis                        1  Parachlamydia_acanthamoebae
Acidobacterium_capsulatum                  1  Leptospira_biflexa")

# Data management part
x1 = data.frame(A = x$Taxon,B = x$B)
x2 = data.frame(A = x$Tip,B = x$B)

x$B[which(x$Taxon == anti_join(x1,x2))] = 0

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

3 个答案:

答案 0 :(得分: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

如果你看到这一点,你应该知道从另一个人那里获得一个价值是不可能的。第三个总是需要两个。

答案 1 :(得分:1)

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

一种方法是配对仅在最重要位中不同的值。如果每对中较小的一个出现在较大的之前,则MSB必须为0;如果较大的首先出现,则MSB必须为1.

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

答案 2 :(得分:0)

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

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

然而,具有有效时间复杂度的通用算法将是困难的。