code: private static function getProduct($X, $Y)
      {
          $R = pack('H*', 'E1').str_pad('', 15, "\0");
          $Z = str_pad('', 16, "\0");
          $V = $Y;
  
          $parts = str_split($X, 4);
          $x = sprintf('%032b%032b%032b%032b', self::toUInt32Bits($parts[0]), self::toUInt32Bits($parts[1]), self::toUInt32Bits($parts[2]), self::toUInt32Bits($parts[3]));
          $lsb_mask = "\1";
          for ($i = 0; $i < 128; $i++) {
              if ($x[$i]) {
                  $Z = self::getBitXor($Z, $V);
              }
              $lsb_8 = mb_substr($V, -1, null, '8bit');
              if (ord($lsb_8 & $lsb_mask)) {
                  $V = self::getBitXor(self::shiftStringToRight($V), $R);
              } else {
                  $V = self::shiftStringToRight($V);
              }
          }
  
          return $Z;
      }
docs: @param $X
  @param $Y
  
  @return string