. * */ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); use phpseclib\Exception\FileNotFoundException; /** * Class CryptPKI para el manejo de las funciones para PKI * * @package SP */ class CryptPKI { /** * @throws SPException */ public function __construct() { if (!file_exists($this->getPublicKeyFile()) || !file_exists($this->getPrivateKeyFile())) { if (!$this->createKeys()) { throw new SPException(SPException::SP_CRITICAL, _('No es posible generar las claves RSA')); } } } /** * Devuelve la ruta al archivo de la clave pública * * @return string */ private function getPublicKeyFile() { return Init::$SERVERROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'pubkey.pem'; } /** * Devuelve la ruta al archivo de la clave privada * * @return string */ private function getPrivateKeyFile() { return Init::$SERVERROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'key.pem'; } /** * Crea el par de claves pública y privada */ public function createKeys() { $Rsa = new \phpseclib\Crypt\RSA(); $keys = $Rsa->createKey(1024); $priv = file_put_contents($this->getPrivateKeyFile(), $keys['privatekey']); $pub = file_put_contents($this->getPublicKeyFile(), $keys['publickey']); chmod($this->getPrivateKeyFile(), 0600); return ($priv && $pub); } /** * Encriptar datos con la clave pública * * @param string $data los datos a encriptar * @return string */ public function encryptRSA($data) { $Rsa = new \phpseclib\Crypt\RSA(); $Rsa->setEncryptionMode(\phpseclib\Crypt\RSA::ENCRYPTION_PKCS1); $Rsa->loadKey($this->getPublicKey()); return $Rsa->encrypt($data); } /** * Devuelve la clave pública desde el archivo * * @return string */ public function getPublicKey() { $file = $this->getPublicKeyFile(); if (!file_exists($file)) { throw new FileNotFoundException(_('El archivo de clave no existe')); } return file_get_contents($file); } /** * Desencriptar datos cifrados con la clave pública * * @param string $data los datos a desencriptar * @return string */ public function decryptRSA($data) { $Rsa = new \phpseclib\Crypt\RSA(); $Rsa->setEncryptionMode(\phpseclib\Crypt\RSA::ENCRYPTION_PKCS1); $Rsa->loadKey($this->getPrivateKey()); return $Rsa->decrypt($data); } /** * Devuelve la clave privada desde el archivo * * @return string */ private function getPrivateKey() { $file = $this->getPrivateKeyFile(); if (!file_exists($file)) { throw new FileNotFoundException(_('El archivo de clave no existe')); } return file_get_contents($file); } }