2017-04-11 5 views
0

いくつかのCTFタスクを経て、私は面白いチャレンジを見つけました。以下のプログラムは、1行のランダムな英数字(フラグ)を含むフラグテキストファイルを取り込みます。暗号化疑似ランダム

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 OK、それはすべて小文字で、小文字よりも多くの桁を持っています。 32の16進数であり、したがってハッシュ値になる可能性があります(私はここで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暗号の変形です。 –