Forum: PC-Programmierung Python Funktion Erklärung


von mechanikmike (Gast)


Lesenswert?

Hallo zusammen,

ich sitze gerade an einer Hausaufgabe und muss eine Python Funktion 
erklären.
Ich komme leider nicht so richtig voran, sie erscheint mir schon etwas 
komisch.

def encrypttxt(key, text):

    randint = struct.unpack('H', Random.get_random_bytes(2))[0]
    return key.encrypt(text, randint)[0]

Also wie ich es verstehe, gibt die Funktion einen verschlüsselten text 
aus, der mit dem key verschlüsselt wird, aber was passiert genau?

Wie sähe diese Funktion umgekehrt aus? also wenn man mit dem Schlüssel 
den text wieder entschlüsseln möchte?

Besten Dank :))

von imonbln (Gast)


Lesenswert?

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:
1
In [1]: import struct

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.

von mechanikmike (Gast)


Lesenswert?

Hallo imonbln,

vielen vielen dank für die derart ausführliche Erklärung :))
hat mir schon deutlich weitergeholfen.

Hmm, mir fehlt ja die komplette Umgebung. Also key ist nirgedwo 
definiert.
Vielleicht ist es auch schon die Lösung es genau so zu schreiben?
Schauen was passiert würde ich allerdings ja schon gern mal. Werde mal 
fragen wo der Rest bleibt..

Vielen Dank nochmal :)

von Alexander F. (alexf91)


Lesenswert?

Der Key ist vermutlich auch aus dem Crypto-Package (z.B. RSA).
1
import struct
2
from Crypto import Random
3
from Crypto.PublicKey import RSA
4
5
    
6
def encrypttxt(key, text):
7
    randint = struct.unpack('H', Random.get_random_bytes(2))[0]
8
    return key.encrypt(text, randint)[0]
9
10
11
key = RSA.generate(1024)
12
publickey = key.publickey()
13
14
original = 'mechanikmike'
15
cyphertext = encrypttxt(publickey, original)
16
decrypted = key.decrypt(cyphertext)
17
18
print(decrypted)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.