Personal Homepage, Tutorials & Blog

PHP: Encrypt/Decrypt Funktion mit Base64 und Schlüssel

PHP: Encrypt/Decrypt Funktion mit Base64 und Schlüssel

9. Mai '10

String verschlüsseln

Mit den nachfolgenden Funktionen können Sie Strings, als Zeichenketten ver- und wieder entschlüsseln.

function encrypt($string, $key) {
  $result = '';
  for($i=0; $i<strlen ($string); $i++) {
    $char = substr($string, $i, 1);
    $keychar = substr($key, ($i % strlen($key))-1, 1);
    $char = chr(ord($char)+ord($keychar));
    $result.=$char;
  }

  return base64_encode($result);
}

String entschlüsseln

function decrypt($string, $key) {
  $result = '';
  $string = base64_decode($string);

  for($i=0; $i<strlen($string); $i++) {
    $char = substr($string, $i, 1);
    $keychar = substr($key, ($i % strlen($key))-1, 1);
    $char = chr(ord($char)-ord($keychar));
    $result.=$char;
  }

  return $result;
}

Beispielcode

$geheim = encrypt("Diese Botschaft ist geheim", "tfonfara.de");
$lesbar = decrypt($geheim, "tfonfara.de");

Über die Funktion encrypt() wird zunächst ein String (kann auch eine Variable sein) und ein geheimer Schlüssel, ein Kennwort übergeben. Dieses Kennwort wird benötigt, um die verschlüsselte Botschaft wieder lesbar zu machen. Dafür wird die Funktion decrypt() aufgerufen.

 

Wenn Ihnen dieser Artikel gefallen hat, oder Sie Anregungen/Kritik haben, würde ich mich freuen, wenn Sie einen Kommentar schreiben oder das RSS Feed abonnieren, um immer automatisch über die neuesten Artikel auf dieser Seite informiert zu werden. Sie dürfen diesen Artikel oder die gesamte Seite auch gerne verlinken.

