Ganzen Text in ASCII Code umwandeln

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.
Antworten
mikyboy
User
Beiträge: 9
Registriert: Donnerstag 8. November 2007, 13:50

Ich habe den Auftrag bekommen, einen Text zu verschlüsseln, habe auch schon die Idee dazu, jedoch brach ich eine kleine Hilfe, die für viele vielleicht banal klingt:

Wie kann ich einen Text, den jemand eingibt, in den dezimal ASCII code umwandeln? Bei einzelnen Buchstaben klappts mit dem Befehl ord('A'), jedoch kann man so nur einzelne Buchstaben umwandeln. Wie kann ich es aber bewerkstelligen, den ganzen Text umwandeln zu lassen?

MfG Mike
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

>>> text = "I don't like spam."
>>> map(ord, text)
[73, 32, 100, 111, 110, 39, 116, 32, 108, 105, 107, 101, 32, 115, 112, 97, 109, 46]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mikyboy
User
Beiträge: 9
Registriert: Donnerstag 8. November 2007, 13:50

vielen Dank für die Antwort!
und was muss ich machen, wenn ich will, dass die Zahlen aneinander stehen? also statt
[73, 32, 100, 111, 110, 39, 116, 32, 108, 105, 107, 101, 32, 115, 112, 97, 109, 46]
einfach nur 733210011111039....
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Code: Alles auswählen

l = map(str(map(ord, text)))
n = ""
for x in l: n+=x
wobei ich bezweifle, dass du das willst, denn wer etwas verschlüsselt, will es auch irgendwann wieder entschlüsseln.
mikyboy
User
Beiträge: 9
Registriert: Donnerstag 8. November 2007, 13:50

vielen dank, jedoch glaube ich dass ein Komma fehlt, sonst gibts immer eine Fehlermeldung.

l = map(str(map(ord, text))) zu
l = map(str,(map(ord, text))) gemacht


Ich muss einen Text mit der RSA verschlüsselung verschlüsseln, hab gedacht ich mach das so, dann verschlüssle ich die zahlen, dann mach ich wieder 2er gruppen daraus und diese können dann wieder entschlüsselt werden.

Oder hat jemand eine bessere Idee? bin für jeden Vorschlag wirklich sehr dankbar!
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

mikyboy hat geschrieben:vielen dank, jedoch glaube ich dass ein Komma fehlt, sonst gibts immer eine Fehlermeldung.
Oh, ja klar.
Aber wie willst du die Endloszahl wieder trennen. Du weißt ja nicht, wie viele Zahlen zusammengehören.
mikyboy
User
Beiträge: 9
Registriert: Donnerstag 8. November 2007, 13:50

Achso stimmt. Wie kann ich es dann sonst machen?
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Überleg doch mal selbst! :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich hätte es eher mit einer Generator-Expression gelöst:

Code: Alles auswählen

''.join(str(ord(char)) for char in text)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Wenn es hinterher wieder aufteilbar sein soll, muss jede Zahl gleichlang sein:

Code: Alles auswählen

''.join("%02d" % ord(char) for char in text)
Schneller gehts mit

Code: Alles auswählen

text.encode("hex")
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Achso stimmt. Wie kann ich es dann sonst machen?
Afaik arbeiten viele Algorithmen so, dass sie einen klartextstrom (beliebig viele Zeichen Text) in Stücke teilen, auf die sie dann den algorithmus anwenden, und die verschlüsselten Stücke zusammenkleben und als Chiffrestrom ausgeben.

Das ganze ist eine Art Mapping (deutsch Abbildung, afaik).

in python/pseude grob sowas:

Code: Alles auswählen

chunks = chunkify(text, length) # funktion, die text nimmt und ihn zerteilt
chunks = [ encrypt(chunk) for chunk in chuns ] # äquivalent mit chunks = map(encrypt, chunks)
cyphertext = ''.join(chunks)
Die Funktion "encrypt" repräsentiert den eigentlichen Algorithmus.

