<?php
class EncryptorClass
{
protected static $public_key;
protected static $private_key;
const KEYS_DIR = __DIR__ . '/dir/dir/dir/keys';
const KEY_PASSPHRASE = 'bla-bla-bla';
const MAX_DATA_LENGTH = 128;
const DECRYPT_CHUNK_SIZE = 256;
public static function encode($data)
{
}
$encrypted = null;
// разбитие больших данных на куски
if (strlen($data) > self::MAX_DATA_LENGTH) { $data = str_split($data, self::MAX_DATA_LENGTH); } else {
$data = [$data];
}
$encrypt_result = true;
foreach ($data as $chunk) {
if ($encrypt_result === false) {
break;
}
$encrypted .= $encrypted_chunk;
}
if ($encrypt_result) {
} else {
$errors = [];
$errors[] = $error;
}
$message = 'Не удалось зашифровать данные. ' . implode(" \n", $errors); error_log($message . "\n data: " . JSON
::encode($data)); throw new \Exception($message);
}
return $encrypted;
}
public static function decode(string $data, bool $jsonDecode = false)
{
/** @see https://s...content-available-to-author-only...p.net/manual/en/function.base64-decode.php#102113 */
if ($encrypted === false) {
$encrypted = $data;
}
$errors = [];
$decrypted = null;
// попытка разблокировать данные как просто зашифрованную строку
// разбитие для расшифровки длинных зашифрованных строк
$decrypted = null;
$encrypted = str_split($encrypted, self::DECRYPT_CHUNK_SIZE); foreach ($encrypted as $chunk) {
$decrypt_result = '';
$decrypted .= $decrypt_result;
} else {
$errors[] = $error;
}
$message = 'Не удалось расшифровать данные. ' . implode(" \n", $errors); error_log($message . "\n data: " . JSON
::encode($data)); throw new \Exception($message);
}
}
}
if ($jsonDecode && is_string($decrypted) && JSON
::isValid($decrypted)) { $decrypted = JSON::decode($decrypted);
}
return $decrypted;
}
/**
* Ключи RSA сгенерированы командами с заданием пароля self::KEY_PASSPHRASE:
* openssl genrsa -des3 -out private_rsa.pem 2048
* openssl rsa -in private_rsa.pem -outform PEM -pubout -out public_rsa.pem
*/
public function __construct()
{
$public_key_path = realpath(self::KEYS_DIR . '/public_rsa.pem'); $private_key_path = realpath(self::KEYS_DIR . '/private_rsa.pem');
}
}
PD9waHAKCmNsYXNzIEVuY3J5cHRvckNsYXNzCnsKICAgIHByb3RlY3RlZCBzdGF0aWMgJHB1YmxpY19rZXk7CiAgICBwcm90ZWN0ZWQgc3RhdGljICRwcml2YXRlX2tleTsKCiAgICBjb25zdCBLRVlTX0RJUiA9IF9fRElSX18gLiAnL2Rpci9kaXIvZGlyL2tleXMnOwogICAgY29uc3QgS0VZX1BBU1NQSFJBU0UgPSAnYmxhLWJsYS1ibGEnOwoKICAgIGNvbnN0IE1BWF9EQVRBX0xFTkdUSCA9IDEyODsKICAgIGNvbnN0IERFQ1JZUFRfQ0hVTktfU0laRSA9IDI1NjsKCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kZSgkZGF0YSkKICAgIHsKICAgICAgICBpZiAoaXNfbnVtZXJpYygkZGF0YSkgPT09IGZhbHNlICYmIGlzX3N0cmluZygkZGF0YSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRkYXRhID0ganNvbl9lbmNvZGUoJGRhdGEpOwogICAgICAgIH0KCiAgICAgICAgJGVuY3J5cHRlZCA9IG51bGw7CgogICAgICAgIC8vINGA0LDQt9Cx0LjRgtC40LUg0LHQvtC70YzRiNC40YUg0LTQsNC90L3Ri9GFINC90LAg0LrRg9GB0LrQuAogICAgICAgIGlmIChzdHJsZW4oJGRhdGEpID4gc2VsZjo6TUFYX0RBVEFfTEVOR1RIKSB7CiAgICAgICAgICAgICRkYXRhID0gc3RyX3NwbGl0KCRkYXRhLCBzZWxmOjpNQVhfREFUQV9MRU5HVEgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkYXRhID0gWyRkYXRhXTsKICAgICAgICB9CiAgICAgICAgJGVuY3J5cHRfcmVzdWx0ID0gdHJ1ZTsKICAgICAgICBmb3JlYWNoICgkZGF0YSBhcyAkY2h1bmspIHsKICAgICAgICAgICAgJGVuY3J5cHRfcmVzdWx0ID0gb3BlbnNzbF9wdWJsaWNfZW5jcnlwdCgkY2h1bmssICRlbmNyeXB0ZWRfY2h1bmssIHNlbGY6OiRwdWJsaWNfa2V5KTsKICAgICAgICAgICAgaWYgKCRlbmNyeXB0X3Jlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZW5jcnlwdGVkIC49ICRlbmNyeXB0ZWRfY2h1bms7CiAgICAgICAgfQogICAgICAgIGlmICgkZW5jcnlwdF9yZXN1bHQpIHsKICAgICAgICAgICAgJGVuY3J5cHRlZCA9IGJhc2U2NF9lbmNvZGUoJGVuY3J5cHRlZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGVycm9ycyA9IFtdOwogICAgICAgICAgICB3aGlsZSgkZXJyb3IgPSBvcGVuc3NsX2Vycm9yX3N0cmluZygpKSB7CiAgICAgICAgICAgICAgICAkZXJyb3JzW10gPSAkZXJyb3I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtZXNzYWdlID0gJ9Cd0LUg0YPQtNCw0LvQvtGB0Ywg0LfQsNGI0LjRhNGA0L7QstCw0YLRjCDQtNCw0L3QvdGL0LUuICcgLiBpbXBsb2RlKCIgXG4iLCAkZXJyb3JzKTsKICAgICAgICAgICAgZXJyb3JfbG9nKCRtZXNzYWdlIC4gIlxuIGRhdGE6ICIgLiBKU09OOjplbmNvZGUoJGRhdGEpKTsKICAgICAgICAgICAgdGhyb3cgbmV3IFxFeGNlcHRpb24oJG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRlbmNyeXB0ZWQ7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWNvZGUoc3RyaW5nICRkYXRhLCBib29sICRqc29uRGVjb2RlID0gZmFsc2UpCiAgICB7CiAgICAgICAgLyoqIEBzZWUgaHR0cHM6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5wLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uYmFzZTY0LWRlY29kZS5waHAjMTAyMTEzICovCiAgICAgICAgJGVuY3J5cHRlZCA9IGJhc2U2NF9kZWNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnKycsICRkYXRhKSk7CgogICAgICAgIGlmICgkZW5jcnlwdGVkID09PSBmYWxzZSkgewogICAgICAgICAgICAkZW5jcnlwdGVkID0gJGRhdGE7CiAgICAgICAgfQoKICAgICAgICAkZXJyb3JzID0gW107CiAgICAgICAgJGRlY3J5cHRlZCA9IG51bGw7CgogICAgICAgIC8vINC/0L7Qv9GL0YLQutCwINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0LTQsNC90L3Ri9C1INC60LDQuiDQv9GA0L7RgdGC0L4g0LfQsNGI0LjRhNGA0L7QstCw0L3QvdGD0Y4g0YHRgtGA0L7QutGDCiAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9kZWNyeXB0KCRlbmNyeXB0ZWQsICRkZWNyeXB0ZWQsIG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZShzZWxmOjokcHJpdmF0ZV9rZXksIHNlbGY6OktFWV9QQVNTUEhSQVNFKSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIC8vINGA0LDQt9Cx0LjRgtC40LUg0LTQu9GPINGA0LDRgdGI0LjRhNGA0L7QstC60Lgg0LTQu9C40L3QvdGL0YUg0LfQsNGI0LjRhNGA0L7QstCw0L3QvdGL0YUg0YHRgtGA0L7QugogICAgICAgICAgICAkZGVjcnlwdGVkID0gbnVsbDsKICAgICAgICAgICAgJGVuY3J5cHRlZCA9IHN0cl9zcGxpdCgkZW5jcnlwdGVkLCBzZWxmOjpERUNSWVBUX0NIVU5LX1NJWkUpOwogICAgICAgICAgICBmb3JlYWNoICgkZW5jcnlwdGVkIGFzICRjaHVuaykgewogICAgICAgICAgICAgICAgJGRlY3J5cHRfcmVzdWx0ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAob3BlbnNzbF9wcml2YXRlX2RlY3J5cHQoJGNodW5rLCAkZGVjcnlwdF9yZXN1bHQsIG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZShzZWxmOjokcHJpdmF0ZV9rZXksIHNlbGY6OktFWV9QQVNTUEhSQVNFKSkpIHsKICAgICAgICAgICAgICAgICAgICAkZGVjcnlwdGVkIC49ICRkZWNyeXB0X3Jlc3VsdDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUoJGVycm9yID0gb3BlbnNzbF9lcnJvcl9zdHJpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JzW10gPSAkZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICfQndC1INGD0LTQsNC70L7RgdGMINGA0LDRgdGI0LjRhNGA0L7QstCw0YLRjCDQtNCw0L3QvdGL0LUuICcgLiBpbXBsb2RlKCIgXG4iLCAkZXJyb3JzKTsKICAgICAgICAgICAgICAgICAgICBlcnJvcl9sb2coJG1lc3NhZ2UgLiAiXG4gZGF0YTogIiAuIEpTT046OmVuY29kZSgkZGF0YSkpOwogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBcRXhjZXB0aW9uKCRtZXNzYWdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRqc29uRGVjb2RlICYmIGlzX3N0cmluZygkZGVjcnlwdGVkKSAmJiBKU09OOjppc1ZhbGlkKCRkZWNyeXB0ZWQpKSB7CiAgICAgICAgICAgICRkZWNyeXB0ZWQgPSBKU09OOjpkZWNvZGUoJGRlY3J5cHRlZCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGRlY3J5cHRlZDsKICAgIH0KCiAgICAvKioKICAgICAqINCa0LvRjtGH0LggUlNBINGB0LPQtdC90LXRgNC40YDQvtCy0LDQvdGLINC60L7QvNCw0L3QtNCw0LzQuCDRgSDQt9Cw0LTQsNC90LjQtdC8INC/0LDRgNC+0LvRjyBzZWxmOjpLRVlfUEFTU1BIUkFTRToKICAgICAqIG9wZW5zc2wgZ2VucnNhIC1kZXMzIC1vdXQgcHJpdmF0ZV9yc2EucGVtIDIwNDgKICAgICAqIG9wZW5zc2wgcnNhIC1pbiBwcml2YXRlX3JzYS5wZW0gLW91dGZvcm0gUEVNIC1wdWJvdXQgLW91dCBwdWJsaWNfcnNhLnBlbQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICRwdWJsaWNfa2V5X3BhdGggPSByZWFscGF0aChzZWxmOjpLRVlTX0RJUiAuICcvcHVibGljX3JzYS5wZW0nKTsKICAgICAgICAkcHJpdmF0ZV9rZXlfcGF0aCA9IHJlYWxwYXRoKHNlbGY6OktFWVNfRElSIC4gJy9wcml2YXRlX3JzYS5wZW0nKTsKCiAgICAgICAgc2VsZjo6JHB1YmxpY19rZXkgPSBmaWxlX2dldF9jb250ZW50cygkcHVibGljX2tleV9wYXRoKTsKICAgICAgICBzZWxmOjokcHJpdmF0ZV9rZXkgPSBmaWxlX2dldF9jb250ZW50cygkcHJpdmF0ZV9rZXlfcGF0aCk7CiAgICB9Cn0=