# Is my method symmetric encryption?

To obfuscate data I made up this method on the spot without planning since the goal wasn't real encryption.

At first I though this cannot be real encryption but after revisiting the code and reading on block symmetric encryption, and including R in the method, it seems that it is( looks like a stream cypher, OFB specifically ).

The method is the following( pseudo code ):

-Hash function parameters, secret key, hash and array elements all have the same size in bits.
-Size is at least 128 bits for this example.
-Using a cryptographic random generator.

H - cryptographic hash function
K - secret key, randomly generated
A - array of plaintext
L - array length
R - randomly generated, is not encrypted and is stored with the resulting encrypted data

keyhash = H(K)
hash = R
for( i , i < L , i++ )
{
hash = H( hash ^ keyhash )
A[i] ^= hash
}


Could this be called encryption or it has some fundamental flaws that would break it immediately?

• Don't you mean $C_i = A_i \oplus h$? Otherwise you don't have ciphertext ;) – Maarten Bodewes Jan 7 '15 at 0:10
• Of course, ^ is XOR in Java as well, but above you've only defined the plaintext. Now it's also the ciphertext after the operation. – Maarten Bodewes Jan 8 '15 at 16:56

Your scheme is indeed an instance of output feedback mode (OFB), using $$(\mathit{key},\mathit{pad}) \mapsto H(\mathit{key}\oplus\mathit{pad})\text,$$ where $\mathit{key}$ corresponds to keyhash and $\mathit{pad}$ to hash, as the "block cipher". (It is very likely not really a block cipher due to lack of bijectivity, but that's not needed for output feedback mode.) When $H$ is a cryptographically secure hash function, the construction should have the same security properties as OFB using a "real" block cipher; however, since hash functions are usually slower than block ciphers, one generally prefers to use the latter.