diff --git a/.DS_Store b/.DS_Store index 1249fc9b3e7895e9bfa5e65f1a0823e32e6efe3b..f86ae3df346027e1412716157f341d40d84ed122 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/libSAEDEA.nimble b/libSAEDEA.nimble index 7806509283fa5fbe992dc2c13db317eb502b92c9..c71f6211224362c6cacb204ba156e2f361d4929b 100644 --- a/libSAEDEA.nimble +++ b/libSAEDEA.nimble @@ -1,6 +1,6 @@ # Package -version = "0.9.0" +version = "0.9.4" 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" diff --git a/src/libSAEDEA/saedea.nim b/src/libSAEDEA/saedea.nim index 2f25d37bfb00619a7e20477b0339eaed63801664..adaec24d875cb669e23c0580ff85cca96739ae5c 100644 --- a/src/libSAEDEA/saedea.nim +++ b/src/libSAEDEA/saedea.nim @@ -21,11 +21,17 @@ proc gen_iv*(random_data: string): string = # # First pass of string encryption, xor the secret key and initialization vector # -proc encrypt_stage1*(secret: string, iv: string): string = +proc encrypt_stage1(secret: string, iv: string, len: int): 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)]))) + + # xor on repeated secret text and iv up to cleartext length + while i < len: + hidden_str.add(cast[char]( + cast[int32]( + secret[i mod secret.len]) xor + cast[int32]( + iv[(i mod iv.len)]))) i+=1 return hidden_str #endproc @@ -36,31 +42,68 @@ proc encrypt_stage1*(secret: string, iv: string): string = # # First pass of string decryption, xor secret,initialization vector, then cypertext and the product # -proc decrypt_stage1*(hidden: string, iv: string): string = +proc decrypt_stage1(hidden: string, iv: string, len: int): 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)]))) + + # xor on repeated ciphertext and iv up to cleartext length + while i < len: + product.add(cast[char]( + cast[int32]( + hidden[i mod hidden.len]) xor + cast[int32]( + iv[(i mod iv.len)]))) i+=1 return product #endproc +# +# encrypt(text, secret, initialization vector, text length): string +# +# Simple encryption for text, using secret and a random initialization vector +# The lenght of cleartext message is needed, this will produce an encrypted message +# following the SAEDEA paper +# +proc encrypt*(text: string, secret: string, iv: string, len: int): string = + let intermediate = encrypt_stage1(secret, iv, len) + #return encode(encrypt_stage1(text, intermediate, text.len)) + return encrypt_stage1(text, intermediate, len) +#endproc + + # # encrypt(text, secret, initialization vector): string # +# Light version # 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))) + let intermediate = encrypt_stage1(secret, iv, text.len) + #return encode(encrypt_stage1(text, intermediate, text.len)) + return encrypt_stage1(text, intermediate, intermediate.len) #endproc +# +# decrypt(hidden, secret, initialization vector, lenght of the cleartext message): string +# +# Simple decryption for ciphertext, using secret and a random initialization vector +# The original cleartext lenght is needed +# +proc decrypt*(hidden_str: string, secret: string, iv: string, len: int): string = + let intermediate = decrypt_stage1(secret, iv, len) + #return decrypt_stage1(decode(hidden_str), intermediate, len) + return decrypt_stage1(hidden_str, intermediate, len) +#endproc # # decrypt(hidden, secret, initialization vector): string # +# Light version # 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)) + let intermediate = decrypt_stage1(secret, iv, hidden_str.len) + #return decrypt_stage1(decode(hidden_str), intermediate, len) + return decrypt_stage1(hidden_str, intermediate, intermediate.len) #endproc diff --git a/tests/test1 b/tests/test1 new file mode 100755 index 0000000000000000000000000000000000000000..f2edaab11976af99a75f06cb1dddf37078c6880f Binary files /dev/null and b/tests/test1 differ diff --git a/tests/test1.nim b/tests/test1.nim index 90a07ce69999b30857d5aec82a142311333c199b..63ada14f7c559848ae5985c73dc43505197f8c1d 100644 --- a/tests/test1.nim +++ b/tests/test1.nim @@ -1,23 +1,63 @@ -# 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 times import libSAEDEA -var text = "This is a clear text message... 12 12 123 and the current time is:" & $getTime() -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 +proc cmpStrChars(s1: string, s2: string): bool = + if s1.len != s2.len: + return false + for i in 0..s1.len-1: + if s1[i] != s2[i]: + return false + return true + +let text = "This is a clear text message... ABCDEF 12 12 123 1234 12345 123456 $*[]@!%ù 🤖😱🎰🔮📿💈⚗ï¸ðŸ”🔬 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod... And the current time is:" & $getTime() +let secret = "A shared secret" +let iv = gen_iv("some random data" & $getTime()) + +var encrypted = encrypt(text, secret, iv, text.len) +var decrypted = decrypt(encrypted, secret, iv, text.len) + +var encrypted_light = encrypt(text, secret, iv) +var decrypted_light = decrypt(encrypted, secret, iv) + #echo "Secret:", secret + #echo "IV:", iv + #echo "Cleartext:", text + #echo "Decrypted:", decrypted + #echo "Encrypted:", encrypted + #echo "Decrypted_light:", decrypted_light + +echo "Matching test" +check cmpStrChars(text, decrypted) == true + +echo "Wrong secret test" +decrypted = decrypt(encrypted, "wrong secret", iv, text.len) +check cmpStrChars(text, decrypted) == false + +echo "Wrong IV test" +decrypted = decrypt(encrypted, secret, "wrong iv", text.len) +check cmpStrChars(text, decrypted) == false + +echo "Wrong length test" +decrypted = decrypt(encrypted, secret, iv, 987654) +check cmpStrChars(text, decrypted) == false + +echo "All wrong test" +decrypted = decrypt(encrypted, "wrong value", "wrong value", 123456) +check cmpStrChars(text, decrypted) == false + +echo "Matching test with light encryption" +check cmpStrChars(text, decrypted_light) == true + +echo "Wrong secret test with light encryption" +decrypted_light = decrypt(encrypted, "wrong secret", iv) +check cmpStrChars(text, decrypted_light) == false + +echo "Wrong IV test with light encryption" +decrypted_light = decrypt(encrypted, secret, "wrong iv") +check cmpStrChars(text, decrypted_light) == false + +echo "All wrong test with light encryption" +decrypted_light = decrypt(encrypted, "wrong secret", "wrong iv") +check cmpStrChars(text, decrypted_light) == false