public byte[] resetObjectReference(Reference objectReference, boolean isRc4) {

        // Step 1: separate object and generation numbers for objectReference
        int objectNumber = objectReference.getObjectNumber();
        int generationNumber = objectReference.getGenerationNumber();

        // Step 2:
        // v > 1 n is the value of Length divided by 8.
        int n = 5;
        if (encryptionDictionary.getVersion() > 1) {
            n = encryptionDictionary.getKeyLength() / 8;//enencryptionKey.length;
        }
        // extend the original n-byte encryption key to n + 5 bytes

        int paddingLength = 5;
        if (!isRc4) {
            paddingLength += 4;
        }

        byte[] step2Bytes = new byte[n + paddingLength];

        // make the copy
        System.arraycopy(encryptionKey, 0, step2Bytes, 0, n);

        // appending the low-order 3 bytes of the object number
        step2Bytes[n] = (byte) (objectNumber & 0xff);
        step2Bytes[n + 1] = (byte) (objectNumber >> 8 & 0xff);
        step2Bytes[n + 2] = (byte) (objectNumber >> 16 & 0xff);
        // appending low-order 2 bytes of the generation number low-order
        step2Bytes[n + 3] = (byte) (generationNumber & 0xff);
        step2Bytes[n + 4] = (byte) (generationNumber >> 8 & 0xff);

        // if using AES algorithm extend by four bytes "sAIT" (0x73, 0x41, 0x6c, 0x54)
        if (!isRc4) {
            step2Bytes[n + 5] = AES_sAIT[0];
            step2Bytes[n + 6] = AES_sAIT[1];
            step2Bytes[n + 7] = AES_sAIT[2];
            step2Bytes[n + 8] = AES_sAIT[3];
        }

        // Step 3: Initialize the MD5 hash function and pass in step2Bytes
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException builtin) {
        }
        // and pass in padded password from step 1
        md5.update(step2Bytes);

        // finally return the modified object reference
        return md5.digest();
    }