2017-04-11 101 views
0

通過一些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

我想你可以嘗試將它反轉,因爲你知道'seed'(「random」)和部分未加密的字符串(「FLAG:」)。看到輸出我想象的加密文本應該是一個md5哈希(32個較小的字母數字字符) –

+0

@tmadam好的,因爲它是所有數字和小寫,並且比小寫字母更多的數字我會告訴你結果應該可能包含32個十六進制數,因此很可能是一個散列值(我沒有在這裏運行python)。 –

+1

*「任何人都可以解釋這可以解決?」* - 這裏有什麼問題?我沒有看到有什麼要解決的。你想扭轉它嗎? –

回答

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代替流密碼也是相當愚蠢的,所以我也不會將它用於學習目的。

+0

準確地說,這是Vigenère密碼的一個變體,它與僞隨機生成密鑰一樣長,只要明文。 –