String <=> Zahl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
heiliga horsd

Hallo,

hab mal eine (auch auf das Risiko hin, dass gleich wieder jemand kommt und sagt, soetws gäbe es nicht :wink: ) blöde Frage : Wie konvertiere ich in Python 3.2 am besten einen String in eine Zahl und wieder zurück? Unicode-Tabelle? Suche einen möglichst einachen & performanten Lösungsansatz/-Hinweis.

Lg HH
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

>>> int("42")
42
>>> float("2.3")
2.3
>>> str("42")
'42'
?
Das Leben ist wie ein Tennisball.
heiliga horsd

Ne, also mit einem String mein ich sowas wie "Hallo Welt", d.h. der String ist nicht oder nur teilweise numerisch.... hab ich vergessen zu sagen, da ich das bei "String" wohl vorausgesetzt habe...

Code: Alles auswählen

>>> int("Hallo Welt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Hallo Welt'
:roll:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich habe mich auch schon irgendwie gewundert^^ Nimm dazu einfach reguläre Ausdrücke (Modul re), damit ist das schnell abgehandelt. Wie du damit nach Zahlen in Strings suchst, findest du in Form von Beispielen wie Sand am Meer.
Das Leben ist wie ein Tennisball.
heiliga horsd

Ne ich glaube wir reden aneinander vorbei^^

Ich will den kompletten String in eine Zahl verwandeln, weiß nur nicht wie ich das am besten mache.... Ich könnte ja einfach dem 'a' 000 geben, dem 'b' 001 etc. und das dann durch machen und so könnte ich "aba" zu 000001000 konvertieren und wieder zurück, aber da gibt's ja sicherlich schon was fertiges, ich weiß bloß nicht nach was ich suchen soll bzw. wie man das Problem am elegantesten/performantesten angeht :K :?:

Ich will das halt dann verschlüsseln, und mit Strings rechnet es sich schlecht...
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Es gibt chr, unichr und ord. Aber sag bitte, dass du keine ernsthafte Verschlüsselung machen willst, sondern das nur aus Spaß an der Freude machst ;)
heiliga horsd

Danke, damit werd ichs versuchen.... deine Frage versteh ich aber nicht, was ist das Problem dabei?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ok, da hat ja alles in der Kommunikation versagt ^^ Ich würde es über ein Encoding machen, dann ist es platformunabhängig:

Code: Alles auswählen

>>> data = "cos(α)²+sin(α)²=1"
>>> data.encode("utf-8")
b'cos(\xce\xb1)\xc2\xb2+sin(\xce\xb1)\xc2\xb2=1'
Was derdon sagen wollte: Wenn dich Verschlüsselung interessieren, dann sollst du ruhig deine eigene Version verwenden. Wenn du die Verschlüsselung aber tatsächlich verwenden möchtest, dann nimm eine fertige Bibliothek von Leuten die sich damit auskennen. Ansonsten baust du dir mit Sicherheit gleich so viele Löcher ein, dass du gar keine Verschlüsselung mehr brauchst ;-)
Das Leben ist wie ein Tennisball.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Was verstehst du denn unter Verschlüsselung und wie willst du diese einsetzen? Auf welche Art soll man verschüsselten Text wieder entschlüsseln können? Soll jeder in der Lage sein, den verschlüsselten Text wieder entschlüsseln zu können oder muss man dazu einen private key besitzen? Hast du dich mit dem Thema Verschüsselung, Verschüsselungssystemen und deren Sicherheit mal auseinander gesetzt (ich nicht, nebenbei gesagt …)?
heiliga horsd

Ich habe RSA funktionstüchtig implementiert (es funktioniert, aber der Code sieht noch grausam aus und muss noch verschönert und optimiert werden, deswegen will ich ihn ungern herzeigen :oops: )... Nun wollte ich nach ein paar Zahlen, die ich erfolgreich Ver- und Entschlüsselt habe, einen Text verschlüsseln und stand vor dem Problem, wie ich einen Text möglichst leicht in eine Zahl und wieder zurück konvertiere... nun, hier bin ich :roll:

