<?php namespace Juju\Data; require_once('encryption.class.php'); class SecureString implements \JsonSerializable { private $data = ''; private $password; private $iv; private $encryption; private function __construct(string $data){ $tries = 0; $methods = Encryption::methods(); do{ $method = $methods[random_int(0, count($methods) - 1)]; try{ $this->encryption = Encryption::from($method); $ivlen = $this->encryption->iv_len(); $this->password = openssl_random_pseudo_bytes($ivlen); $this->iv = openssl_random_pseudo_bytes($ivlen); $this->data = $this->encryption->encrypt($data, $this->password, $this->iv); }catch(\Exception $e){} if(++$tries == count($methods)){ throw new \Exception("Too many failed attempts to encrypt data"); } // If for some reason the data we encrypted will not decrypt, try again until it will }while($data != (string)$this); } public function __toString(){ try{ return ''.$this->encryption->decrypt($this->data, $this->password, $this->iv); }catch(\Exception $e){ return ''; } } public function jsonSerialize(){ return "{$this}"; } public static function from(string $data){ return new self($data); } } ?>