In association with heise online

The H

General discussion about the site and its contents

  • Forums
  • > The H
  • > (SEA1m5) How to use an Linear Congruential Generator for cryptographic Purpose

(SEA1m5) How to use an Linear Congruential Generator for cryptographic Purpose 06 September 2011 01:27

=====================================================================
#
# SEA1m5 (2011-09-04)
#
# (Simple Encryption Algorithm with MD5-Based Chained Hash Function)
#
=====================================================================

I will describe how to use an Linear Congruential Generator for
cryptographic Purpose - symmetric Encryption. 

A complete usable Encryption Algorithm as a Sample in JavaScript is
currently available, some other Programms for Data-Encryption will
follow soon, all of them including the Source-Code. A more detailed
Documentation will also follow, for now the JavaScript-Source-Code
contains a lot of Comments and Explanation on how the Algorithm
works. I suppose the best Way to find out is by giving it a Try.

'# Basic Principle'

The main Functions of the Encryption Algorithm consisting in the
following parts

1) A modified use of a regular Linear Congruential Generator (mLCG)
feeding now with one Seed and 3 every-time changing Values for the
Constants (A, C, M) for every single Encryption, instead of normally
using one Seed and three fixed Constants. Long-term Test of the
modified LCG (mLCG) showing a very resonable discrete Uniform
Distribution of random Numbers.

Similar to:
* http://en.wikipedia.org/wiki/Linear_congruential_generator

2) A simple Hash-Function using MD5-Checksums which are re-hashed
over several Rounds as a Key stretching Function. 

Similar to:
* http://en.wikipedia.org/wiki/Key_strengthening

3) A Password-Based Random Initialisation Vector Function (PRND_IV)
used to create the 4 IV (X, A, C, M) for the modified LCG (mLCG),
which are in fact nearly similar to "Numbers used once". This
function (PRND_IV) will generate the 4 IV (X, A, C, M) out of a
random ASCII-String and the Password. Both represented by re-hashed
MD5-Checksum‘s (MD5CHF) which are XOR enciphered, than split up in
Numbers of certain length to initialise the Values X, A, C and M for
the modified LCG (mLCG).

4) The random String, from which the 4 IV (X, A, C, M) are derived,
will be XOR encrypted with the salted Password and placed in Front of
every encrypted Message. This way we can secretly submit all 4 IV (X,
A, C, M) for the modified LCG (mLCG) and the Message can be
deciphered, if the receiver has Knowledge of the Password.

###

'# Encipher Steps (short Description)' 
(** Please find the corresponding Number in the JavaScript-Listing.)

(** e1) 
//
Generate a random ASCII-String, build it's MD5-Checksum and pick some
Values of it as Password-Salt

(** e2)
//
Generate a random ASCII-String as the Basis for the Password-Based
Random Initialisation Vector Function. (PRND_IV)

(** e3)
//
Derive the 4 IV (Values X, A, C, M) from this random ASCII-String
using the Password-Based Random Initialisation Vector Function
(PRND_IV). This will put the modified LCG (mLCG) into it‘s internal
State for creating the Key-Stream.

(** e4)
//
XOR Encipher the HEX-String of Random-IV with the MD5-based Chained
Hash (MD5CHF) of the salted Password. The Result will be the
Secret-IV.

(** e5)
//
Prepare the Message-Header containing a Marker for the used Version
of the Encryption Algorithm, the Value for the MD5-Based Chained Hash
Rounds, the HEX-Value of the Password-Salt and finally the HEX-Value
of the Secret-IV.

(** e6)
//
Perform the XOR-Encryption of the Data-Stream with the Key-Stream
using the formerly under (** e3) created 4 IV (Values X, A, C, M)
with the modified LCG (mLCG) until the End of the Data-Stream has
been reached.

(** e7)
//
In this JavaScript-Implementation, as we Encipher just a Text, the
Message-Header will be placed in Front of the enciphered Message.
When using the Encryption Algorithm on binary Data or a
Communication-Stream the Message-Header of course needs to be written
or send before the actual enciphered Data.

###

'# Decipher Steps (short Description)'

(** Please find the corresponding Number in the JavaScript-Listing.)

(** d1)
//
Check if the enciphered Message has the correct Version, extract the
Value for the MD5-Based Chained Hash Rounds and the HEX-Value of the
Password-Salt.

(** d2)
//
XOR Decipher the HEX-String of the Secret-IV from the Beginning of
the enciphered Message, using the MD5-based Chained Hash (MD5CHF) of
the salted Password. The Result will be the Random-IV from which the
4 IV (Values X, A, C, M) will be derived.

(** d3)
//
Now re-generate the 4 IV (Values for X, A, C, M) out of the Random-IV
using a Password-Based Random Initialisation Vector Function
(PRND_IV). This will put the modified LCG (mLCG) into it's internal
State for creating the Key-Stream for Deciphering the Data-Stream.

(** d4)
//
Perform the XOR-Decryption of the Cipher-Stream with the Key-Stream
using the formerly under (** d3) re-created 4 IV (Values X, A, C, M)
with the modified LCG (mLCG) until the End of the Cipher-Stream has
been reached and regain the Data-Stream.

###

A full functional Example of the Encryption Algorithm including
Source-Code in JavaScript is available here

http://freecx.co.uk/SEA1m5/SEA1m5_v1.0__utf8.html

Cheers, 
Karl-Uwe

karl.frank [a T] freecx.co.uk

//###################################################################
//
// Copyright (c) 2011, Karl-Uwe Frank 
//
// This Software and it's Encryption Algorithm (SEA1m5) is released
// under the Non-Profit Open Software License 3.0 (NPOSL-3.0)
// http://www.opensource.org/licenses/NOSL3.0
//
// This Code and the Encryption Algorithm (SEA1m5) can be used freely
// for all personal, academic or non-commercial Purposes. 
//
// For commercial Purposes please contact karl.frank[a T]freecx.co.uk
//
//###################################################################