经历了一些CTF的任务,我偶然发现了有趣的挑战。以下程序将采用包含单行随机字母字符(标志)的标志文本文件。将通过随机字符旋转运行它并返回一个字符串
import random,string
flag = "FLAG:"+open("flag", "r").read()[:-1]
encflag = ""
random.seed("random")
for c in flag:
if c.islower():
#rotate number around alphabet a random amount
encflag += chr((ord(c)-ord('a')+random.randrange(0,26))%26 + ord('a'))
elif c.isupper():
encflag += chr((ord(c)-ord('A')+random.randrange(0,26))%26 + ord('A'))
elif c.isdigit():
encflag += chr((ord(c)-ord('0')+random.randrange(0,10))%10 + ord('0'))
else:
encflag += c
print "Unguessably Randomized Flag: "+encflag
输出:BNZQ:1l36de9583w5516fv3b8691102224f3e
任何人都可以解释这可以解决吗?
答案 0 :(得分:1)
随机播种,它应该生成相同的范围流。所以你可以使用相同的功能,但你应该改变:
encflag += chr((ord(c)-ord('a')+random.randrange(0,26))%26 + ord('a'))
进入
encflag += chr((ord(c)-ord('a')-random.randrange(0,26))%26 + ord('a'))
// change here -^
所有这三行。
这应该有效 - 直到有人在random
的位置放置一个不同的,更有效的算法,改变种子的处理等等。
这是使用random
实现的错误流密码,不要将其用于任何严重的问题。并且,因为使用非加密RNG而不是流密码即使对于加密演示代码也是相当愚蠢的,我也不会将它用于学习目的。