Bezüglich auskennen... hab mich seit geraumer Zeit in RSA eingelesen und auch einiges darüber gelesen, und wie gesagt, es funktioniert auch, habe aber die Kompatibilität mit anderen Programmen noch nicht getestet... dazu müsste ich erstmal längere Texte in ein numerisches Format bekommen, chr und ord nehmen ja nur einzelne Buchstaben entgegen...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das kannst Du zu Fuss mittels %/ 256 machen oder mit eingebauten Methoden:

Code: Alles auswählen

>>> s='hallo welt'
>>> int(s.encode('hex'),16)
492923261135231742471284L
>>> i=int(s.encode('hex'),16)
>>> hex(i)
'0x68616c6c6f2077656c74L'
>>> hex(i).strip('0xL').decode('hex')
'hallo welt'
Edit:
Was ich vergessen habe zu erwähnen - sollte Dein Hex-String führende Nullen haben (beginnt mit '\x00-\x0f'), ist es wichtig, die Bytelänge beim Rückkonvertieren zu korrigieren.
Zuletzt geändert von jerch am Mittwoch 11. April 2012, 19:19, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Naja, der Begriff "funktionstüchtig" ist durchaus ein sehr dehnbarer Begriff. Du magst zwar ver- und entschlüsseln können, dass heißt aber noch lange nicht, dass deine Schlüsselerzeugung korrekt ist. Das ist nämlicher der schwierige Teil an der ganzen Sache. Daher auch der Hinweis, dass du mit einer fertigen Lösung besser fährst.

Wie man einen String in eine Zahl umwandelt, habe ich in meinem Beispiel ja oben bereits gezeigt. Das in einen Integer zu bekommen ist mit ein paar Shiftoperationen ein Einzeiler. Wenn du so aber tatsächlich die Nutzdaten übertragen willst, dann hast du an asymmetrischer Verschlüsselung etwas falsch verstanden. Normalerweise wird damit nur der Schlüssel übertragen, die Daten werden anschließend symmetrisch verschlüsselt.
Das Leben ist wie ein Tennisball.
heiliga horsd

EyDu hat geschrieben:Naja, der Begriff "funktionstüchtig" ist durchaus ein sehr dehnbarer Begriff. Du magst zwar ver- und entschlüsseln können, dass heißt aber noch lange nicht, dass deine Schlüsselerzeugung korrekt ist. Das ist nämlicher der schwierige Teil an der ganzen Sache. Daher auch der Hinweis, dass du mit einer fertigen Lösung besser fährst.
Ich mache es so, wie es [1] erklärt ist. Ich muss halt noch schauen, wie das die Lösungen der Profis machen und was die konkret anders machen, aber prinzipiell funktioniert es ja, also kann schonmal nichtmehr allzuviel falsch sein?
EyDu hat geschrieben: Wie man einen String in eine Zahl umwandelt, habe ich in meinem Beispiel ja oben bereits gezeigt. Das in einen Integer zu bekommen ist mit ein paar Shiftoperationen ein Einzeiler. Wenn du so aber tatsächlich die Nutzdaten übertragen willst, dann hast du an asymmetrischer Verschlüsselung etwas falsch übertragen. Normalerweise wird damit nur der Schlüssel übertragen, die Daten werden anschließend Symmetrisch verschlüsselt.
Ja, dafür bin ich dir auch sehr dankbar! Auch das komplett ausformulierte Beispiel von jerch ist super, hierfür möchte ich mich auch nochmals herzlich bedanken! Dass man in der Regel nur asymmetrisch den Schlüssel überträgt ist mir durchaus bekannt (wie gesagt, ich habe mich informiert - bei symmetrischen Verfahren braucht man auch bei weitem nicht die Schlüssellänge wie bei asymmetrischen). Das Ganze ist mehr ein didaktisches Projekt, aber trotzdem hat es einen Anspruch auf Vollständigkeit, und dazu gehört halt nunmal auch, dass man Texte oder vielleicht auch Dateien verschlüsseln/signieren kann. Ich bin mir auch bewusst, dass das Ganze nie groß in der Praxis eingesetzt wird, aber es ist halt schonmal schön, etwas großes und wirklich relevantes zu programmieren. Auch wenn man es im Endeffekt nur selber und Just 4 Fun benutzt.

