/** * Encrypt data. * * @param string $text Plaintext. * * @return array Array of MPI values (c1, c2). */ public function encrypt($text) { $p_len = strlen($this->_key->key['p']); $length = $p_len - 11; if ($length <= 0) { return false; } $g = new Math_BigInteger($this->_key->key['g'], 256); $p = new Math_BigInteger($this->_key->key['p'], 256); $y = new Math_BigInteger($this->_key->key['y'], 256); $out = array(); foreach (str_split($text, $length) as $m) { // EME-PKCS1-v1_5 encoding $psLen = $p_len - strlen($m) - 3; $ps = ''; while (($psLen2 = strlen($ps)) != $psLen) { $tmp = crypt_random_string($psLen - $psLen2); $ps .= str_replace("", '', $tmp); } $em = new Math_BigInteger(chr(0) . chr(2) . $ps . chr(0) . $m, 256); // End EME-PKCS1-v1_5 encoding $k = Horde_Pgp_Crypt_DSA::randomNumber($p); $c1 = $g->modPow($k, $p); $c2_base = $y->modPow($k, $p)->multiply($em)->divide($p); $c2 = $c2_base[1]; $out[] = str_pad($c1->toBytes(), $p_len, chr(0), STR_PAD_LEFT); $out[] = str_pad($c2->toBytes(), $p_len, chr(0), STR_PAD_LEFT); } return $out; }
/** */ public function verify($msg, $key) { $verify = new OpenPGP_Crypt_RSA($key->message); $pkey = $verify->key(); switch ($pkey->algorithm) { case 1: case 2: case 3: // RSA return $verify->verify($msg->message); case 17: // DSA $dsa = new Horde_Pgp_Crypt_DSA($pkey); $verifier = function ($m, $s) use($dsa) { return $dsa->verify($m, Horde_String::lower($s->hash_algorithm_name()), new Math_BigInteger($s->data[0], 256), new Math_BigInteger($s->data[1], 256)); }; return $msg->message->verified_signatures(array('DSA' => array('MD5' => $verifier, 'SHA1' => $verifier, 'SHA224' => $verifier, 'SHA256' => $verifier, 'SHA384' => $verifier, 'SHA512' => $verifier))); } throw new RuntimeException(); }