一段Python解密题

2013-06-20 23:58:30 +08:00
 Lucius
def squarer(value, key):
if len(value) % 2 == 0:
p = int(round(len(value)) / 2.0)
value = reversed(value[-p:]) + reversed(value[:p])
k = 0
result = ''
for v in value:
if ord(v) ^ ord(key[k]) < 32 | ord(v) ^ ord(key[k]) > 126 | ord(v) < 0 | ord(v) > 255:
result += v
else:
result += chr(ord(v) ^ ord(key[k]))
k = 0 if k == len(key) else k + 1
return result

print(squarer('ma=cjy', '???'))

输出结果是xamyjc

求 ???
3079 次点击
所在节点    Python
7 条回复
jackyzy823
2013-06-21 00:23:07 +08:00
v2ex code的排版不忍直视。。。。
TankyWoo
2013-06-21 07:37:25 +08:00
我记得v2ex好像可以嵌套gist,楼主可以试试,或者贴在gist/pastebin/pastie/codepad上然后给个链接吧,Python没缩进不忍直视啊。。。
y0
2013-06-21 07:53:41 +08:00
reversed 返回的是 iterator, 怎么加啊。这程序放 python 里会报错。
y0
2013-06-21 08:08:25 +08:00
k 是一个循环的变量,但这段代码会出现 string index out of range.

比如 len(key) = 3, 到第四步 k = 3, key[3] 已经 out of range 了,在 for loop 的末尾才能更新成 0. 除非你想说这表示 key 至少有 6 位...
Mutoo
2013-06-21 09:59:24 +08:00
光靠这一组数据,没办法推出真正的key,注意第二位的 a 经过转换后,仍为 a
说明 ord(v)^ord(key[k]) < 32 或 ord(v)^ord(key[k]) > 126 且此时 k = 1
k[1]的解有 2^5 + 1 + 2^7 种

不像 k[0] 可以明确算出来是21

m 109 01101101
x 120 01111000

01101101
00010101 21 k[0]
01111000
efi
2013-06-21 12:12:38 +08:00
@y0 k = 0 if k == len(key) else k + 1
k只有超界之后才可能归0,在此之前已经IndexError掉了,洗洗睡吧
y0
2013-06-21 18:13:09 +08:00
@efi 我说的和你说的是一个意思啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/73080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX