function encryptAES128CTR($data, $key, $nonce = "") { $blocks = str_split($data, 16); $counter = unpack('V4', $nonce); foreach ($blocks as &$block) { $block ^= _encryptAES128ECB(pack('V4', $counter[1], $counter[2], $counter[3], $counter[4]), $key); // Because we don't have unsigned 64 bit numbers in PHP... $counter[3] = ($carry = $counter[3] + 1) & 0xffffffff; $counter[4] = ($carry >> 32) + $counter[4] & 0xffffffff; } return implode($blocks); }
function encryptAES128ECB($data, $key) { $blocks = str_split($data, 16); $numBlocks = count($blocks); if (strlen($blocks[$numBlocks - 1]) === 16) { $blocks[] = addPKCS7Padding('', 16); } else { $blocks[$numBlocks - 1] = addPKCS7Padding($blocks[$numBlocks - 1], 16); } foreach ($blocks as &$block) { $block = _encryptAES128ECB($block, $key); } return implode($blocks); }