code: private static function getGCTR($K, $key_length, $ICB, $X)
      {
          if (empty($X)) {
              return '';
          }
  
          $n = (int) ceil(self::getLength($X) / 128);
          $CB = [];
          $Y = [];
          $CB[1] = $ICB;
          for ($i = 2; $i <= $n; $i++) {
              $CB[$i] = self::getInc(32, $CB[$i - 1]);
          }
          $mode = 'aes-'.($key_length).'-ecb';
          for ($i = 1; $i < $n; $i++) {
              $C = openssl_encrypt($CB[$i], $mode, $K, OPENSSL_NO_PADDING | OPENSSL_RAW_DATA);
              $Y[$i] = self::getBitXor(mb_substr($X, ($i - 1) * 16, 16, '8bit'), $C);
          }
  
          $Xn = mb_substr($X, ($n - 1) * 16, null, '8bit');
          $C = openssl_encrypt($CB[$n], $mode, $K, OPENSSL_NO_PADDING | OPENSSL_RAW_DATA);
          $Y[$n] = self::getBitXor($Xn, self::getMSB(self::getLength($Xn), $C));
  
          return implode('', $Y);
      }
docs: @param string $K
  @param int    $key_length
  @param string $ICB
  @param string $X
  
  @return string