@Override
  public byte readByte() {
    if (!isOpen()) {
      return -1;
    }

    if (filename == null && count > maxCount) {
      open = false;
      return -1;
    }

    if (outAlgoBufferIx == outAlgoBuffer.length) {
      algo.encrypt_block(inputAlgoBuffer, outAlgoBuffer);
      for (outAlgoBufferIx = 0; outAlgoBufferIx < inputAlgoBuffer.length; outAlgoBufferIx++) {
        inputAlgoBuffer[outAlgoBufferIx] = outAlgoBuffer[outAlgoBufferIx];
      }
      outAlgoBufferIx = 0;
    }

    byte prng = outAlgoBuffer[outAlgoBufferIx++];

    if (filename == null) {
      count++;
      return prng;
    }

    /*
     * we have a real filename to encrypt
     */
    byte data = super.readByte();
    return (byte) (prng ^ data);
  }