Rot13 teilt z.B. den Text in Stücke von 1 byte, "rotiert" das byte, und fügt es dem Chiffretext hinzu.
Base64 nimmt 3-byte-stücke, "verschlüsselt" sie zu 4-bytes, und fügt sie dem Chiffretext hinzu.

Beides keine kryptographisch sicheren Algorithmen, ich weis, sollte aber trotzdem als Beispiel reichen.

Ein fachwort zum suchen wäre Blockchiffre
mikyboy
User
Beiträge: 9
Registriert: Donnerstag 8. November 2007, 13:50

zuerst mal danke für all die antworten und ansätze, hat mich scho sehr weit gebracht!
und noch ne frage, wenn ich jetzt einen Text mit "map(ord, text) " umwandle, wie kann ich das wieder rückgängig machen?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

mikyboy hat geschrieben:zuerst mal danke für all die antworten und ansätze, hat mich scho sehr weit gebracht!
und noch ne frage, wenn ich jetzt einen Text mit "map(ord, text) " umwandle, wie kann ich das wieder rückgängig machen?

Code: Alles auswählen

In [1]: text = "Das ist ein Text"
In [2]: ascii = map(ord, text)
In [5]: "".join(map(chr, ascii))
Out[5]: 'Das ist ein Text'
oder

Code: Alles auswählen

In [1]: text = "Das ist ein Text"
In [2]: ascii = map(ord, text)
In [12]: string.join([chr(x) for x in ascii], "")
Out[12]: 'Das ist ein Text'
oder (ab hier beachtest du die am besten nicht mehr, ist nur dumme Spielerei von mir)...

Code: Alles auswählen

In [1]: def to_ascii(text):
   ...:     for i in text:
   ...:         yield ord(i)
   ...:         
   ...:         

In [2]: def ascii_to_string(ascii_list):
   ...:     temp = str()
   ...:     for i in ascii_list:
   ...:         temp += chr(i)
   ...:     return temp
   ...: 

In [3]: text = "DAS IST TEXT!!"

In [4]: ascii = to_ascii(text)

In [5]: ascii_to_string(ascii)
Out[5]: 'DAS IST TEXT!!'
oder

Code: Alles auswählen

import string

class AsciiTexter(object):

    def __init__(self, text):
        self.text = text

    def __str__(self):
        return "Text: " + self.text + \
               "\nAscii: " + string.join(str(x) for x in self.ascii) + \
               "\nHex: " + string.join(str(x) for x in self.hexa)
    @property
    def ascii(self):
        return map(ord, self.text)

    @property
    def hexa(self):
        return map(hex, self.ascii)

foo = AsciiTexter("Bla")
print foo.text
print foo.ascii
print foo.hexa
print foo
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Vielleicht auch interessant: http://www.python-forum.de/topic-8075.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Ich würde noch gerne `array.array` in die Runde werfen.
mikyboy
User
Beiträge: 9
Registriert: Donnerstag 8. November 2007, 13:50

Danke für all die Tips, hab bis jetzt (fast) alles eingebaut.

Noch eine Frage: Bei der RSA Verschlüsselung wird zum Verschlüsseln zuerst hoch eine Zahl und dann der mod davon genommen. Wenn ich das nun im Python mache, hängt es bei der Zahl noch ein "L" hintendran, was es problematisch macht, die Zahl wieder in Text zu verwandeln.
Meine Frage ist nun, wie ich das "L" wieder wegbeckomme.

Bsp: (7**23)%143 = 2L
ich brauche aber 2 statt 2L

vielen Dank, Mike
BlackJack

Da ist kein L wenn Du die Zahl in eine Zeichenkette umwandelst.

Code: Alles auswählen

In [11]: (7**23) % 143
Out[11]: 2L
Das ist keine Zeichenkette sondern eine literale 2 als "long". Wenn man die in eine Zeichenkette umwandelt…

Code: Alles auswählen

In [12]: str((7**23) % 143)
Out[12]: '2'
…ist da auch kein L mehr.
Antworten