Eigenen Algorhytmus testen

Hallo liebe Foren Gemeinde,
ich habe ich habe ein Programm geschrieben, das beliebeigen Text verschlüsselt. Dazu verwendet es einen von mir geschriebenen Algorhytmus.

Hier ist der Verschlüsselte Text;
Code:
0ySEo{C6Rnât"oy_RJUnuo5DG1RSZÁ:H!PA%FUCWÓx"IFÉR5êGéz3rCÊy3NqÊjXêPzD7OAÂDRIF:EHWvÚz%qB$LR0sÚxYGú
Der Quellcode (#):
Code:
        private const string possibleChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!\"§$%&/()=?.:-_,;áéíóúÁÉÍÓÚâêîôûÂÊÎÔÛäöü+*~'#[]{}\\<>| _";

        public static string CryptText(string text, string password, int keyLength)
        {
            if (password == "")
                password = "Standard";
            string crypted = string.Empty;
            char[] key = new char[keyLength];
            char[] pass = password.ToCharArray();
            int seed = DateTime.Now.Minute * 60000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
            Random rand = new Random(seed);
            for (int i = 0; i < keyLength; i++)
            {
                key[i] = getChar(rand.Next(0, possibleChars.Length - 1));
            }

            for (int i = 0; i < keyLength; i++)
            {
                crypted += CryptChar(key[i], password[i % password.Length]);
            }

            //Text verschlüsseln
            for (int i = 0; i < text.Length; i++)
            {
                char c1 = CryptChar(pass[i % pass.Length], text[i]);
                crypted += CryptChar(c1, key[i % keyLength]);
            }

            return crypted;
        }

        private static char CryptChar(char c1, char c2)
        {
            if (possibleChars.Contains(c1) && possibleChars.Contains(c2))
            {
                int c1ID = 0;
                int c2ID = 0;
                for (int i = 0; i < possibleChars.Length; i++)
                {
                    if (possibleChars[i] == c1)
                        c1ID = i;
                    if (possibleChars[i] == c2)
                        c2ID = i;
                }
                return getChar(c1ID + c2ID);
            }
            return '_';
        }

        private static char getChar(int id)
        {
            if (id >= 0)
            {
                return possibleChars[id % (possibleChars.Length - 1)];
            }
            else
            {
                return possibleChars[(possibleChars.Length - 1) + id];
            }
        }
Es währe nett, wenn ihr mir die Schwachstellen des Algos nennen könntet.

Download:
http://www.megaupload.com/?d=CMZOJ6R8

Mirror:
http://rapidshare.com/files/328464783/MeineVerschl__sselung.exe.html

Wenn ihr einen Fehler findet, sagt es bitte.
Und wenn es hilft: Der Schlüssel ist 5 Stellen lang, das Passwort ist 8 stellen lang.
Viele grüsse,
FlySoft
 
Designschwachstelle: Es werden nicht alle Zeichen unterstützt. Kannst du das nicht irgendwie über Unicode-Zeichencodes lösen?
 
Hi,
vorweg kenn ich zwar die Sprache deiner Implementierung nicht, aber mir fällt auf dass du eine Art Substitutions Chiffrierung verwendest. Diese ist schon von Haus aus nicht sicher. Nimm dir mal ca. 200 Chriffren und wende eine Häufigkeitsanalyse darauf an. Dauert von Hand keine 20 min und deine Chiffrierung ist gebrochen. Ich rate dir für Heimanwendungen eher zum OTP (One Time Pad) oder zu einer Feistel Chiffre. Gruß
 
jupp, Linear Feedback Shift Register, siehe GSM und andere Handy Netze... Aber selbst ein PRNG ist besser als eine Substitution. Für halbwegs ordentliche Dinge gibt es AES Klassen in so ziemlich jeder Sprache.
 
du weißt schon, das ein PRNG ala LFSR nicht sicher ist, da man dies ohne Probleme mit nem Gaußverfahren innerhalb von Minuten brechen kann, wenn man die ersten 2(m-1) Bits hat?Wenn du schon was empfiehlst dann gleich was richtiges und keine halben Sachen.
 
Es ist mir bekannt dass sich bei bekanntem x0 bis x2m-1 lässt sich der LFSR berechnen lässt, wobei m gleich der Anzahl an FlipFlops mit Schalter oder vergleichbares und x Klartext Bits ist.
FlySOft wollte etwas zu seinem Algo hören, ich habe ihm eine Schwachstelle gezeigt. Eine Grudsatz Disskussion zu RNGs ala LFSR und LCG ist glaube ich hier nicht gewünscht. Außerdem wissen wir nichts über die geplante Anwendung von FlySofts Algo. Deshalb ist der OTP als Vorlage durchaus noch im Rennen. Auf Feist und AES habe ich ebenfalls schon verwiesen.
 
Deine zufallszahlen sind nicht dafür geeignet. nimm mal SecureRandom oder BigInteger's integrierten Algorithmus. Das ist doch Java oder?
 
Nö, das ist C#.
Mir ist überigens selber der Bug aufgefallen, der das entschlüsseln sehr einfach möglich macht. Wenn die ersten paar zeichen vom Passort stimmen, also der Key korrekt entschlüsselt wird, und das passwort die richtige länge hat, dann lässt sich der Rest sehr leichtrausfinden. Wenn man z.B. einen Teil der Nachricht kennt, lässt sich jedes Zeichen ausprobieren und dadurch das Passwort erraten bzw. entschlüsseln.

FlySoft
 
Zuletzt bearbeitet:
Zurück
Oben