3v4l.org

run code in 500+ PHP versions simultaneously
<?php class CTFCodec { private string $key; // ----------------------------------------------------- // Constructeur : on dérive la clé en SHA256 (32 octets) // ----------------------------------------------------- public function __construct(string $key) { $this->key = hash("sha256", $key, true); } // ----------------------------------------------------- // Rotation gauche sur 8 bits // ----------------------------------------------------- private function rotl(int $b, int $n): int { return (($b << $n) & 0xFF) | ($b >> (8 - $n)); } // ----------------------------------------------------- // Rotation droite sur 8 bits // ----------------------------------------------------- private function rotr(int $b, int $n): int { return (($b >> $n) | ($b << (8 - $n))) & 0xFF; } // ----------------------------------------------------- // Masque pseudo-aléatoire dépendant clé + seed + index // ----------------------------------------------------- private function mask(int $i, int $seed): int { $h = hash("sha256", $this->key . chr($seed) . pack("N", $i), true); return ord($h[$i % 32]); } // ----------------------------------------------------- // Layer 1 : XOR + rotations // ----------------------------------------------------- private function L1E(string $data, int $seed): string { $out = ""; foreach (str_split($data) as $i => $c) { $b = ord($c); $b = $this->rotl($b, ($i + $seed) % 7); $b ^= $this->mask($i, $seed); $b = $this->rotr($b, ($seed + $i) % 5); $out .= chr($b); } return $out; } private function L1D(string $data, int $seed): string { $out = ""; foreach (str_split($data) as $i => $c) { $b = ord($c); $b = $this->rotl($b, ($seed + $i) % 5); $b ^= $this->mask($i, $seed); $b = $this->rotr($b, ($i + $seed) % 7); $out .= chr($b); } return $out; } // ----------------------------------------------------- // Layer 2 : shuffle pseudo-chaotique (inversible) // ----------------------------------------------------- private function L2E(string $data, int $seed): string { $a = str_split($data); $n = count($a); for ($i = 0; $i < $n; $i++) { $j = ($this->mask($i, $seed) + $seed) % $n; [$a[$i], $a[$j]] = [$a[$j], $a[$i]]; } return implode("", $a); } private function L2D(string $data, int $seed): string { $a = str_split($data); $n = count($a); for ($i = $n - 1; $i >= 0; $i--) { $j = ($this->mask($i, $seed) + $seed) % $n; [$a[$i], $a[$j]] = [$a[$j], $a[$i]]; } return implode("", $a); } // ----------------------------------------------------- // Encodage final : Base64URL stable // ----------------------------------------------------- private function b64u_encode(string $d): string { return rtrim(strtr(base64_encode($d), "+/", "-_"), "="); } private function b64u_decode(string $d): string { $pad = 4 - (strlen($d) % 4); if ($pad < 4) $d .= str_repeat("=", $pad); return base64_decode(strtr($d, "-_", "+/")); } // ----------------------------------------------------- // ENCODE // ----------------------------------------------------- public function encode(string $msg): string { $seed = random_int(0, 255); // seed mutation $msg = $this->L1E($msg, $seed); $msg = $this->L2E($msg, $seed); $msg = $this->b64u_encode($msg); return sprintf("%02X", $seed) . "." . $msg; } // ----------------------------------------------------- // DECODE // ----------------------------------------------------- public function decode(string $cipher): string { list($hex, $data) = explode(".", $cipher, 2); $seed = hexdec($hex); $data = $this->b64u_decode($data); $data = $this->L2D($data, $seed); $data = $this->L1D($data, $seed); return $data; } } /*********************************************** * TEST * ***********************************************/ $codec = new CTFCodec(""); $input = ""; $enc = $codec->encode($input); $dec = $codec->decode($enc); echo "Original : $input\n"; echo "Encodé : $enc\n"; echo "Décodé : $dec\n"; ?>
Output for 8.5.3
Original : Encodé : 9C. Décodé :
Output for 8.5.2
Original : Encodé : 51. Décodé :
Output for 8.5.1
Original : Encodé : E6. Décodé :
Output for 8.3.14, 8.5.0
Original : Encodé : E1. Décodé :
Output for 8.4.18
Original : Encodé : 2D. Décodé :
Output for 8.4.17
Original : Encodé : 3E. Décodé :
Output for 8.4.16
Original : Encodé : 44. Décodé :
Output for 8.4.6, 8.4.15
Original : Encodé : 17. Décodé :
Output for 8.4.14
Original : Encodé : D4. Décodé :
Output for 8.4.13
Original : Encodé : 03. Décodé :
Output for 8.4.12
Original : Encodé : 72. Décodé :
Output for 8.4.11
Original : Encodé : 5F. Décodé :
Output for 8.4.10
Original : Encodé : B0. Décodé :
Output for 8.4.9
Original : Encodé : 02. Décodé :
Output for 8.4.8
Original : Encodé : E9. Décodé :
Output for 8.4.7
Original : Encodé : 04. Décodé :
Output for 8.4.5
Original : Encodé : DF. Décodé :
Output for 8.4.4
Original : Encodé : 74. Décodé :
Output for 8.4.3
Original : Encodé : C3. Décodé :
Output for 8.4.2
Original : Encodé : DA. Décodé :
Output for 8.4.1
Original : Encodé : 79. Décodé :
Output for 8.3.30
Original : Encodé : 29. Décodé :
Output for 8.3.29
Original : Encodé : 6C. Décodé :
Output for 8.3.28
Original : Encodé : 78. Décodé :
Output for 8.3.27
Original : Encodé : 4F. Décodé :
Output for 8.3.6, 8.3.26
Original : Encodé : F1. Décodé :
Output for 8.3.25
Original : Encodé : 1D. Décodé :
Output for 8.3.24
Original : Encodé : D5. Décodé :
Output for 8.3.23
Original : Encodé : 09. Décodé :
Output for 8.3.22
Original : Encodé : 8D. Décodé :
Output for 8.3.20 - 8.3.21
Original : Encodé : E0. Décodé :
Output for 8.3.19
Original : Encodé : C1. Décodé :
Output for 8.3.18
Original : Encodé : 1E. Décodé :
Output for 8.3.17
Original : Encodé : AA. Décodé :
Output for 8.3.16
Original : Encodé : 18. Décodé :
Output for 8.3.12, 8.3.15
Original : Encodé : 76. Décodé :
Output for 8.3.13
Original : Encodé : 96. Décodé :
Output for 8.3.11
Original : Encodé : 23. Décodé :
Output for 8.3.10
Original : Encodé : 1C. Décodé :
Output for 8.3.9
Original : Encodé : 87. Décodé :
Output for 8.3.8
Original : Encodé : B7. Décodé :
Output for 8.3.7
Original : Encodé : EA. Décodé :
Output for 8.3.5
Original : Encodé : B1. Décodé :
Output for 8.3.4
Original : Encodé : 8B. Décodé :
Output for 8.3.3
Original : Encodé : 70. Décodé :
Output for 8.3.2
Original : Encodé : EE. Décodé :
Output for 8.3.1
Original : Encodé : 47. Décodé :
Output for 8.3.0
Original : Encodé : 19. Décodé :

preferences:
45.31 ms | 703 KiB | 4 Q