H1N1: Verschlüsselung / Entschlüsselung Perl Modul

Hallo zusammen,

ich suche ein Perlmodul (oder Codeschnipsel) mit dem ich einen String verschlüsseln und auch wieder entschlüsseln kann. Der Key sollte relativ lang sein können (mindestens 10 Stellen) und der Algorithmus nicht ganz trivial.

Danke für Tipps.

bye,
H1N1

  1. Weil Du's bist und heute Freitag ist ;-)

    Schlüssel frei wählbar: z.B. qw(1 3 4 5 6 3 2 1 9)

    Das Base64-Geraffel hab ich nur eingebaut, damit am Ende ASCII rauskommt, kannste auch weglassen.

    Hotte

      
    ###########################################################################  
    # Text synchron verschlüsseln  
    sub kryptn{  
    	my ($txt, $key) = @_; # $key ist eine Referenz auf @key  
    	my $len = scalar @$key;  
    	my $i = 0;  
    	my $crypt = join "",  
    		map { $i = ($i + 1) % $len;  
    			chr((ord($_) + $$key[$i]) % 256) } split //, $txt;  
    	return(encode_base64($crypt, ""));  
    }  
    ###########################################################################  
    # Verschlüsselung aufheben  
    sub entkryptn{  
    	my ($crypt, $key) = @_; # $key ist eine Referenz auf @key  
    	my $len = scalar @$key;  
    	my $i = 0;  
    	$crypt = decode_base64($crypt);  
    	my $orig = join "",  
    	map { $i = ($i + 1) % $len;  
    		chr((ord($_) - $$key[$i] + 256) % 256) }  
    			split //, $crypt;  
     	return($orig);  
    }  
    ###########################################################################  
      
    
    
    1. Danke!!

      Es funktioniert (base64 habe ich rausgenommen, da ich das Modul Mime::base64 derzeit nicht installiert habe).

      #!/usr/bin/perl  
      ###########################################################################  
      # Text synchron verschlüsseln  
      sub kryptn{  
              my ($txt, $key) = @_; # $key ist eine Referenz auf @key  
              my $len = scalar @$key;  
              my $i = 0;  
              my $crypt = join "",  
                      map { $i = ($i + 1) % $len;  
                              chr((ord($_) + $$key[$i]) % 256) } split //, $txt;  
              return($crypt);  
      }  
      ###########################################################################  
      # Verschlüsselung aufheben  
      sub entkryptn{  
              my ($crypt, $key) = @_; # $key ist eine Referenz auf @key  
              my $len = scalar @$key;  
              my $i = 0;  
              my $orig = join "",  
              map { $i = ($i + 1) % $len;  
                      chr((ord($_) - $$key[$i] + 256) % 256) }  
                              split //, $crypt;  
               return($orig);  
      }  
      ###########################################################################  
        
      @key = qw (7 a $ & a a ! P * " g);  
      my $text = "Was ein wunderschoener Tag\n";  
        
      print "TEXT: $text\n";  
      my $cryp_text=kryptn($text,\@key);  
      print "TEXT crypt: $crypt_text\n";  
      my $uncrypt_text=entkryptn($cryp_text,\@key);  
      print "TEXT uncrypt: $uncrypt_text\n";  
      
      

      Ich bin nicht so fit in Codierungsgeschichten, deshalb noch ne Frage hinterher...
      Kann ich den Inhalt von $cryp_text problemlos in eine Mysql-DB als string abspeichern, wenn ich das base64 coding nicht mache? Bislang benutze ich für alle meine DB-Einträge UTF-8 bzw. würde das so $cryp_text = encode('UTF-8', $cryp_text); funktionieren?

      Ciao
      H1N1

      1. Hallo,

        [code lang=perl]#!/usr/bin/perl
        ###########################################################################

        Text synchron verschlüsseln

        sub kryptn{
                my ($txt, $key) = @_; # $key ist eine Referenz auf @key
                my $len = scalar @$key;
                my $i = 0;
                my $crypt = join "",
                        map { $i = ($i + 1) % $len;
                                chr((ord($_) + $$key[$i]) % 256) } split //, $txt;
                return($crypt);
        }
        ###########################################################################

        Verschlüsselung aufheben

        sub entkryptn{
                my ($crypt, $key) = @_; # $key ist eine Referenz auf @key
                my $len = scalar @$key;
                my $i = 0;
                my $orig = join "",
                map { $i = ($i + 1) % $len;
                        chr((ord($_) - $$key[$i] + 256) % 256) }
                                split //, $crypt;
                 return($orig);
        }

        Ich bin nicht so fit in Codierungsgeschichten,

        deswegen solltest Du von diesem ausgewiesenen Müll einfach Abstand halten. Perl hat doch sicher eine AES-Implementierung aufzuweisen.

        Lesetipp: http://aktuell.de.selfhtml.org/weblog/php-verschluesselung-100-euro-wette. Dieser Algorithmus ist kein bisschen sicherer als der dort geknackte. Finger weg!

        Freundliche Grüße

        Vinzenz

        1. hi,

          »» Ich bin nicht so fit in Codierungsgeschichten,

          deswegen solltest Du von diesem ausgewiesenen Müll einfach Abstand halten.

          Ahja, da wurde viel diskutiert. Aber meinen Schlüssel hat keiner rausbekommen, den suche ich heute noch ;-)

          Hotte

          1. Hallo,

            » »» Ich bin nicht so fit in Codierungsgeschichten,
            »
            » deswegen solltest Du von diesem ausgewiesenen Müll einfach Abstand halten.

            Ahja, da wurde viel diskutiert. Aber meinen Schlüssel hat keiner rausbekommen, den suche ich heute noch ;-)

            hast Du schon wieder mal nicht alles gelesen? Vertrau Henryk, dem großen Schlüsselfindemeister.
            Henryk zeigt übrigens in letzterem Beitrag auf, warum base64-Codierung rein gar nichts zur Sicherheit beiträgt :-)

            Freundliche Grüße

            Vinzenz

          2. Ahja, da wurde viel diskutiert. Aber meinen Schlüssel hat keiner rausbekommen, den suche ich heute noch ;-)

            Na dann biete hundert Euro! Nicht für den Aufwand sondern für die Herabwürdigung eine Viginere-Verschlüsselung knacken zu müssen,

            Seit 150 Jahren unsicher!!!

            irgendwo hab ich ein GFA-Basic progrämmle das es auf dem Atari-ST erledigt (der freut sich aus dem Keller wieder vorgeholt zu werden)

            Die einzige Chance die du hast ist das der Schlüssel
            1. immer neu,
            2. zufällig und
            3. immer länger als die Nachricht ist...

      2. hi,

        Kann ich den Inhalt von $cryp_text problemlos in eine Mysql-DB als string abspeichern, wenn ich das base64 coding nicht mache?

        Sischr.

        Bislang benutze ich für alle meine DB-Einträge UTF-8 bzw. würde das so $cryp_text = encode('UTF-8', $cryp_text); funktionieren?

        MySQL ists egal, was für Zeichen reinkommen. Du musst nur zwei Dinge wissen:

        • Collation: Von Interesse bei Stringvergleichen, Suche über die Engine
        • Charset: Ist nur ein Tagging (Aufkleber) legt jedoch den Platz fest, der reserviert wird, nehmen wir char(1)

        ISO-8859: Es werden 8 Bit = 1 Byte reserviert
        UTF-8: Es werden 24 Bit = 3 Byte reserviert

        Platzverschwendung wäre z.B., wenn die Tabelle mit UTF-8 getagged wird, der Anteil der Zeichen, die mehr als 1 Byte benötigen jedoch nur gering ist.

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
      3. Hallo,

        Ich bin nicht so fit in Codierungsgeschichten, deshalb noch ne Frage hinterher...
        Kann ich den Inhalt von $cryp_text problemlos in eine Mysql-DB als string abspeichern, wenn ich das base64 coding nicht mache? Bislang benutze ich für alle meine DB-Einträge UTF-8 bzw.

        Wenn Du keine base64-Codierung vornimmst - was sinnvoll ist - dann sollten Dir nach der Codierung binäre Daten vorliegen. Die dafür sinnvollen Datentypen sind VARBINARY oder einer der BLOB-Typen. Es ist eine denkbar schlechte Idee, für binäre Daten VARCHAR oder einer der TEXT-Typen mit einem Character-Set und einer Kollation zu verwenden. Wegen der von Hotte bereits angesprochenen Speicherproblematik gilt dies in diesem speziellen Fall für UTF-8 ganz besonders - es ist so ziemlich das verkehrteste, was Du nehmen kannst.

        Freundliche Grüße

        Vinzenz

      4. 你好 H1N1,

        Es funktioniert (base64 habe ich rausgenommen, da ich das Modul Mime::base64 derzeit nicht installiert habe).

        Nicht benutzen. Benutze eine vernünftige AES- oder DES-Implementierung. Selbstgeschriebene Verschlüsselungsverfahren sind idR grottig.

        再见,
         克里斯蒂安

  2. Hallo,

    ich suche ein Perlmodul (oder Codeschnipsel) mit dem ich einen String verschlüsseln und auch wieder entschlüsseln kann. Der Key sollte relativ lang sein können (mindestens 10 Stellen) und der Algorithmus nicht ganz trivial.

    Weniger als eine Minute Suchen: http://search.cpan.org/~bdfoy/Crypt-Rijndael/Rijndael.pm, ein AES-Modul für Perl.

    Freundliche Grüße

    Vinzenz

  3. Moin Moin!

    Ich rieche hier "Passwort speichern und prüfen".

    Dazu braucht es keine Verschlüsselung, im Gegenteil: Verschlüsselung ist hier GEFÄHRLICH. Denn der Entschlüsselungsalgorithmus und der Schlüssel müssen genau an der Stelle liegen, die beim Einbruch extrem gefährdet ist: Auf dem Server. Kommt jemand so weit, dass er Deine Password-Tabelle auslesen kann, kommt er in aller Regel auch an den Schlüssel und die Entschlüsselungsfunktion. Da kannst Du also genau so gut gleich Klartext speichern.

    Deshalb benutzt man ein anderes Verfahren: Man berechnet einen Hashfunktion (eine Prüfsumme) über das Passwort und speichert nur diese Prüfsumme. Statt das eingegebene Passwort mit dem Original zu vergleichen, berechnet man aus der Eingabe wieder die selbe Hashfunktion und prüft, ob deren Ergebnis mit dem in der Datenbank übereinstimmt.

    Problem: Gleiche Passworte erzeugen gleiche Hash-Werte. Daher benutzt man einen "Salt"-Wert, der zusätzlich mit in die Hash-Funktion gegeben wird. Das kann der Login-Name sein, besser ist aber ein zufälliger (String-)Wert, den man natürlich auch in der DB speichern muß.

    Als Hash-Funktion nahm man crypt (katastrophal schlecht, weil es nur 8 Zeichen verarbeitet und alles andere ignoriert) oder MD5 (besser als nichts, aber quasi geknackt), Stand der Technik dürften die SHA-Funktionen und härtere Geschütze sein.

    Das Digest-Package bringt einige Funktionen mit, über deren jeweilige Qualität sollte u.a. Wikipedia Auskunft erteilen können.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".