密码学伪随机

时间:2017-04-11 11:50:44

标签: python random cryptography

经历了一些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

任何人都可以解释这可以解决吗?

1 个答案:

答案 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而不是流密码即使对于加密演示代码也是相当愚蠢的,我也不会将它用于学习目的。