24 Kommentare

  1. fxworker /

    Hallo Tobias,

    auf der Suche nach einer einfachen fürs Auge nicht lesbaren „Kodierung“ bin ich auf deinen recht schönen Beitrag gestoßen.

    Ich bräuchte (v.A.) die Dekodierungsfunktion in C, da ich die Dekodierung in einem kleinen C-Program (Ubuntu) umsetzen muss.

    Hast du Tipps oder ggf. im Bestcase dasselbe für C?

    Besten Dank für die Infos und Tipps im Voraus.

    LG
    fxworker

    • maker7 /

      Hier mal in C#, vielleicht hilft das ja etwas:

      public string Decrypt(string str)
              {
                  string result = "";
                  byte[] strBytes = System.Convert.FromBase64String(str);

                  for (int i = 0; i < strBytes.Length; i++)
                  {
                      string keyChar = "";
                      int start = (i % Key.Length) - 1;
                      if (start < 0)
                          keyChar = Key.Substring(Key.Length + start, 1);
                      else
                          keyChar = Key.Substring(start, 1);
                      byte offset = (Encoding.ASCII.GetBytes(keyChar))[0];
                      result += (char)((byte)(strBytes[i] - offset));
                  }

                  return result;
              }
  2. Frage: Wenn ich einen komplizierten bei, jedem User anderen, Schlüssel verwende, ist die Methode dann sicher genug, oder ist sie für geübte hacker schnell zu knacken?

    Ich würde mich freuen wenn ich schnelle antwort kriege, da ich die Methode gerne für eins meiner Projekte einsetzen würde

    • @jlm:
      Die ist eine schwache Verschlüsselung, es kommen keine Primzahlen zum Einsatz. Für einen schnellen Hack ist sie eine nette Sache, aber wenn Du einen wirksamen Schutz benötigst, ist sie ungeeignet.
      Gruß, Jörg.

      • Danke für die schnelle Antwort, welche Methode kannst du mir denn empfehlen?

        Wichtig ist, dass sie entweder in PHP, oder noch lieber in JavaScript verwendbar ist

      • Such mal nach „PHP AES“ oder „PHP DES“, das sollte weiterhelfen.
        In JS gibt es keine einfache Möglichkeit der starken Verschlüsselung. Du kannst natürlich immer von JS aus ein serverseitiges Script in PHP aufrufen. Dieser Aufruf sollte aber selbst SSL-verschlüsselt erfolgen.

      • Sorry für die späte Antwort, war im Urlaub und dann sehr beschäftigt.

        Das Problem ist, dass ich eine App bauen möchte, und deshalb der Client kein PHP verwenden darf (PhoneGap lässt das nicht zu). Ich kann PHP-Skripte also nur ausführen, wenn ich eine JS-GET-Abfrage an den Server mache (jQuery is das glaub ich). Dadurch sind die Daten abfangbar. Deshalb meine Frage: reicht es aus, wenn ich die Verbindung über https mit einem ssl Zertifikat mache.

        Sorry falls das hier jetzt der Falsche Ort dafür ist, aber ich glaube hier kennen sich die Leute einfach aus und es interessiert bestimmt auch andere, welche anderen Möglichkeiten man hat.

      • Und dann würde ich auf dem Server die Daten mit der encrypt Funktion von oben die Daten verschlüsseln und in der MySQL Datenbank abspeichern

  3. Sorry, vorhin falsch gepostet.

    Jetzt aber:

    Kannst Du dieses auch als Beispiel in Objective C realisieren?

    Wäre Dir sehr dankbar für eine Hilfe.

    Bis bald.
    Jo

  4. Funktioniert bestens.
    Da die Encrypt-Funktion noch ein base64_encode enthält kann der Output problemlos auf alle möglichen Weisen verwendet werden (z.B. in Emails verschickt oder in ein hidden-Field in einer Website geschrieben werden). Er enthält nur Buchstaben, Zahlen und die zwei Sonderzeichen + und /. Es kommt also nicht zu Konflikten mit Quotes oder nicht-binären Übertragungswegen.
    Vielen Dank.

  5. raba300 /

    Hallo Tobias,

    danke für dein en/decode Script.

    Wollt es für meine Zwecke einsetzen und komme absulut nicht klar. keine Ahnung was ich falsch mache!?

    Ich wollt dieses:

    und dieses

    $user = base64_decode($_GET[‚acc‘]);
    $pass = base64_decode($_GET[‚pwd‘]);
    $data = _check($user, $pass);
    if (is_numeric($data))

    durch deinen en/decode ersetzen.

    Bekomme es nicht zum laufen.

    Für deine Hilfe wäre ich Dankbar.

    lg
    raba300

  6. Anonymous /

    Thanks. Works great.

  7. movie butler /

    Der Code funktioniert nur mit dem im Beispiel angegebenen Passwor (tfonfara.de). Andere Schlüssel werden nicht mehr korrekt decodiert.

    • Tobias Fonfara /

      Sie müssen in beiden Funktionen beim Aufruf das gleiche Passwort verwenden, dann geht alles.

      • movie butler /

        DANKE,

        das kommt davon wenn man schnell mal was macht. Sie haben natürlich recht. Super schnelle Hilfe!!!!

      • Which came first, the problem or the souolitn? Luckily it doesn’t matter.

  8. Leider funktioniert der Code nur in 10% der Fälle. An was kann dies liegen?

    • Tobias Fonfara /

      Ohne weitere Informationen kann ich dazu leider nichts sagen. Eine mögliche Fehlerquelle wäre, dass De- und Encrypt-Funktion verwechselt wurden. Aber da es ja in 10 Prozent der Fälle funktioniert, kann es ja eigentlich nicht an dem Code liegen.

  9. Vielen Dank für die spontane Hilfe! Jetzt klappts an allen Fronten… ;o)

  10. Habe das URL-Verschlüsselungsbeispiel auf Basis dieser Funktionen probiert. Kriege aber falschen String raus. Viellt. lags an Zeile 3 in encrypt()) bzw. 5 in decrypt(). Wie muss die denn vollständig aussehen? Ich habe
    for($i=0;$i<strlen($string);$i++) { verwendet.

    Zur Sicherheit wollte ich dann dieses Basic-Beispiel hier testen, aber die Seite lud überhaupt nicht und Prozessor lief auf Hochtouren. Was mache ich falsch?

    • Hier muss irgendwo ein Teil des Codes verlorengegangen sein, Entschuldigung dafür.
      Versuchen Sie es doch nochmal mit dem obigen Code, ich habe ihn aktualisiert.

  11. Great information! I’ve been looking for something like this for a while now. Thanks!

Einen Kommentar schreiben