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 hkey = [key SHA512]; // Hash to make lengths match.
Data segKey = [IV SHA512];
Data dest = [Data new]; // This will be the output
Data last = (Some constant)
do {
// Cut off hash-sized chunks of source data
Data segment = [data bytesTo:[hkey length]];
[data removeFirstBytes:[hkey length]];
// Derive a new segment key
segKey = [segKey SHA512HMAC:hkey]; // or [segKey SHA512HMAC:[hkey concat:last]]? If so, how to decrypt?
// XOR
last = [segment xor:[segKey bytesTo:[segment length]]] // Truncates to make length match
dest = [dest concat:last];
} while ([data length] > 0)
From some other questions I am suggested that this is SHA-512 HMAC running in OFB mode but what about the change in the code comment?
This code seem to decipher itself when given the same key.
EDIT Here is this cipher implemented in Objective-C: https://github.com/xcvista/CGIKit/blob/master/MSBooster/MSBooster/NSData%2BMSTrivialCryptography.m (Free software, 2-clause BSD license.)