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 ofdata
,[data SHA512HMAC:key]
: SHA-512 HMAC ofdata
withkey
,[data xor:another]
: bitwise XOR of twodata
andanother
which have the same length,[data bytesTo:index]
: firstindex
bytes ofdata
,[data removeFirstBytes:count]
: remove firstcount
bytes fromdata
,[data length]
: length ofdata
.[data concat:other]
: Concatenateother
afterdata
.[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.