OpenPGP_Crypt_Symmetric::decryptPacket PHP Method

decryptPacket() public static method

public static decryptPacket ( $epacket, $symmetric_algorithm, $key )
    public static function decryptPacket($epacket, $symmetric_algorithm, $key)
    {
        list($cipher, $key_bytes, $key_block_bytes) = self::getCipher($symmetric_algorithm);
        if (!$cipher) {
            return NULL;
        }
        $cipher->setKey($key);
        if ($epacket instanceof OpenPGP_IntegrityProtectedDataPacket) {
            $padAmount = $key_block_bytes - strlen($epacket->data) % $key_block_bytes;
            $data = substr($cipher->decrypt($epacket->data . str_repeat("", $padAmount)), 0, strlen($epacket->data));
            $prefix = substr($data, 0, $key_block_bytes + 2);
            $mdc = substr(substr($data, -22, 22), 2);
            $data = substr($data, $key_block_bytes + 2, -22);
            $mkMDC = hash("sha1", $prefix . $data . "Ó", true);
            if ($mkMDC !== $mdc) {
                return false;
            }
            try {
                $msg = OpenPGP_Message::parse($data);
            } catch (Exception $ex) {
                $msg = NULL;
            }
            if ($msg) {
                return $msg;
            }
            /* Otherwise keep trying */
        } else {
            // No MDC mean decrypt with resync
            $iv = substr($epacket->data, 2, $key_block_bytes);
            $edata = substr($epacket->data, $key_block_bytes + 2);
            $padAmount = $key_block_bytes - strlen($edata) % $key_block_bytes;
            $cipher->setIV($iv);
            $data = substr($cipher->decrypt($edata . str_repeat("", $padAmount)), 0, strlen($edata));
            try {
                $msg = OpenPGP_Message::parse($data);
            } catch (Exception $ex) {
                $msg = NULL;
            }
            if ($msg) {
                return $msg;
            }
            /* Otherwise keep trying */
        }
        return NULL;
        /* Failed */
    }

Usage Example

 function decrypt($packet)
 {
     if (!is_object($packet)) {
         $packet = OpenPGP_Message::parse($packet);
     }
     if ($packet instanceof OpenPGP_SecretKeyPacket || $packet instanceof Crypt_RSA || $packet instanceof ArrayAccess && $packet[0] instanceof OpenPGP_SecretKeyPacket) {
         $keys = $packet;
         $message = $this->message;
     } else {
         $keys = $this->key;
         $message = $packet;
     }
     if (!$keys || !$message) {
         return NULL;
     }
     // Missing some data
     if (!$keys instanceof Crypt_RSA) {
         $keys = new self($keys);
     }
     foreach ($message as $p) {
         if ($p instanceof OpenPGP_AsymmetricSessionKeyPacket) {
             if ($keys instanceof Crypt_RSA) {
                 $sk = self::try_decrypt_session($keys, substr($p->encyrpted_data, 2));
             } else {
                 if (strlen(str_replace('0', '', $p->keyid)) < 1) {
                     foreach ($keys->key as $k) {
                         $sk = self::try_decrypt_session(self::convert_private_key($k), substr($p->encyrpted_data, 2));
                         if ($sk) {
                             break;
                         }
                     }
                 } else {
                     $key = $keys->private_key($p->keyid);
                     $sk = self::try_decrypt_session($key, substr($p->encrypted_data, 2));
                 }
             }
             if (!$sk) {
                 continue;
             }
             $r = OpenPGP_Crypt_Symmetric::decryptPacket(OpenPGP_Crypt_Symmetric::getEncryptedData($message), $sk[0], $sk[1]);
             if ($r) {
                 return $r;
             }
         }
     }
     return NULL;
     /* Failed */
 }
All Usage Examples Of OpenPGP_Crypt_Symmetric::decryptPacket