Strings effektiv verschlüsseln



  • Ich habe mir eine allgemeine Funktion geschrieben, die Strings verschlüsselt und wieder entschlüsseln kann:

    char *cryptstr(int aktion, char quellstring[])
    {
    	unsigned int ch;
    	int lange;
    	int count;
    	static char puffer[255];
    
    	if ( aktion != 0 && aktion != 1 )
    		return NULL;
    	lange = strlen(quellstring);
    	for(count=0;count<(lange);count++)
    	{
    		ch = quellstring[count];
    		if ( aktion == 0 )
    		{
    			ch += 5;
    			ch = (ch ^ 5);
    			ch += 5;
    		}
    		else if ( aktion == 1 )
    		{
    			ch -= 5;
    			ch = (ch ^ 5);
    			ch -= 5;
    		}
    		puffer[count] = ch;
    	}
    	return puffer;
    }
    

    Ich möchte die Funktion verwenden, um Passwörtern von Benutzern in Dateien abzuspeichern, ohne dass jemand so einfach draufkommt.

    Da gibt es jedoch folgende Probleme:
    - Da es jedes Mal die gleiche Verschlüsslung ist, kann jeder das Passwort eines anderen erfahren, indem er einfach das verschlüsselte Passwort eingibt und das entschlüsselte Passwort aus der Datei entnimmt.
    Daher möchte ich verschiedene Schlüssel haben.
    - Ich weiß nicht genau wie ich diese Schlüssel definieren kann bzw. wie die Werte sein dürfen damit ch nicht aus dem Wertebereich von 0 - 255 rutscht.

    Ansonsten bin ich für Verbesserungsvorschläge jeder Art natürlich dankbar.



  • Lass es bleiben. Wenn Du als Laie versuchst, selbst 'ne Verschluesselung zu schreiben, geht's schief. Nimm was fertiges.



  • Simonek schrieb:

    ...kann jeder das Passwort eines anderen erfahren, indem er einfach das verschlüsselte Passwort eingibt und das entschlüsselte Passwort aus der Datei entnimmt.

    Dein Algorithmus lässt das auch zu. Der ist "reversibel".

    Du solltest aus dem Passwort eine Summe bilden und diese dann speichern.

    Um zu prüfen ob ein Passwort korrekt ist, musst Du aus dem eingegebenen Passwort wieder die Summe bilden und mit der gespeicherten Summe vergleichen.

    Die Art und Weise wie Du die Summe bildest hängt nur von der Phantasie ab.

    Aus der Summe zumindest lässt sich nicht mehr auf das Passwort schliessen.

    SG1 schrieb:

    Lass es bleiben. Wenn Du als Laie versuchst, selbst 'ne Verschluesselung zu schreiben, geht's schief.

    Da niemand weiss wie phantasievoll "Laien" sind, können "Laien" ohne weiteres unknackbare Algorithmen schreiben. Arbeitest Du für den Geheimdienst ? 🙂



  • merker schrieb:

    SG1 schrieb:

    Lass es bleiben. Wenn Du als Laie versuchst, selbst 'ne Verschluesselung zu schreiben, geht's schief.

    Da niemand weiss wie phantasievoll "Laien" sind, können "Laien" ohne weiteres unknackbare Algorithmen schreiben. Arbeitest Du für den Geheimdienst ? 🙂

    Das hat genau gar nichts mit Phantasie zu tun.



  • Das ganze braucht jetzt kein Super-Unknackbarer Algotithmus sein - er soll halt für normale Zwecke taugen.

    Der Tip mit der Summe ist schonmal gut!

    Ich sehe keinen Grund, warum ich mich als Anfänger nicht an solche Gebiete langsam ranwagen sollte...



  • du machst einfach ein array mit zufallszahlen, so um die 200, je mehr desto besser. das ist dann der schlüssel.
    mit dem schlüssel machste mit jedem byte des zu verschlüsselnden textes eine XOR verknüpfung, ist der text länger als deine zufallszahlenkette, dann fängste mit den zufallszahlen-array wieder vorne an.
    ist der text kürzer oder genau so lang wie das zufallszahlen-array, dann ist der verschlüsselte text unknackbar.
    man kann ihn nur entschlüsseln, wenn man das zufallszahlen-array kennt, oder die methode, mit der dieses generiert wurde (falls es die rand-funktion war, die ja keinen echten zufallszahlen liefern kann)...
    🙂



  • Netter Ansatz, der hat nur ein Problem: Um den verschlüsselten Wert wiederherstellen zu können (oder um festzstellen, ob der Nutzer das richtige Passwort eingegeben hat), benötigst du auch wieder das Zufallsarray.



  • CStoll schrieb:

    Netter Ansatz, der hat nur ein Problem: Um den verschlüsselten Wert wiederherstellen zu können (oder um festzstellen, ob der Nutzer das richtige Passwort eingegeben hat), benötigst du auch wieder das Zufallsarray.

    ach, mist, ich dachte es sollen texte verschlüsselt werden...
    zum verschlüsseln von passwörtern kann man sich z.b. etwas ähnliches wie eine 'hashfunktion' basteln, die ein bitmuster fester länge, aber mit unterschiedlichem inhalt erzeugt (abhängig vom passwort).
    mit diesem bitmuster wird dann geprüft, ob der gleiche algo bei der passworteingabe das gleiche bitmuster erzeugt (dann stimmt das passwort).
    aber aus dem bitmuster kann man das passwort nicht wieder zurückgewinnen.
    🙂



  • Das Problem: Du musst zumindestens dem abfragenden Programm den Zugriff auf die "verschlüsselten" Passwörter gestatten. Das bedeutet je nach Betriebssystem, daß der Benutzer des Programms Lesezugriff auf die Passwortdatei hat, und diese anzeigen kann.

    Damit sind zwei der Hauptanforderungen klar: Das verschlüsselte Passwort darf nicht trivial zurückführbar sein und die Eingabe des verschlüsselten Passworts darf nicht zum Erfolg führen.

    Die "Summenbildung" ist dazu ein vernünftiger Ansatz. Du musst dabei aber berücksichtigen, daß es, je nach verwendetem Algorithmus, Kollisionsbereiche gibt. Wenn du also einfach den "Alphabetwert" der Buchstaben A=1 bis Z=26 addierst, wären die Passwörter "aC" und "Ac" identisch (genauer gesagt: etliche Passwörter würden zur selben Summe führen). Das ist natürlich nicht gewünscht: Aller Wahrscheinlichkeit nach haben ab einer gewissen Nutzerzahl zwei Benutzer die gleiche Passwortsumme, und könnten sich damit mit Ihrem Passwort als der andere Nutzer ausgeben.

    Zu diesem Zweck gibt es "Einweg-Prüfsummen" wie MD5, bei denen die Änderung einer Stelle um einen Wert zu einem wesentlich unterschiedlichen Ergebnis führt - die Wahrscheinlichkeit von Kollisionen wird verringert.

    Durch die Verwendung von Prüfsummen wird auch die zweite Anforderung erfüllt: Aus der Prüfsumme würde wieder eine Prüfsumme gebildet, die dann natürlich eindeutig unterschiedlich ist.

    Haken: Wenn die Abfrage der Prüfsumme verändert oder abgehört werden kann (über ein Netzwerk, beispielsweise), dann kann sich ein Angreifer als Nutzer ausgeben, indem er eine Anfrage mit einer abgehörten Prüfsumme an den Authentifizierungsserver sendet.



  • Simonek schrieb:

    Das ganze braucht jetzt kein Super-Unknackbarer Algotithmus sein - er soll halt für normale Zwecke taugen.

    es taugt aber nichts für normale Zwecke. Es ist wertlos um es mal ganz hart zu sagen. Natürlich kann man sagen "hey, mein Baumhaus soll kein Orkan überstehen", aber wenn es zusammen fällt, wenn eine Mücke drauf landet, ist es trotzdem Sinnlos.

    Ich sehe keinen Grund, warum ich mich als Anfänger nicht an solche Gebiete langsam ranwagen sollte...

    natürlich kann man sich ranwagen. Aber man sollte dann auch bereit sein Kritik zu verstehen und es wäre vielleicht auch sinnvoll sich mit den Sachen zu befassen, die andere Leute schon gemacht und probiert haben...

    Das Buch "Angewandte Kryptographie" von Schneier wird dir sicher jeder für den Anfang ans Herz legen (wirklich ein sehr gutes Buch)



  • Werd das Buch mal anschauen.

    Ich werde das mit der Summenbildung mal versuchen umzusetzen.

    Ich glaube, Du hast da was falsch verstanden. Meine Zielsetzung ist eine Verschlüsselung für normale Zwecke. Dass die Funktion diese Anforderung nicht erfüllt ist mir schon klar (sonst hätte ich doch gar nicht um Hilfe hier gefragt 😉 )



  • rüdiger schrieb:

    Das Buch "Angewandte Kryptographie" von Schneier wird dir sicher jeder für den Anfang ans Herz legen (wirklich ein sehr gutes Buch)

    hauptsache der erzählt keine geschichten von 'alice und bob' 😉


Anmelden zum Antworten