I have constructed a stream cipher from a secure hash algorithm and a HMAC. Here is a brief description of the algorithm:

Let: (Actually Objective-C styled pseudo code)

* `[data SHA512Hash]`: SHA-512 hash of `data`,
* `[data SHA512HMAC:key]`: SHA-512 HMAC of `data` with `key`,
* `[data xor:another]`: bitwise XOR of two `data` and `another` which have the same length,
* `[data bytesTo:index]`: first `index` bytes of `data`,
* `[data removeFirstBytes:count]`: remove first `count` bytes from `data`,
* `[data length]`: length of `data`.
* `[data concat:other]`: Concatenate `other` after `data`.
* `[Data new]`: allocate an empty buffer.

Pseudocode: (Or actual Objective-C code?)

    Data IV = [key SHA512];
    Data segKey = IV;

    Data dest = [Data new]; // This will be the output

    do {
        // Cut off hash-sized chunks of source data
        Data segment = [data bytesTo:[IV length]];
        [data removeFirstBytes:[IV length]];

        // Derive a new segment key
        segKey = [segKey SHA512HMAC:IV];

        // XOR
        [dest concat:[segment xor:segKey]];
    } while ([data length] > 0)

This code seem to decipher itself when given the same key.