无法实施婴儿床拖动

时间:2014-05-07 04:06:46

标签: drag xor pad

所以我在Coursera参加了斯坦福大学的密码学课程,我一直在努力完成第一个编程任务(我已经落后几周了。)

我已经玩了几周不同版本的代码,试图删除下面提到的问题......

起初,我以为我得到了一个成功的婴儿床拖动,但后来我意识到了很多问题,其中没有一个我能够解决:

  • "解密"当婴儿床被拖过两个密文的XOR时,结果从错误的一端缩短("">" Th">" T&# 34;而不是"">"他">" e")
  • 婴儿床拖拽的结果不是另一条消息的文本,而是婴儿床本身......换句话说,无论我选择什么婴儿床,前X个索引总是返回婴儿床本身< / LI>

以下是代码:

def string_xor(a, b):
    return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a ,b)])

def manual_crib_drag(word):
    with open("two_ciphers.txt", "r") as f:
        cipher1 = f.readline()
        cipher2 = f.readline()

    xor = string_xor(cipher1, cipher2)
    word_hex = word.encode("hex")

    for x in range(len(xor)):
        try: 
            result = string_xor(xor[x:x+len(word_hex)], word_hex)\
                                           .strip().decode("hex")
            print x, ":", result
        except TypeError, e: print 

以下是运行manual_crib_drag(&#34;&#34;)时的结果:

0 : The
1 : The
2 : The
3 : The
4 : The
5 : The
6 : The
7 : The
8 : The
9 : The
10 : The
11 : The
12 : The
13 : The
14 : The
15 : The
16 : The
17 : The
18 : The
19 : The
20 : The
21 : The
22 : The
23 : The
24 : The
25 : The
26 : The
27 : The
28 : The
29 : The
30 : The
31 : The
32 : The
33 : The
34 : The
35 : The
36 : The
37 : The
38 : The
39 : The
40 : The
41 : The
43 : The?
46 : Tcn$
53 : ??S
71 : PN?
80 : CT"#
83 : ?Q?
88 : `n$
94 : P'e<
99 : U??
118 : b}l
123 : Ǹd?
132 : Tokf
138 : X6%
148 : YW0-
155 : ??4d
161 : ???
171 : ??!
173 : ??d1
177 : Uy?G
200 : hm
202 : de*t
218 : Xn q
238 : Ti0:
249 : 4|5!
253 : i?u
258 : ;G+
263 : t?Qq
269 : )?
275 : t??
282 : Z
285 : G?d
313 : sLtU
319 : !9u?
320 : yo
325 : ?kv0
329 : Gx??
331 : Dﺹ?

为了完整起见,以下是示例中使用的两个密文:

32510bfbacfbb9befd54415da243e1695ecabd58c519cd4bd2061bbde24eb76a19d84aba34d8de287be84d07e7e9a30ee714979c7e1123a8bd9822a33ecaf512472e8e8f8db3f9635c1949e640c621854eba0d79eccf52ff111284b4cc61d11902aebc66f2b2e436434eacc0aba938220b084800c2ca4e693522643573b2c4ce35050b0cf774201f0fe52ac9f26d71b6cf61a711cc229f77ace7aa88a2f19983122b11be87a59c355d25f8e4

32510bfbacfbb9befd54415da243e1695ecabd58c519cd4bd90f1fa6ea5ba47b01c909ba7696cf606ef40c04afe1ac0aa8148dd066592ded9f8774b529c7ea125d298e8883f5e9305f4b44f915cb2bd05af51373fd9b4af511039fa2d96f83414aaaf261bda2e97b170fb5cce2a53e675c154c0d9681596934777e2275b381ce2e40582afe67650b13e72287ff2270abcf73bb028932836fbdecfecee0a3b894473c1bbeb6b4913a536ce4f9b13f1efff71ea313c8661dd9a4ce

对这两个密文进行异或的结果是:

PRX]
TS\TW]SW\[\VTS\^W[
TVSPZWSQV
[TZ[P\Q[PZRUS[TVTU[ZUQT[][SZRTWV
h

我不确定为什么它被分成不同的行,但我的猜测是它与密文XOR结果中的空格有关...包含了string_xor函数内部的返回另一个加入,虽然似乎可以做到这一点,但因为它似乎不会影响婴儿床阻力的结果,所以我把它从提供的代码中删除了:

" ".join("".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a ,b)]).split())

我很感激任何帮助!提前谢谢。

1 个答案:

答案 0 :(得分:0)

尝试首先将其转换为ascii,然后执行xor

x = strxor(unhexlify(ciphertexts[0]),unhexlify(target))
  print "Ciphertext[0] xor Target\n"
  crib = raw_input("Enter Crib:>")
  print "Crib\n-->%s<--"%crib
# Crib Drag
  for i in range(len(x)):
     z = x[i:]
     print "\n[%d]"%i
     print "%s"%strxor(z,crib)