mechanikmike schrieb:
> Also wie ich es verstehe, gibt die Funktion einen verschlüsselten text
> aus, der mit dem key verschlüsselt wird, aber was passiert genau?
Wenn du nicht weißt was der Code macht Probiere es aus, Python kann dir
helfen. Ich weis z.b Nicht was der Code macht, okay man kann es an den
Funktions namen Ableiten. Aber gehen wir mal systematisch vor.
1.) die Funktion ist klein also könnten wir einfach einen ipython (
Gutes Tool um python zu Analysieren) oder eine Python auf der Komando
Zeile starten. und dort dann die Funktion untersuchen.
> def encrypttxt(key, text):
Die Funktion will also 2 Parameter, der erste heißt key der Zweite Text,
okay das ist erstmal für denn Hinterkopf.
> randint = struct.unpack('H', Random.get_random_bytes(2))[0]
Hier werden funktionen aus 2 Modulen gerufen,
struct.unpack und Random.get_random_bytes, d.h. der Interpreter braucht
die beiden Module, also mal orginal Quelltext gucken wo die herkommen.
struct ist ein Standard Python, ergo:
Random, ist im standart klein geschrieben wird, also eine andere Libary
sein. Vermutlich das zeug aus der Cryptolib ergo
1 | In [2]: from Crypto import Random
|
jetzt sollte das Stückchen Code ausführbar sein und es kann analysiert
werden.
1 | In [3]: struct.unpack('H', Random.get_random_bytes(2))[0]
|
2 | Out[3]: 301
|
3 |
|
4 | In [4]: struct.unpack('H', Random.get_random_bytes(2))[0]
|
5 | Out[4]: 1507
|
Bei jeden aufruf, kommt also eine andere Zahlraus, der name
Random.get_random_bytes lässt drauf schließen das die Funktion das
macht, dann mal mit help nachlesen was die Interne Hilfe zur Funktion
sagt
1 | In [5]: help(Random.get_random_bytes)
|
2 | Help on function get_random_bytes in module Crypto.Random:
|
3 |
|
4 | get_random_bytes(n)
|
5 | Return the specified number of cryptographically-strong random bytes.
|
Richtig geraten, also weiter. struct.unpack hat keine sehr Informative
Help Funktion, aber hier kannst du auf der Homepage nachlesen was das
macht
https://docs.python.org/2/library/struct.html Um es kurz zumachen, die
Funktion interpretiert die beiden Bytes der get_random_bytes als Short
Integer.
Die Zeile mit den Return ist Intressanter
> return key.encrypt(text, randint)[0]
Key ist also nicht Irgendein Datentype sondern ein Object welches eine
methode encrypt mitbringt.
Da die Funktion selbst keine Informationen zur Verfügung stellt was Key
ist, kann ich nur raten. Sollte ich das Programm vor mir haben würde ich
entweder durch nach gucken herausfinden wollen was für ein Objekt ist,
oder einfach vor den Return ein print einbauen und mit sys.exit das
Programm erst einmal beenden.
1 | print type(key), help(key.encrypt)
|
2 | sys.exit(122)
|
dann sollte dir das Objekt key sein geheimnis Verraten und du weist was
die Funktion macht. Vermutlich wird sie den text nehmen und
verschlüsseln, wobei das randint ein salt ist oder so was ähnliches aber
das kann man nur sagen wenn man das Objekt da hinter kennt. Im Zweifel
musst du zusehen wie du so ein Key-Objekt mit deinen Interpreter
bekommst, dann kannst du damit spielen bis du die Funktion verstanden
hast.
Ich hoffe ich konnte dir ein wenig Helfen mit der erklärung wie ich das
Pragmatisch untersuchen würde und dir ist klar geworden wie du dir
helfen kannst. Was das entschlüsseln angeht. key wird ein decrypt haben.
Dein Problem dürfte allerdings sein das du an der Entschlüssel stelle
nicht mehr weißt was in randint gestanden hat, das aber zum
entschlüsseln gebraucht wird.