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