Das Problem ist jedoch hiermit gelöst und ich bedanke mich bei allen! Ich werde auch gerne noch bei der Diskussion (falls Bedarf besteht) mitmachen.


Gruß HH


[1]: http://people.csail.mit.edu/rivest/Rsapaper.pdf
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

heiliga horsd hat geschrieben:
EyDu hat geschrieben:Naja, der Begriff "funktionstüchtig" ist durchaus ein sehr dehnbarer Begriff. Du magst zwar ver- und entschlüsseln können, dass heißt aber noch lange nicht, dass deine Schlüsselerzeugung korrekt ist. Das ist nämlicher der schwierige Teil an der ganzen Sache. Daher auch der Hinweis, dass du mit einer fertigen Lösung besser fährst.
Ich mache es so, wie es [1] erklärt ist. Ich muss halt noch schauen, wie das die Lösungen der Profis machen und was die konkret anders machen, aber prinzipiell funktioniert es ja, also kann schonmal nichtmehr allzuviel falsch sein?
Mach auf das Tor, das Loch mach breit!

Nichts fuer ungut, aber mit der Einstellung kann das nur schief gehen. Verschluesselung ist ein _so_ kompliziertes Thema, dass sogar beim Zusammenstecken der Komponenten Fehler passieren ... Um $Gottes willen, nimm die Einwaende hier ernst und benutze eine bestehende Bibliothek fuer Verschluesselung, deren Implementierung mehrere Reviews hinter sich hat.

Wie EyDu schon sagte: Dass es nich zusammenfaellt ist die aller geringste Anforderung (wenn der Rest nicht funktioniert waere sogar das sogar noch besser ...).

Das gilt alles natuerlich nur, wenn du das ernsthaft einsetzen willst. Wenn du damit spielen willst: Nur zu, implementier so viel du willst.
heiliga horsd

Ich mache anscheinend irgendetwas falsch :oops:

Code: Alles auswählen

>>> s = "Hallo Welt!"
>>> int(s.encode('hex'),16)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: unknown encoding: hex
Irgendjemand eine Idee? Steh grad echt auf dem Schlauch, in dem Beispiel, das gepostet wurde, funktioniert das doch einwandfrei?


@cofi: Wie gesagt, das ganze wird nicht praktisch eingesetzt. Und ich nehme eure Einwände natürlich auch Ernst. Ich bin mir nichteinmal sicher, ob ich mein Programm jemals im Internet veröffentlichen werde. Mich interessiert halt die Thematik und es macht mir Spaß, und nun nochmal, ich habe mich durchaus informiert und eingelesen. Dass das Thema komplex ist ist mir auch durchaus bekannt (ich habe auch nicht immer alles auf Anhieb verstanden, wäre auch utopisch das zu denken, aber irgendwann nach öfterem lesen und ausprobieren mit Papier und Stift legt sich halt der Schalter im Kopf um). Ich verstehe eure Einwände, aber es ist nunmal noch kein Meister vom Himmel gefallen. Man macht Fehler und lernt daraus. Man muss sich an ein Thema wagen, um Fehler zu machen und daraus zu lernen. Ich weiß nicht, ob ihr dachtet, dass ich sofort nachdem ich fertig bin ein git-Repo aufmache und es verteile, das habe ich definitiv nicht vor! Wie gesagt, ich mache es Just 4 Fun und aus didaktischem Zweck (ich will eine kleine Erklräung dazu schreiben). Ich kann auch verstehen, dass es euch als Erfahrenere Programmierer den Magen umdreht, wenn ich sage, dass ich RSA programmiert habe. Ich habe nie etwas von Dingen wie "läuft einwandfrei und kompatibel zu allem was es bisher gibt" oder "veröffentlichen" gesagt. Aber wie gesagt, wenn man sich nicht an Größeres traut, wird man auch nicht besser.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Naja, du verwendest Python 3.x, welches Text in unicode-Objekten speichert, und jerchs Beispiel benötigt 2.x, da dort die Strings noch rohe Bytes sind. Bei erstgenanntem gibt es keine hexadezimale Darstellung. Ich bin nicht ganz ohne Grund den Weg über das Encoding gegangen ;-)

