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);
}