94 lines
1.8 KiB
PHP
94 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace Stratum;
|
|
|
|
final class String_Encryption {
|
|
|
|
private $cipher = 'aes-256-ctr';
|
|
private $salt;
|
|
private $passphrase;
|
|
|
|
public function __construct() {
|
|
$this->salt = $this->get_salt();
|
|
$this->passphrase = $this->get_passphrase();
|
|
}
|
|
|
|
public function encrypt( $string_to_encrypt ) {
|
|
|
|
if ( empty( $string_to_encrypt ) ) {
|
|
return $string_to_encrypt;
|
|
}
|
|
|
|
if ( ! $this->can_encrypt() ) {
|
|
return $string_to_encrypt;
|
|
}
|
|
|
|
$ivlen = openssl_cipher_iv_length( $this->cipher );
|
|
$iv = openssl_random_pseudo_bytes( $ivlen );
|
|
|
|
$encrypted_string = openssl_encrypt(
|
|
$string_to_encrypt . $this->salt,
|
|
$this->cipher,
|
|
$this->passphrase,
|
|
0,
|
|
$iv
|
|
);
|
|
|
|
return base64_encode( $iv . $encrypted_string );
|
|
}
|
|
|
|
public function decrypt( $string_to_decrypt ) {
|
|
|
|
if ( ! $this->can_encrypt() ) {
|
|
return $string_to_decrypt;
|
|
}
|
|
|
|
$encrypted_string = base64_decode( $string_to_decrypt, true );
|
|
|
|
$ivlen = openssl_cipher_iv_length( $this->cipher );
|
|
$iv = substr( $encrypted_string, 0, $ivlen );
|
|
|
|
$encrypted_string = substr( $encrypted_string, $ivlen );
|
|
|
|
$decrypted_string = openssl_decrypt(
|
|
$encrypted_string,
|
|
$this->cipher,
|
|
$this->passphrase,
|
|
0,
|
|
$iv
|
|
);
|
|
|
|
if ( ! $decrypted_string || substr( $decrypted_string, -strlen( $this->salt ) ) !== $this->salt ) {
|
|
return $string_to_decrypt;
|
|
}
|
|
|
|
return substr( $decrypted_string, 0, -strlen( $this->salt ) );
|
|
}
|
|
|
|
private function can_encrypt() {
|
|
|
|
if ( ! function_exists( 'openssl_encrypt' ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( ! in_array( $this->cipher, openssl_get_cipher_methods() ) ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private function get_passphrase() {
|
|
|
|
if ( function_exists( 'wp_salt' ) && wp_salt() ) {
|
|
return wp_salt();
|
|
}
|
|
|
|
return 'stratum_non_secret_passphrase';
|
|
}
|
|
|
|
private function get_salt() {
|
|
return 'stratum_non_secret_salt';
|
|
}
|
|
}
|