code: public AESCipher setKey(byte[] key, byte[] iv)
      {
          SecretKey secretKey  = Utils.createSecretKeySpec(key, getAlgorithm(), 16);
          IvParameterSpec spec = null;
  
          if (iv != null)
          {
              spec = Utils.createIvParameterSpec(iv, 16);
          }
  
          return setKey(secretKey, spec);
      }
docs: Set cipher initialization parameters. Other {@code setKey}
  method variants call this method.
  
  <p>
  This method constructs a {@link SecretKey} instance and an
  {@link IvParameterSpec} instance from the arguments,
  and then calls {@link #setKey(SecretKey, IvParameterSpec)}.
  </p>
  
  @param key
  Secret key. If {@code null} is given, {@code new byte[16]}
  is used. If not {@code null} and the length is less than 16,
  a byte array of size 16 is allocated and the content of
  {@code key} is copied to the newly allocated byte array,
  and the resultant byte array is used. Even if the length is
  greater than 16, only the first 16 bytes are used to construct
  a {@code SecretKey} instance.
  
  @param iv
  Initial vector. If {@code null} is given, {@code null}
  is used, meaning that {@code IvParameterSepc} argument
  passed to {@link #setKey(SecretKey, IvParameterSpec)} is
  {@code null}. In that case, you will want to obtain the
  auto-generated initial vector by calling {@link #getCipher()
  getCipher()}{@code .}{@link javax.crypto.Cipher#getIV()
  getIV()} in order to decrypt the encrypted data.
  
  <p>
  If {@code iv} is not {@code null} and the length is less
  than 16, a byte array of size 16 is allocated and the content
  of {@code iv} is copied to the newly allocated byte array,
  and the resultant byte array is used. Even if the length is
  greater than 16, only the first 16 bytes are used to construct
  an {@code IvParameterSpec} instance.
  </p>
  
  @return
  {@code this} object.