diff --git a/libSAEDEA.nimble b/libSAEDEA.nimble new file mode 100644 index 0000000000000000000000000000000000000000..7806509283fa5fbe992dc2c13db317eb502b92c9 --- /dev/null +++ b/libSAEDEA.nimble @@ -0,0 +1,12 @@ +# Package + +version = "0.9.0" +author = "m33" +description = "Library implementing a variation of Simple And Efficient Data Encryption Algorithm (INTERNATIONAL JOURNAL OF SCIENTIFIC & TECHNOLOGY RESEARCH VOLUME 8, ISSUE 12, DECEMBER 2019 ISSN 2277-8616)" +license = "MIT" +srcDir = "src" +binDir = "bin" + +# Dependencies + +requires "nim >= 1.4.4" diff --git a/src/libSAEDEA.nim b/src/libSAEDEA.nim new file mode 100644 index 0000000000000000000000000000000000000000..db6e1602972cc82d3acb374528e62057b52f8083 --- /dev/null +++ b/src/libSAEDEA.nim @@ -0,0 +1,2 @@ +import libSAEDEA/saedea +export saedea diff --git a/src/libSAEDEA/saedea.nim b/src/libSAEDEA/saedea.nim new file mode 100644 index 0000000000000000000000000000000000000000..4aa3a890146df6e85fab5c887805bf027f6847d5 --- /dev/null +++ b/src/libSAEDEA/saedea.nim @@ -0,0 +1,65 @@ +import random +import oids +import base64 + +# +# gen_iv(random_data): string +# +# Generate random data as for the initialization vector +# Will be stronger when provided "true" random_data +# +proc gen_iv*(random_data: string): string = + var iv = encode($genoid() & random_data) + var randomizer = initRand(hash(genOid())) + randomizer.shuffle(iv) + return iv +#endproc + +# +# encrypt_stage1(secret, iv): string +# +# First pass of string encryption, xor the secret key and initialization vector +# +proc encrypt_stage1*(secret: string, iv: string): string = + var hidden_str: string + var i = 0 + while i < secret.len: + hidden_str.add(cast[char](cast[int32](secret[i]) xor cast[int32](iv[(i mod iv.len)]))) + i+=1 + return hidden_str +#endproc + + +# +# decrypt_stage1(secret, iv): string +# +# First pass of string decryption, xor secret,initialization vector, then cypertext and the product +# +proc decrypt_stage1*(hidden: string, iv: string): string = + var product: string + var i = 0 + while i < hidden.len: + product.add(cast[char](cast[int32](hidden[i]) xor cast[int32](iv[(i mod iv.len)]))) + i+=1 + return product +#endproc + + +# +# encrypt(text, secret, initialization vector): string +# +# Simple encryption for text, using secret and a random initialization vector +# +proc encrypt*(text: string, secret: string, iv: string): string = + return encode(encrypt_stage1(text, encrypt_stage1(secret, iv))) +#endproc + + +# +# decrypt(hidden, secret, initialization vector): string +# +# Simple decryption for ciphertext, using secret and a random initialization vector +# +proc decrypt*(hidden_str: string, secret: string, iv: string): string = + return decrypt_stage1(decode(hidden_str), decrypt_stage1(secret, iv)) +#endproc diff --git a/tests/config.nims b/tests/config.nims new file mode 100644 index 0000000000000000000000000000000000000000..9619f01646b39ecccbfee43b5e67eec46120fd78 --- /dev/null +++ b/tests/config.nims @@ -0,0 +1,2 @@ +switch("path", "$projectDir/../src") +switch("-d:release") diff --git a/tests/test1.nim b/tests/test1.nim new file mode 100644 index 0000000000000000000000000000000000000000..261c94638ea2bf4cb860d3e67c93ac0a1e48dedb --- /dev/null +++ b/tests/test1.nim @@ -0,0 +1,22 @@ +# This is just an example to get you started. You may wish to put all of your +# tests into a single file, or separate them into multiple `test1`, `test2` +# etc. files (better names are recommended, just make sure the name starts with +# the letter 't'). +# +# To run these tests, simply execute `nimble test`. + +import unittest +import strutils +import libSAEDEA + +var text = "This is a clear text message... 12 12 123" +var secret = "shared secret" +var iv = gen_iv("true random data") +var encrypted = encrypt(text, secret, iv) +var decrypted = decrypt(encrypted, secret, iv) +echo "Secret:", secret +echo "IV:", iv +echo "Cleartext:", text +echo "Decrypted:", decrypted +echo "Encrypted:", encrypted +check count(text, decrypted, false) == 1