========================================================================

  SEA1m5 (2011-09-04)

 (Simple Encryption Algorithm with MD5-Based Chained Hash Function)

========================================================================

+++ ATTENTION +++ ATTENTION +++ ATTENTION +++

Please take a look on the Successor of the Encryption Algorithm ==> SEA1xm5!


I will describe how to use an Linear Congruential Generator for cryptographic Purpose - symmetric Encryption. This is an improved Version of my former Idea of an Encyrption Algorithm named VSPOTP (Vigenere Seeded Pseudo-One-Time-Pad Cipher)

A Demo of the Encryption Algorithm (SEA1m5) 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. The Lisiting of some important Functions from the JavaScript-SourceCode can be found here or  (Download the Source as ZIP-File)


# Basic Principle

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

1) A modified use of a regular Linear Congruential Generator (mLCG) feeding now with one Seed (X) 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. (MD5CHF)

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 (Values 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 (Values 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 (Values 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 (Values 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  or  (Download the Source as ZIP-File)

Cheers,
Karl-Uwe




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

 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

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