C ASCII Hash

Hallo Community...

Gibt es für C eine Möglichkeit einen Char-String als ASCII-Code in eine Datei zu speichern?
Das mit der Datei versteh ich ja noch aber den ASCII-Hash hab ich nicht gefunden...

Danke schonmal , MCStreetguy
 
Geh deinen char* String durch, caste jeden char zu int und schreib letzteres in die Datei.
 
Wenn ich das mache schreibt er alle Zahlen hintereinander in die Datei...
Und das ganze so oft wie der String lang ist...
Deshalb suche ich nach einem hash...

Wegen mir auch ein anderer Hash aber ich find dazu nix außer foren wo keiner n plan hat...
Man sollte den Hash auch Rückgängig machen können...
 
Weißt du, das lustige an Hashfunktionen (Rechtseindeutigen Funktionen) ist, dass man sie in der Regel nur schwer umkehren kann. Woran das liegt? Weil du einen begrenzten Zielraum hast, aber einen unendlichen Definitionsraum.
Du suchst also wahrscheinlich keine Hashfunktion, wenn du etwas umkehrbares haben willst.

Ich suche allerdings etwas: und zwar eine bessere Problembeschreibung. Von dir.
 
also es geht darum einen String verschlüsselt in eine Textdatei zu speichern... dabei sollte das ganze auch wieder rückgängig machbar sein... deshalb dachte ich ascii aber es funktioniert bei mir kein bisschen... deshalb fache ich ihr kennt da eine Möglichkeit
 
Da ich das Gefühl nicht los werde, dass Dir nicht so wirklich klar ist, was "ascii" eigentlich ist:
ASCII ist eine Zeichenkodierung, eine Vereinbarung für eine Zuordnung von
Ziffer -> Zeichenbild.
z.B
48 -> '0'
49 -> '1'
65 -> 'A'
97 -> 'a'
Wichtig: '0','1','A','a' usw sind Bilder.


Wenn man in seinem Code eine Ausgabeanweisung hat
print "Hello World"
mündet diese letzendlich in eine Anweisung zum Zeichnen von Bildern.
Ein ganz vereinfachtes Beispiel:
Angenommen, wir haben einen Speicherblock mit 4x4 Pixel-Bildern:
Code:
Übereinkommen: jedes Byte entspricht einem Farbwert.
0 ist schwarz, 1 ist weiß, jedes Bild belegt 4x4 = 16 Bytes
0110
1001
1111   <- ein A
1001
1110
1001
1001   <- ein D
1110
... usw.
Nennen wir mal diesen Block "Font". Das sind also Bilder mit uns bekannten Schriftzeichen.
Als erstes kommt ein Bild für 'A', dann für 'D' usw.
Wir können in einem weiteren Block die Zuordnung "CodeToImage" festhalten:
Code | Speicheradresse des Bildes
Code:
0 "Font" Startadresse
1 "Font" Startadresse" + 16
2 "Font" Startadresse" + 32
3 ...
dem Code 0 wird also ein Bild für 'A' zugeordnet, dem Code 1 ein Bild für 'D'
Es ist also ein CSCII - CDW's Standard Code for Information Interchange (nicht ganz so weit verbreitet, wie American SCII)
Würde das Bild für 'A' der 65 zugeordnet werden, für 'B' der 66 (usw. wie in der ASCII - Wikipedia, the free encyclopedia) wäre das ASCII.

Für Anweisung
Code:
print "AD"
produziert der Compiler prinzipiell (je nach Zielplattform, Einstellungen usw) sowas:
Adresse, Anweisung
Code:
00: load 02  <= Adresse mit der Ausgabekodierung
01: basic_print      <= aufruf der Ausgabefunktion (Betriebssystem, 
direkter BIOS Zeichenfunktionsaufruf, Aufruf der Bibliotheksfunktion)

02: 65  <- ASCII Kodierung für 'A'
03: 68  <- ASCII Kodierung für 'D'
04: 00 <- Stopp = Terminierungszeichen, eine Vereinbarung.
oder, wenn der Compiler standardmäßig CSCII - Nutzung annimmt:
Code:
00: load 02 
01: basic_print 

