Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[python3]Cryptopals1.5: Rare fout door decoderen \n teken

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoihoi

Ik ben met cryptopals bezig; dat is een challenge waarbij je diverse crypto-dingen gaat coden.
Een van de dingen waar ik momenteel op crash is het programmeren van een repeating XOR.

Op zich is de code prima, maar ik merk dat ik niet handig om ga met een newline in de input...
Het betreft:
http://cryptopals.com/sets/1/challenges/5/


Wat ik doe is dit:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cryptopals
import functools

plaintext=['Burning \'em, if you ain\'t quick and nimble','go crazy when I hear a cymbal']
plaintext=['Burning \'em, if you ain\'t quick and nimble\ngo crazy when I hear a cymbal']

key="ICE"
desired_output='0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f'

for p in plaintext:
    plainbytes=cryptopals.str_to_bytes(p)
    keybytes=cryptopals.str_to_bytes(key)
    output=cryptopals.xor(plainbytes,keybytes)
    result = functools.reduce(lambda x,y: str(x)+str(y), list(map(lambda x: format(x,'x').zfill(2),output)))
    print (result)

print (desired_output)


Die desired_output is puur om makkelijk te checken of de boel klopt.
Mijn functies (uit de eigen cryptopals package):
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def xor(input,key):
    """
        xor the input against key. 
        Parameters:
            input: bytearray of input data
            key: bytearray of key
        Return value:
            'input' xor'ed against repeating-key 'key' 
    """    
    key_index=0
    result=[]
    for i in input:
        result.append(i^key[key_index%len(key)])
        key_index+=1
    return result

def str_to_bytes(s):
    return (bytearray(bytes(s, "utf-8")))


Op zich zijn deze volgens mij prima, ik krijg namelijk de volgende output:
0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f2043242a69203728393c69342d2c2d6500632d2c22376922652a3a282b2229
0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f
Ik heb hem even in een quote gezet zodat ik bold kan gebruiken... wat je ziet is dat de expected result net iets langer is en anders. Dit komt omdat de \n niet wordt meegenomen; ik vermoed dat dat aan mijn encore-aanroep ligt, maar zeker weten doe ik het niet.

Kan iemand me een hint de goede richting op geven?

Ik weet overigens dat ik mijn plaintext 2x definieer, wil daarmee aangeven dat ik ook op die manier heb zitten pielen, maar dat lijkt me niet de way to go. Of wel?

  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 03:39
Je gebruikt
code:
1
plaintext=['Burning \'em, if you ain\'t quick and nimble\ngo crazy when I hear a cymbal']

echter is de text: I go crazy
Met
code:
1
plaintext=['Burning \'em, if you ain\'t quick and nimble\nI go crazy when I hear a cymbal']
krijg je wel de juiste output

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Ok dit is echt ernstig. Damn, dit heeft me heel veel uren prutsen/klooien gekost.

Dank man... wat een slecht-wakker-moment hier :D.

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Met dit soort dingen kan het helpen om de string gewoon weg te gooien en opnieuw neer te zetten, dan vang je typo's af a la shotgun debugging :p