Kinch schrieb:
Nun, in UTF8 sind Zeichen unterschiedlich lang in der Anzahl ihrer Bytes.
Abhängig davon, welche Sonderzeichen genau vorkommen, könntest du zum Beispiel latin-1 als Kodierung wählen. Da ist jedes Zeichen genau ein Byte lang. Wäre an der Stelle natürlich schon wichtig zu wissen, welche Kodierung die Zeichen da ursprünglich hatten.
Das versuche ich gerade herauszubekommen, komme aber nicht weiter.
Ich habe etwas Testcode in die Routine eingefügt, die beim Anlegen einer Datei den verschlüsselten Container anlegt. Unmittelbar vor Initialisierung der Verschlüsselung wird folgendes ausgeführt:
| print "Passwort nach Padding: ", password, " Länge ", len(password)
print "decodiert: ", password.decode(sys.getdefaultencoding())
print "Encoding ", sys.getdefaultencoding()
|
ergibt
Passwort nach Padding: oooooooö Länge 32
decodiert: oooooooö
Encoding utf-8
Weiter bringt mich das noch nicht. Wenn der String utf-codiert wäre, dann müsste ja die nachfolgende Verschlüsselung fehlschlagen, weil der 32-Zeichen-String 33 Bytes lang wäre. Oder?
Wie um alles in der Welt kann ich herausbekommen, wie ein bestimmter String codiert ist? Nur eine zu nehmen, mit der die Verschlüsselung funktioniert, hilft nicht viel, denn wenn ich nicht die selbe Codierung verwende wie revelation bei der Verschlüsselung, ist das ganze Brute-Force-Unterfangen mit einer begrenzten Zeichenliste ja witzlos.
EDIT:
Die Codierung ist Unicode. Es mag eine krude Methode sein, aber ich habe einfach mal den eingegebenen Passwortstring zerlegen lassen.
| for char in password:
print "wert von Zeichen ", char, " ist ", ord(char)
print password
|
Ergebnis:
wert von Zeichen l ist 108
wert von Zeichen � ist 195
wert von Zeichen � ist 182
wert von Zeichen � ist 195
wert von Zeichen � ist 164
wert von Zeichen % ist 37
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
wert von Zeichen ist 0
löä%
Die Zeichen ö und ä belegen also jedenfalls zwei Bytes. Zeigt man den string per print an oder verwendet ihn, bekommt man auch ganz richtig die Zeichen ö und ä. Dennoch ist die Länge 6.
Zur Codierung: 195 ist hex c3, 182 ist hex b6. Das Unicode-Zeichen c3b6 ist ö. Passt also.
In der Python-Konsole kann ich das reproduzieren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | >>> pw="löä%"
>>> len(pw)
6
>>> for i in pw:
... ord(i)
...
108
195
182
195
164
37
>>> pw=u"löä%"
>>> for i in pw:
... ord(i)
...
108
246
228
37
>>>
|
Was auch immer dahintersteht - ich brauche dieses erstere seltsame Verhalten. Kann ich meinen unicode-String irgendwie dahingehend umwandeln?
Nochmal kurz:
ich habe einen Unicode-String oö:
| >>> pw=u"oö"
>>> pw
u'o\xf6'
>>> print pw
oö
>>> len(pw)
2
|
und möchte daraus einen solchen erhalten:
| >>> pw="oö"
>>> pw
'o\xc3\xb6'
>>> print pw
oö
>>> len(pw)
3
|
EDIT2: hab's.
| password = password.encode("UTF-8")
|
besorgt die Umwandlung.
Allerbesten Dank für die schnelle und effektive Hilfe!
Gruß
David