Below you can find a short description of a fast cipher algorithm based

on a secure hash function, in this case on md5.

The algorithm has a huge internal state, which might prevent it from a

use on FPGA, but in software it's quite easy to implement.

It make use of fast, reliable, existing secure hash and key derivation

functions, which are already part of any good OS.

It is fast, easy to memorise, easy to understand and should minimise any

implementation error.

The keystream output can be 128 bit, 256 bit, 384 bit or any other

desired bit size by simply changing the hash function from md5 to

sha256 for example.

Below some obligatory test results (of course *NO* indication about the

security of the algorithm).

A full functional quick and dirty Python source code hack can be found

here http://www.freecx.co.uk/HBSC/HBSC_md5_STDIO.py

Cheers,

Karl-Uwe

Code:HBSC (Hash Based Stream Cipher) =============================== aH[] 256 * 128 Bit Array of Hash Values counter 32 or 64 Bit integer value seq_idx 1 Byte sequential index pointer rnd_idx 1 Byte pseudo-random index pointer KDF_Rounds PBKDF2 Iteration Count dkLen Derived Key Length in Byte Keystream 128 Bit Return Value from PRGA || Concatenating Strings KSA (Key Schedule Algorithm) aH[0] = PBKDF2_md5(Keyword, IV, KDF_Rounds, dkLen) for i=1 to 255 aH[i] = HMAC_md5(Keyword, IV || aH[i-1]) next PRGA (Pseudo Random Generation Algorithm) counter = counter +1 seq_idx = seq_idx +1 mod256 rnd_idx = first Byte of aH[seq_idx] Keystream = md5(aH[seq_idx] || md5(aH[rnd_idx] || counter)) aH[seq_idx] = md5(aH[seq_idx] || aH[rnd_idx]) return Keystream

#################################################

dd if=/dev/zero bs=1024 count=10240 | pypy HBSC_md5_STDIO.py 13a775db820bac43e01fe6557ccbe3cd 7d0ef66789aca2cfa6c76db7560554 | ./ent

Entropy = 7.999983 bits per byte.

Optimum compression would reduce the size

of this 10485760 byte file by 0 percent.

Chi square distribution for 10485760 samples is 253.99, and randomly

would exceed this value 50.60 percent of the times.

Arithmetic mean value of data bytes is 127.5144 (127.5 = random).

Monte Carlo value for Pi is 3.140358406 (error 0.04 percent).

Serial correlation coefficient is 0.000004 (totally uncorrelated = 0.0).

dd if=/dev/zero bs=1024 count=10240 | pypy HBSC_md5_STDIO.py 7d0ef66789aca2cfa6c76db7560554 358b4eff55cfe21051d2f03afaeccb19 | ./ent

Entropy = 7.999983 bits per byte.

Optimum compression would reduce the size

of this 10485760 byte file by 0 percent.

Chi square distribution for 10485760 samples is 248.71, and randomly

would exceed this value 59.93 percent of the times.

Arithmetic mean value of data bytes is 127.4999 (127.5 = random).

Monte Carlo value for Pi is 3.143381936 (error 0.06 percent).

Serial correlation coefficient is -0.000163 (totally uncorrelated = 0.0).

dd if=/dev/zero bs=1024 count=102400 | pypy HBSC_md5_STDIO.py 13a775db820bac43e01fe6557ccbe3cd 7d0ef66789aca2cfa6c76db7560554 | ./ent

102400+0 records in

102400+0 records out

104857600 bytes transferred in 118.016843 secs (888497 bytes/sec)

Entropy = 7.999998 bits per byte.

Optimum compression would reduce the size

of this 104857600 byte file by 0 percent.

Chi square distribution for 104857600 samples is 280.42, and randomly

would exceed this value 13.15 percent of the times.

Arithmetic mean value of data bytes is 127.5111 (127.5 = random).

Monte Carlo value for Pi is 3.141039854 (error 0.02 percent).

Serial correlation coefficient is 0.000131 (totally uncorrelated = 0.0).

EDIT: "i" against "KDF_Rounds" at the KSA description

Tweet This+ 1 thisPost To Linkedin