02: 00  <- CSCII Kodierung für 'A'
03: 01  <- CSCII Kodierung für 'D'
04: 99 <- Stopp = Terminierungszeichen nach ... .

"basic_print" ist dann eine Funktion, die für jeden ASCII/CSCII Code das passende Bild heraussucht
Code:
image =code_to_image_map[ascii_code]  // nehme aus der Zuorndungstabelle die richtige Bildadresse
oder direkt:
image = Speicher_mit_bildern[ascii_code * (große_des_einzelnen_bilds=16))]
und ganz "stupide" das Bild Pixel für Pixel zeichnet:
Code:
for (x = 0; x < 4; x++)
  for (y = 0; y < 4; y++)
    set_output_pixel(output_x + x, output_y + y, image[x][y])

Sogennante "basic_fonts" gibt es schon im BIOS-ROM (entweder der Grafikkarte oder/und des Rechners) - dank diesen sieht man auch die hübschen Statusmeldungen schon beim Einschalten des Rechners ;)

Es gibt im übrigen viele andere Kodierungen - UTF, diverse ISOs
Bsp:
0xE2 0x98 0x8F : ☏
white_telephone.png

0xE2 0x98 0xA2: ☢
radioactive_sign.png


---------
Also, wenn Du einen "String" direkt speicherst, speicherst Du nicht die "Zeichen" selbst oder irgendwelche Bilder, sondern eigentlich die Kodierung für den eingegebenen Text. Ganz stumpf gesagt: eine Abfolge von 0 und 1.

Betrachtet man die gespeicherte Datei in einem Hexeditor, sieht man z.B
48 65 6c 6c 6f 20 57 6f für ein "Hello World"
dabei nimmt der Editor an, dass eine Abfolge von acht 0en und 1en immer eine Zahl darstellt und dass der Nutzer diese Zahl direkt in einer hexadezimalen Representation sehen möchte. Also sorgt wiederum der Editor, dass für eine Abfolge von vier 0en und 1en (ein Nibble) ein passendes Bild aus 16 möglichen auf dem Monitor erscheint: 0110 1111 => '6F' (zwei Bilder: eins für '6', eins für 'F')
dabei würde ein Texteditor 0100 1111 als ein 'd' erscheinen lassen.

Hex,Dezimal, Binär sind nur Darstellungen/Representationen:

apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif
apple_ico.gif

nicht angebissene Äpfel können binär als 01100, dezimal als 12, octal als 14, hexadizimal als 0C dargestellt werden.
Dadurch werden es nicht mehr und nicht weniger ;)

Betrachtet man seine gespeicherte Datei mit einem Texteditor, versucht dieser automatisch die Zahlen einem Zeichenbild zuzuordnen und diese auszugeben. Was z.B ohne explizite Angabe der beim Speichern genutzten Kodierung auch mal schief gehen kann (wenn z.B ÄÖÜ in UTF-8 kodiert wurden, der Texteditor aber eine ASCII Kodierung annimmt). Anderes Beispiel sind Webseiten, die die falsche Kodierung angeben und man statt ä ö ü "Kästchen" oder "komische Zeichen" sieht.

"Als ASCII-Codes speichern" heißt also die Ziffern der Kodierung in eine (hexa, dezimale, binäre) Darstellung zu bringen und diese Darstellung zu speichern. Das ist bei weitem keine Verschlüsselung, sondern einfach eine andere Darstellung :wink:

Liege ich richtig in der Annahme, dass dieser Thread die Fortsetzung von diesem ist?
http://www.hackerboard.de/code-kitchen/46428-c-arrays-vergleichen.html
Also Passwörter sicher speichern?
Dazu werden kryptographische Hashfunktionen einsetzt:
Hashfunktion
Auch diese sind nicht "rückgängig machbar" - denn für eine Eingabe beliebiger Länge wird ein Wert fester Länge zugeordnet.

Man speichert stattdessen den Hash des Passworts. Dieser ist nicht ohne weiteres rückgängig zu machen und bei einem sicheren Passwort auch nicht durch ausprobieren zu erraten.
Wenn man nun wissen möchte, ob das gleiche Passwort eingegeben wurde:
hash(eingabe) == lade_hash(datei)
fertig.
 
