key = $key; $this->iv = $iv; } // --------- النصوص ---------- private function addPadding($data, $blockSize = 16) { $pad = $blockSize - (strlen($data) % $blockSize); return $data . str_repeat(chr($pad), $pad); } private function removePadding($data) { $pad = ord($data[strlen($data) - 1]); return substr($data, 0, -$pad); } public function encryptData($plainText) { $plainText = mb_convert_encoding($plainText, 'UTF-8'); $paddedText = $this->addPadding($plainText); $iv = random_bytes(16); $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $iv); return base64_encode($iv . $encrypted); } public function decryptData($encryptedText) { $decoded = base64_decode($encryptedText, true); if ($decoded === false) { error_log("[ERROR] base64_decode failed for input: $encryptedText"); return false; } // محاولة أولى: استخراج IV عشوائي من أول 16 بايت if (strlen($decoded) >= 16) { $iv = substr($decoded, 0, 16); $payload = substr($decoded, 16); $decrypted = openssl_decrypt($payload, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $iv); if ($decrypted !== false) { $pad = ord($decrypted[strlen($decrypted) - 1]); if ($pad >= 1 && $pad <= 16) { return substr($decrypted, 0, -$pad); } } } // محاولة ثانية: IV ثابت (للبيانات القديمة) $decrypted = openssl_decrypt($decoded, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); if ($decrypted === false) { error_log("[ERROR] openssl_decrypt failed for input: $encryptedText"); return false; } $pad = ord($decrypted[strlen($decrypted) - 1]); if ($pad < 1 || $pad > 16) { error_log("[ERROR] Invalid padding value ($pad) for decrypted input: $encryptedText"); return false; } return substr($decrypted, 0, -$pad); } public function decryptFile($encryptedFilePath, $destinationPath) { if (!file_exists($encryptedFilePath)) { throw new Exception("❌ الملف المشفر غير موجود: $encryptedFilePath"); } $encryptedData = file_get_contents($encryptedFilePath); $decryptedData = openssl_decrypt($encryptedData, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); if ($decryptedData === false) { error_log("[ERROR] openssl_decrypt failed for file: $encryptedFilePath"); throw new Exception("❌ فشل فك تشفير الملف: $encryptedFilePath"); } file_put_contents($destinationPath, $decryptedData); return true; } public function encryptBinary($data) { $iv = random_bytes(16); $encrypted = openssl_encrypt($data, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $iv); return $iv . $encrypted; } public function decryptBinary($data) { if (strlen($data) >= 16) { $iv = substr($data, 0, 16); $payload = substr($data, 16); $decrypted = openssl_decrypt($payload, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $iv); if ($decrypted !== false) { return $decrypted; } } // للبيانات القديمة ذات IV الثابت $decrypted = openssl_decrypt($data, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); if ($decrypted === false) { error_log('[CRIT-07] openssl_decrypt failed in decryptBinary'); throw new Exception('Decryption failed'); } return $decrypted; } } // ✅ Load the key and IV from .env or use default values // ✅ Ensure the lengths are correct //echo "Key Length: " . $key . PHP_EOL; //echo "IV Length: " . $iv . PHP_EOL; try { $encryptionHelper = new EncryptionHelper($key, $iv); } catch (Exception $e) { error_log("[encrypt_decrypt] Initialization error: " . $e->getMessage()); } ?>