kostenloser Webspace werbefrei: lima-city


Sicherste Verschlüsselungsmethode gesucht

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Guten Morgen,

    ich plane ein kleines Sicherheitsprojekt und brauche eure Ideen. In erster Linie suche ich die sicherste Methode, einen beliebig langen String zu verschlüsseln mit der Möglichkeit, selbigen zu entschlüsseln.

    Sicher ist das Ganze nur dann, wenn ein Passwort zur Verschlüsselung genutzt wird. Hier mal ein erster Vorschlag:

    <?php
    
    function bE($data) {
    	return strtr(rtrim(base64_encode($data), '='), '+/', '-_');
    }
    
    function bD($base64) {
    	return base64_decode(strtr($base64, '-_', '+/'));
    }
    
    function xCrypt($pass, $dataToEncrypt){
    	$td = mcrypt_module_open(MCRYPT_SERPENT, '', MCRYPT_MODE_CBC, '');
    	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
    	$ks = mcrypt_enc_get_key_size($td);
    	$key = substr($pass, 0, $ks);
    	mcrypt_generic_init($td, $key, $iv);
    	$encrypted = mcrypt_generic($td, $dataToEncrypt);
    	mcrypt_generic_deinit($td);
    	mcrypt_module_close($td);
    	return array(bE($encrypted), bE($iv));
    }
     
    function xDecrypt($pass, $encryptedData, $iv){
    	$td = mcrypt_module_open(MCRYPT_SERPENT, '', MCRYPT_MODE_CBC, '');
    	$ks = mcrypt_enc_get_key_size($td);
    	$key = substr($pass, 0, $ks);
    	mcrypt_generic_init($td, $key, bD($iv));
    	$decrypted = mdecrypt_generic($td, bD($encryptedData));
    	mcrypt_generic_deinit($td);
    	mcrypt_module_close($td);
    	return trim($decrypted);
    }
    
    $str = 'Hallo Welt. Dies ist ein Test.';
    $enc = xCrypt('12345', $str);
    $dec = xDecrypt('12345', $enc[0], $enc[1]);
    
    echo $dec;
    ?>


    Die Funktionen bE und bD sind schon sinnvoll, da sie einen vernünftigen Base64-String erzeugen bzw. selbigen wieder entschlüsseln.

    Das Ganze funktioniert auch problemlos, jedoch dauert mir persönlich die Verarbeitung etwas zu lang.

    Das Ganze soll am Ende schnell, schlank und voll funktionsgähig sein. Was es werden soll, wird noch nicht verraten :)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. fabo schrieb:
    ich plane ein kleines Sicherheitsprojekt und brauche eure Ideen. In erster Linie suche ich die sicherste Methode, einen beliebig langen String zu verschlüsseln mit der Möglichkeit, selbigen zu entschlüsseln.


    und

    Das Ganze soll am Ende schnell, schlank und voll funktionsgähig sein. Was es werden soll, wird noch nicht verraten :)

    Dann ist es schwer zu sagen, welche Verfahren für dich die Mindestanforderungen erfüllen. Daher schlage ich einfach das Non-plus-ultra vor: One Time Pads

    Vorteile:
    - Absolut sicher. Auch in der fernsten Zukunft
    - Einfach zu verstehen
    - Schnelle Ent- und Verschlüsselung mit zeichenweisem XOR
    - Plausible Deniability

    Nachteile:
    - Erfordert Schlüssellänge, die genauso lang ist wie der Text
    - Kein Public-Key Verfahren. Alle beteiligten müssen den gleichen Schlüssel zum ver- und entschlüsseln nehmen
    - Ein Schlüssel darf nicht öfter als 1 mal benutzt werden.


    Beitrag zuletzt geändert: 29.6.2011 10:02:52 von bladehunter
  4. http://www.selfphp.de/kochbuch/kochbuch.php?code=80 brauch man aber libmcrypt 2.4.x oder 2.5.x auf den server
    http://www.php-einfach.de/sonstiges_generator_xtea.php xtea auch gut und schnell aber nichts für lange texte
    aber ob die die sachen dan sicher verschlüsselt sind ???
    sonst mal in die PHP Manual schauen http://php.net/manual/en/function.crypt.php
  5. die quanten kryptographie erfüllt alle deine anforderungen, ist wohl der beste weg für den sicheren schüsselaustausch, dadurch kann man sich eine menge wulst im verschlüsselungs algorythmus ersparen.

    auch wenn das jetzt noch nich wirklich zur anwendung kommt, es funktioniert auf jeden fall schonmal, zeigt auch nur das die wahre stärke der verschlüsselung viel mehr vom schlüssel austausch abhängt, was nützen ein starker schlüssel wenn jeder den schlüssel lesen kann

    mehr leistung bekommst du nur wenn du auf schlüsselstärke verzichtest

    Beitrag zuletzt geändert: 30.6.2011 3:00:18 von aero23
  6. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    @bladehunter

    Die Idee eines OTP ist garnicht so schlecht. Ginge ja in etwa so:

    <?php
    
    function bE($data) {
    	return strtr(rtrim(base64_encode($data), '='), '+/', '-_');
    }
    
    function bD($base64) {
    	return base64_decode(strtr($base64, '-_', '+/'));
    }
    
    function xCrypt($pass, $dataToEncrypt) {
    	$result = '';
    	for($i=1; $i<=strlen($dataToEncrypt); $i++) {
    		$char = substr($dataToEncrypt, $i-1, 1);
    		$keychar = substr($pass, ($i % strlen($pass))-1, 1);
    		$char = chr(ord($char)+ord($keychar));
    		$result.=$char;
    	}
    	return bE($result);
    }
    
    function xDecrypt($pass, $encryptedData) {
    	$result = '';
    	for($i=1; $i<=strlen(bD($encryptedData)); $i++) {
    		$char = substr(bD($encryptedData), $i-1, 1);
    		$keychar = substr($pass, ($i % strlen($pass))-1, 1);
    		$char = chr(ord($char)-ord($keychar));
    		$result.=$char;
    	}
    	return $result;
    }
    
    $str = 'Hallo Welt. Dies ist ein Test.';
    $enc = xCrypt('12345', $str);
    $dec = xDecrypt('12345', $enc);
    
    echo $dec;
    ?>


    In Punkto Geschwindigkeit definitv eine gute Alternative, aber ich kann den Sicherheitgrad noch nicht ganz einschätzen.

    @schrotti19

    Danke.

    @aero23

    Was zum Henker ist "Quantenkryptographie"? Das klingt nach Physik und weniger nach etwas, was man mit PHP umsetzen kann :D Aber ich lasse mich gerne eines besseren belehren =)

    -------

    Alles in allem geht es mir darum, dass ich x-beliebige, sensitive Daten in einer Datenbank speichern möchte. Diese Daten wiederrum werden in verschlüsselter Form hinterlegt und lassen sich nur durch den Eigner mit Hilfe des richtigen Schlüssels (SHA512 gehasht + random salt) in den Ursprung versetzen, bzw. lesbar machen.

    Das ganze ist bisher nur ein Konzept, aber ich denke, dass sich das letztlch gut umsetzen lässt.

    Beitrag zuletzt geändert: 30.6.2011 5:19:58 von fabo
  7. fabo schrieb:
    @bladehunter

    Die Idee eines OTP ist garnicht so schlecht. Ginge ja in etwa so:

    <?php
    
    function bE($data) {
    	return strtr(rtrim(base64_encode($data), '='), '+/', '-_');
    }
    
    function bD($base64) {
    	return base64_decode(strtr($base64, '-_', '+/'));
    }
    
    function xCrypt($pass, $dataToEncrypt) {
    	$result = '';
    	for($i=1; $i<=strlen($dataToEncrypt); $i++) {
    		$char = substr($dataToEncrypt, $i-1, 1);
    		$keychar = substr($pass, ($i % strlen($pass))-1, 1);
    		$char = chr(ord($char)+ord($keychar));
    		$result.=$char;
    	}
    	return bE($result);
    }
    //[...]

    Nein. So geht das nicht. Dein Schlüssel muss (mindestens) genau so lang sein wie der Text. Du verwendest hier das OTP mehr als einmal. Das ist nicht zulässig. Du musst das anders machen:

    <?php
    
    function otp_crypt( $text, $otp ) {
    	if( strlen( $text ) < strlen( $otp ) ) {
    		echo 'key is too short!';
    	}
    
    	$encrypted = $otp;
    	for( $i = 0; $i < strlen( $text ); $i++ ) {
    		$encrypted[ $i ] = $text[ $i ] ^ $otp[ $i ];
    	}
    
    	return $encrypted;
    }
    
    $text = "Bla Bla Blubb";
    $otp  = "GRTolI4OItaie";
    echo '[' . otp_crypt( $text, $otp ) ."]\n";
    echo '[' . otp_crypt( otp_crypt( $text, $otp ), $otp ) . ']';
    
    ?>

    Man kann sogar die gleiche Funktion zum ver- und entschlüsseln nehmen. Ich habe jetzt XOR als Verrechnungsoperation genommen. Natürlich geht auch ord(). Für die Wahl des OTPs ist zu beachten, dass es den Charakter von Zufallsdaten hat.


    In Punkto Geschwindigkeit definitv eine gute Alternative, aber ich kann den Sicherheitgrad noch nicht ganz einschätzen.

    Etwas sicheres wirst du nicht finden. Das besondere ist, dass dein Schlüssel genauso lang ist, wie dein Text, und jedes Zeichen in deinem OTP unabhängig von jedem anderen ist. Das heißt, selbst wenn du ein paar Zeichen erfolgreich errätst, kannst du überhaupt keine Rückschlüsse auf den Rest des Textes ziehen, selbst wenn dir unendlich Rechenkapazität zur Verfügung steht. Das ist bei anderen Verschlüsselungsverfahren nicht so, weil eine Schlüsselposition immer mehrere Teile vom Text beeinflusst.

    Außerdem hast du den Vorteil, dass du falsche Schlüssel herausgeben kannst. Es ist leicht einen Schlüssel zu berechnen, der aus einem beliebigen verschlüsselten Text eine falsche Botschaft macht. Deswegen hat man mit OTPs auch plausible deniability.
  8. wieviel rechenkapazität und zeit erfordert leicht brechen? ich kann mir kaum vorstellen das die übliche verfahren mit 1,2 rechnern und in angemessener zeit zu knacken sind. ich find das immer alles extrem, weil immer versucht wird die totale perfektion zu erreichen.

    dabei gibt es soviele andere aspeckte die ausmachen ob ein text sicher ist oder nicht, was bringt ein verfahren das einem verschlüsselten text eine lebensgewähr von >100 jahren bringt, wenn die schwachstellen an anderen punkten liegen. ich meine welcher depp verschwendet 100 jahre damit einen schlüssel zu ermitteln, wenn 100 millisekunden ausreichen um ihn zu bekommen. das ist eher ein abschreckungsmechanismus der den angreifer dazu zwingt andere wege zu suchen.

    welche anforderungen bestehen
    wenn der eigner seine daten aus der db abrufen können soll
    wenn er es von einem beliebigen punkt x tun können soll
    wie lange werden die daten gelagert
    zu welchen zeitpunkten ist die sicherheit hoch und zu welchen niedrig
    etc.

    ein schneller weniger sicherer verschlüsselungsalgorythmus könnte für deine zwecke mehr als ausreichen wenn die schwachen glieder der kette verstärkt werden.


    ps:
    ja die quantenkryptographie ist eig physik. wobei ein mechanismus ausgenutzt wird der es möglich macht zu erkennen, ob eine übertragung vor dem eintreffen beim empfänger schonmal gelesen wurde. wenn irgendjemand die nachricht abgefangen hat, sieht man es an hand der messergebnisse da dies das ergebnis vorhersehbar verfälscht. hauptsächlich gehts dabei darum einen sicheren schlüsselaustausch zu ermöglichen.

    Beitrag zuletzt geändert: 30.6.2011 17:47:31 von aero23
  9. Mal eine etwas andere Frage, aber mit gleichem Thema:
    1) Gibt es eine Möglichkeit mit PHP auf TrucCrypt Container zuzugreifen? Also es geht um direkten Zugriff, z.B. Erstellen eines Containers etc.
    Oder ist dies nur über Umwege (Shell Scripts) möglich?

    2) Gibt es bereits eine Implementierung/fertiges Script mit Public und Private Keys?
    Fände ich z.B. für Log Files interessant. Mit dem Public Key werden sie verschlüsselt und nur mit dem Private Key der bei mir zu Hause ist, kann ich auch darauf zu greifen.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!