密码学伪随机

2024-06-16 13:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

通过一些CTFs任务,我偶然发现了一个有趣的挑战。下面的程序将接收包含单行随机字母数字字符(flag)的flag文本文件。将通过随机字符旋转运行它并返回一个字符串

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

有人能解释这能解决吗?你知道吗


Tags: 字符串程序字母数字random字符flag文本文件
1条回答
网友
1楼 · 发布于 2024-06-16 13:27:51

作为随机种子,它应该产生相同的范围流。因此,您可以使用相同的函数,但应更改:

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

相关问题 更多 >