Edit: Wenn ich es richtig überblicke, hat sich keiner darüber beschwert, dass du zur Übung die Verschlüsselung selbst implementierst. Für mich hörte sich das in dem Fall mehr nach Motivation an. Ich würde behaupten, dass hier fast jeder RSA schon einmal selbst umgesetzt hat.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

heiliga horsd hat geschrieben:@cofi: Wie gesagt, das ganze wird nicht praktisch eingesetzt.
Gut mehr wollte ich nicht hoeren :)

Du kannst das auch gern veroeffentlichen, auch wenn es schlechter Code sein sollte, er nicht fehlerfrei ist o.ae. Das war hier auch gar nicht die Befuerchtung, sondern: Wenn man Kryptographie einsetzt, will man etwas schuetzen und spaetestens bei fremden Daten sollte man sich nach ueberprueftem Code umschauen.

Das war aber kein Angriff auf deine Faehigkeiten oder das Verbot da weiterzumachen, im Gegenteil (sofern das nicht ernsthaft eingesetzt wird ;))

Ich wollte nur sicher gehen, dass hinter "Ich bin mir auch bewusst, dass das Ganze nie groß in der Praxis eingesetzt wird" eigentlich ein "ich benutz das nicht, ich schwoers!" steht ;)

P.S. Das Repo setzt man auf _bevor_ man fertig ist :P
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

cofi hat geschrieben:P.S. Das Repo setzt man auf _bevor_ man fertig ist :P
Ist das Erstellen des Repos nicht eigentlich der erste Schritt nach dem Erstellen des Projektordners...
Das Leben ist wie ein Tennisball.
heiliga horsd

Ich habe das Repo lokal ;) Ich meinte damit eher ein Repo, auf das auch andere in irgendeiner Form Zugriff haben wird es wohl kaum geben...

Daten würde ich mit meinem Script beim besten Willen nicht schützen - es gibt ja schon die fertige Software dafür. Aber meine Gründe warum ich das tue kennt ihr ja schon...

Back to topic:

Code: Alles auswählen

>>> s.encode('utf-8')
b'Hallo Welt!'
>>> for i in s.encode('utf-8'):
...     print(i)
... 
72
97
108
108
111
32
87
101
108
116
33
Ich habe nur trotzdem keine Ahnung, wie ich das in _eine_ hexadezimale Darstellung bringen kann, hab auch in der Doku und bei Google nichts gefunden. :cry:

Wäre über einen Link oder Hinweis sehr dankbar!

Gruß HH
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

>>> s = "spam, ham and eggs".encode("utf-8")
>>> l = len(s)
>>> integer = sum(v<<8*i for (i, v) in enumerate(s))
>>> integer
10053099401507827668789273780417579937001587
>>> binary = bytes((integer>>8*i) & 255 for i in range(l))
>>> binary
b'spam, ham and eggs'
>>> binary.decode("utf-8")
'spam, ham and eggs'
Das Leben ist wie ein Tennisball.
Antworten