Also Passwörter sicher speichern?
Dazu werden kryptographische Hashfunktionen einsetzt:
Hashfunktion
Auch diese sind nicht "rückgängig machbar". Man speichert den Hash des Passworts. Dieser ist nicht ohne weiteres rückgängig zu machen und bei einem sicheren Passwort auch nicht durch ausprobieren zu erraten.
Wenn man nun wissen möchte, ob das gleiche Passwort eingegeben wurde:
hash(eingabe) == lade_hash(datei)
fertig.
Da die Benutzung sich praktisch nicht unterscheidet, würde ich stark stark stark von der Benutzung von normalen Hashfunktionen abraten. Stattdessen sollten Funktionen eingesetzt werden, die den Zielen des sicheren Speicherns von Passwörtern viel näher kommen.
Wir hatten hier da erst letztens eine Diskussion drüber, bottom line ist: PBKDF2-SHA2-HMAC mit hübsch vielen Iterationen oder bcrypt mit ebenfalls hübsch vielen Iterationen.
 
Ich weiß schon was ASCII ist ich hab nur gedacht weil das eindeutig zuweisbar ist... Demnach ließe sich das rollbacken...
Aber es geht Hauptsächlich um das sichere Speichern von daten...
Also wenn da einer was weiß, immer her damit ^^
 
Du vermischst gerade ziemlich viele Sachen und verwendest komische Begriffe.

Verfahren zum sicheren Speichern von Daten wurden dir hier bereits empfohlen.
 
Ich weiß schon was ASCII ist ich hab nur gedacht weil das eindeutig zuweisbar ist... Demnach ließe sich das rollbacken...
Aber es geht Hauptsächlich um das sichere Speichern von daten...
Also wenn da einer was weiß, immer her damit ^^

Rollback -> Rollback
Der Begriff Rollback wird eher im Zusammenhang mit Datenbanken verwendet.

Wegen mir auch ein anderer Hash aber ich find dazu nix außer foren wo keiner n plan hat...
Man sollte den Hash auch Rückgängig machen können...
Hash -> Hash
Wie hier schon mehrfach gesagt: Hashs sind nur schwer umkehrbar. in der PC-Welt wird sehr viel gehasht z.B. Passwörter. Passwörter werden nicht direkt im Klartext überprüft "Eingabe"="Passwort" sondern vorher mit einem Algorithmus gehasht d.h. das "eingegebenePasswort" wird einen einen Hash umgewandelt: 1525097fe535c95928e3dc39cbf039bb5d9eca31b32479fc8a049662cd3c0301 (SHA256)
Der Sinn dabei ist, dass der gehashte Wert nicht (oder nur sehr schwer) umkehrbar ist. Hierbei arbeitet man wieder mit Rainbow-Tables, aber das ist ein anderes Thema. Dabei kann man von z.B. Dateien eine Art Fingerabdruck generieren. Sobald sich nur ein Byte ändert, sieht die komplette Hashfunktion anders aus (Prüfsumme).

Wenn du etwas "rückgängig machen" willst dann verwendet man Verschlüsselung -> Verschlüsselung
D.h. du verwendest einen bestimmten Verschlüsselungsalgorithmus und verwandelst den Klartext und bekommst etwas chiffriertes. Du benötigst auf jeden Fall also einen "Schlüssel".

ASCII -> American Standard Code for Information Interchange
"Als ASCII-Codes speichern" heißt also die Ziffern der Kodierung in eine (hexa, dezimale, binäre) Darstellung zu bringen und diese Darstellung zu speichern. Das ist bei weitem keine Verschlüsselung, sondern einfach eine andere Darstellung :wink:
Wie CDW schon gesagt hat, ist die ASCII-Umwandlung lediglich eine andere Darstellung, man benötigt also im Gegensatz zur Verschlüsselung keinen "Schlüssel" (Passwort oder was auch immer).

Ich hoffe nun löst sich das Dilemma endlich...
 
Zurück
Oben