<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 21740 -->
<!-- Reviewed: no -->
<sect2 id="zend.filter.set.decrypt">
    <title>Decrypt</title>

    <para>
        Dieser Filter verschlüsselt beliebige Strings mit den angegebenen Einstellungen. Hierfür
        verwendet er Adapter. Aktuell gibt es Adapter für die <classname>Mcrypt</classname> und
        <classname>OpenSSL</classname> Erweiterungen von <acronym>PHP</acronym>.
    </para>

    <para>
        Für Details darüber wie man Inhalte verschlüsselt siehe den <classname>Encrypt</classname>
        Filter. Da die Grundlegenden Dinge beim <classname>Encrypt</classname> Filter behandelt
        werden, beschreiben wir hier nur mehr die zusätzlichen Methoden und Änderungen für die
        Entschlüsselung.
    </para>

    <sect3 id="zend.filter.set.decrypt.mcrypt">
        <title>Entschlüsselung mit Mcrypt</title>

        <para>
            Für die Entschlüsselung von Inhalten die vorher mit <classname>Mcrypt</classname>
            verschlüsselt wurden muß man die Optionen wissen mit denen die Verschlüsselung
            aufgerufen wurde.
        </para>

        <para>
            Es gibt einen wichtigen Unterschied. Wenn man bei der Verschlüsselung keinen Vektor
            angegeben hat, muß man Ihn nach der Verschlüsselung des Inhalts holen indem die
            <methodname>getVector()</methodname> Methode am Verschlüsselungs-Filter aufgerufen
            wird. Ohne den richtigen Vektor ist man nicht in der Lage den Inhalt zu entschlüsseln.
        </para>

        <para>
            Sobald man alle Optionen angegeben hat ist die Entschlüsselung so einfach wie die
            Verschlüsselung.
        </para>

        <programlisting language="php"><![CDATA[
// Verwende die Standardmäßigen Blowfish Einstellungen
$filter = new Zend_Filter_Decrypt('myencryptionkey');

// Setze den Vektor mit dem der Inhalt verschlüsselt wurde
$filter->setVector('myvector');

$decrypted = $filter->filter('encoded_text_normally_unreadable');
print $decrypted;
]]></programlisting>

        <note>
            <para>
                Man sollte beachten das man eine Ausnahme erhält wenn die Mcrypt Erweiterung in der
                eigenen Umgebung nicht vorhanden ist.
            </para>
        </note>

        <note>
            <para>
                Man sollte ausserdem beachten das alle Einstellungen geprüft werden wenn man die
                Instanz erstellt oder wenn man <methodname>setEncryption()</methodname> aufruft.
                Wenn Mcrypt ein Problem mit den Einstellungen erkennt wird eine Ausnahme geworfen.
            </para>
        </note>
    </sect3>

    <sect3 id="zend.filter.set.decrypt.openssl">
        <title>Entschlüsselung mit OpenSSL</title>

        <para>
            Entschlüsselung mit <classname>OpenSSL</classname> ist so einfach die Verschlüsseln.
            Aber man benötigt alle Daten von der Person die den Inhalt verschlüsselt hat.
        </para>

        <para>
            Für die Entschlüsselung mit <classname>OpenSSL</classname> benötigt man:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>private</emphasis>: Den eigenen privaten Schlüssel der für die
                    Entschlüsselung des Inhalts verwendet wird. Der private Schlüssel kann ein
                    Dateiname mit einem Pfad zur Schlüsseldatei sein, oder einfach der Inhalt der
                    Schlüsseldatei selbst.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>envelope</emphasis>: Der verschlüsselte Umschlagschlüssel vom Benutzer
                    der den Inhalt verschlüsselt hat. Man kann entweder den Pfad mit dem Dateinamen
                    zur Schlüsseldatei angeben, oder den Inhalt der Schlüsseldatei selbst. Wenn die
                    <property>package</property> Option gesetzt wurde, kann man diesen Parameter
                    unterdrücken.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>package</emphasis>: Ob der Umschlagschlüssel mit dem verschlüsselten
                    Wert gepackt werden soll. Der Standardwert ist <constant>FALSE</constant>.
                </para>
            </listitem>
        </itemizedlist>

        <programlisting language="php"><![CDATA[
// Verwende openssl und gib einen privaten Schlüssel an
$filter = new Zend_Filter_Decrypt(array(
    'adapter' => 'openssl',
    'private' => '/path/to/mykey/private.pem'
));

// natürlich kann man den Umschlagschlüssel auch bei der Instanziierung angeben
$filter->setEnvelopeKey(array(
    '/key/from/encoder/first.pem',
    '/key/from/encoder/second.pem'
));
]]></programlisting>

        <note>
            <para>
                Beachte das der <classname>OpenSSL</classname> Adapter nicht funktionieren wird wenn
                man keine gültigen Schlüssel angibt.
            </para>
        </note>

        <para>
            Optional könnte es notwendig sein die Passphrase für die Entschlüsselung der Schlüssel
            selbst anzugeben indem die <methodname>setPassphrase()</methodname> Methode verwendet
            wird.
        </para>

        <programlisting language="php"><![CDATA[
// Verwende openssl und gib einen privaten Schlüssel an
$filter = new Zend_Filter_Decrypt(array(
    'adapter' => 'openssl',
    'private' => '/path/to/mykey/private.pem'
));

// natürlich kann man den Umschlagschlüssel auch bei der Instanziierung angeben
$filter->setEnvelopeKey(array(
    '/key/from/encoder/first.pem',
    '/key/from/encoder/second.pem'
));
$filter->setPassphrase('mypassphrase');
]]></programlisting>

        <para>
            Zum Schluß kann der Inhalt entschlüsselt werden. Unser komplettes Beispiel für den
            vorher verschlüsselten Inhat sieht nun wie folgt aus.
        </para>

        <programlisting language="php"><![CDATA[
// Verwende openssl und gib einen privaten Schlüssel an
$filter = new Zend_Filter_Decrypt(array(
    'adapter' => 'openssl',
    'private' => '/path/to/mykey/private.pem'
));

// natürlich kann man den Umschlagschlüssel auch bei der Instanziierung angeben
$filter->setEnvelopeKey(array(
    '/key/from/encoder/first.pem',
    '/key/from/encoder/second.pem'
));
$filter->setPassphrase('mypassphrase');

$decrypted = $filter->filter('encoded_text_normally_unreadable');
print $decrypted;
]]></programlisting>
    </sect3>
</sect2>
