code: public byte[] createInitVector(long timestamp, long serverId) {
      byte[] initVector = new byte[INITV_SIZE];
      ByteBuffer byteBuffer = ByteBuffer.wrap(initVector);
      byteBuffer.putLong(INITV_TIMESTAMP_OFFSET, timestamp);
      byteBuffer.putLong(INITV_SERVERID_OFFSET, serverId);
      return initVector;
    }
docs: Creates the initialization vector from component {@code (timestamp, serverId)} fields.
  This is the format used by DoubleClick, and it's a good format generally,
  even though the initialization vector can be any random data (a cryptographic nonce).
  
  <p>NOTE: Follow the advice from
  https://developers.google.com/ad-exchange/rtb/response-guide/decrypt-price#detecting_stale
  by using a high-resolution timestamp; also if the {@code serverId} is not necessary, providing
  a random value there helps further to prevent replay attacks. In all methods that have
  a {@code initVector} parameter, passing null will cause {@code (current time, random)}
  to be used (so if you really want all-zeros {@code initVector}, e.g. in unit tests to make
  results reproducible, pass a zero-filled array).
  
  @param timestamp Timestamp subfield. Notice this is not supposed to be a millis/nanos value
  like in common Java API; it should be: seconds-since-epoch in the upper 32bits,
  microseconds in the lower 32 bits
  @param serverId Server ID subfield (whatever a server uses as a public ID, e.g. its IPv4)
  @return initialization vector