Frage

Ich brauche mittlere bis starke Verschlüsselung auf server, so dass ich dachte, ich mcrypt mit PHP verwenden würde. Wenn ich die Funktionen unter dem Anfang meiner ursprünglichen Zeichenfolge abwechselnd in binären Müll nach der Entschlüsselung verwenden. (Dies ist nicht das übliche Problem der beigefügten immer zusätzlicher Müll, anstatt meine Zeichenfolge geändert .) Nach der Dokumentation, mcrypt_encrypt () sollte gepolstert genug Zeichen haben die passen Blockgröße des ausgewählten Algorithmus, aber ich vermute, dass es nicht funktioniert.

Wenn jedoch I pad es manuell auf die Blockgröße von 128 Bit (16 Byte) von Rijndael, ist es auch nicht. Die einzige Art, wie ich diese Arbeit bekommen kann, ist durch eine Schnur vorangestellt wird lange genug, um (wahrscheinlich) deckt den garbaged Block und fügen Sie einen bekannten Präfix wie „DATA #“ zwischen diesem String und meinen Daten. Nach der Entschlüsselung dieses Block teilweise verstümmelt wurde, aber mein Präfix und alle Daten danach korrekt entschlüsselt wurde.

$GLOBALS['encryptionmarker'] = 'DATA#';

function encrypt($plain, $key) {
    /*
    // workaround because beginning of decrypted string is being mangled
    // so we simply prefix with some text plus marker
    $prefix = str_pad('', 128, '#', STR_PAD_RIGHT).$GLOBALS['encryptionmarker'];
    $plain = $prefix.$plain;
    */

    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plain, MCRYPT_MODE_CFB,
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
        MCRYPT_DEV_URANDOM));

    return $encrypted;
}

function decrypt($encrypted, $key) {
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB,
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
        MCRYPT_DEV_URANDOM));

    /*
    // workaround: remove garbage
    $pos = strpos($decrypted, $GLOBALS['encryptionmarker']);
    $decrypted = trim(substr($decrypted, $pos + strlen($GLOBALS['encryptionmarker'])));
    */

    return $decrypted;
}

Was ist falsch mit meinen Funktionen? Warum muss ich meine Daten wie das Präfix (halte ich es für ein schmutziges Problem zu umgehen, so dass ich es beheben möchte)?

, um die verschlüsselten Daten zu speichern ist nicht das Problem; Entschlüsseln Sie es sofort nach der Verschlüsselung ohne es an eine Datenbank führt zu den gleichen Fehler zu speichern.

War es hilfreich?

Lösung

Ihr Problem ist, dass Sie eine neue, andere, zufällige IV auf der Empfangsseite erzeugen. Das funktioniert nicht, wie Sie gesehen haben.

Der Empfänger muss die IV wissen, dass der Absender verwendet wird; so haben Sie es schicken zusammen mit den verschlüsselten Daten und gibt sie an mcrypt_decrypt().

Beachten Sie, dass Sie auch mhash() mit einem Schlüssel (ein anderer Schlüssel zu dem Verschlüsselungsschlüssel) zu erzeugen, einen HMAC über die Nachricht verwenden müssen, und überprüfen Sie es auf der Empfangsseite. Wenn Sie dies nicht tun, ein Mann-in-the-middle kann triviale Teile Ihrer Nachricht ändern, ohne dass Sie es erkennen.

Andere Tipps

Verwenden Sie die gleiche IV in Ver- und Entschlüsselung. Die IV ist kein gemeinsames Geheimnis, hat aber geteilt werden. Sie können konsultieren Wikipedia: IV

$IV = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
      MCRYPT_DEV_URANDOM));

Die IV muss einmal übertragen werden. Möglicherweise möchten Sie für jedes Paket den Wert von IV erhöhen. Aber dies kann auf beiden Seiten unabhängig erfolgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top