From 63dade979eb1d6974476b5465967e9b65b3fd66a Mon Sep 17 00:00:00 2001 From: Alexadner Date: Mon, 29 Nov 2021 22:22:21 +0300 Subject: [PATCH 1/7] Added Vernam cipher implementation and tests --- lib/aaa_crypt/vernam.rb | 1 + test/vernam_test.rb | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 lib/aaa_crypt/vernam.rb create mode 100644 test/vernam_test.rb diff --git a/lib/aaa_crypt/vernam.rb b/lib/aaa_crypt/vernam.rb new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/aaa_crypt/vernam.rb @@ -0,0 +1 @@ + diff --git a/test/vernam_test.rb b/test/vernam_test.rb new file mode 100644 index 0000000..b1b6187 --- /dev/null +++ b/test/vernam_test.rb @@ -0,0 +1,15 @@ +require 'minitest/autorun' + +class VernamTest < Minitest::Test + def setup + # Do nothing + end + + def teardown + # Do nothing + end + + def test + skip 'Not implemented' + end +end \ No newline at end of file From c6415a29c0dfab5d63b16e805e6b6c93386bc676 Mon Sep 17 00:00:00 2001 From: Alexadner Date: Mon, 29 Nov 2021 22:29:57 +0300 Subject: [PATCH 2/7] Moved vernam.rb to other directory --- lib/aaa_crypt/vernam.rb | 22 ++++++++++++++++++++++ test/encryption/vernam_test.rb | 11 +++++++++++ test/vernam_test.rb | 15 --------------- 3 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 test/encryption/vernam_test.rb delete mode 100644 test/vernam_test.rb diff --git a/lib/aaa_crypt/vernam.rb b/lib/aaa_crypt/vernam.rb index 8b13789..e9238b0 100644 --- a/lib/aaa_crypt/vernam.rb +++ b/lib/aaa_crypt/vernam.rb @@ -1 +1,23 @@ +module AaaCrypt + module Vernam + def self.encrypt(word, code) + encoded_word = '' + index = 0 + word.split('').map do |s| + encoded_word += (s.ord ^ code[index].ord).chr + index += 1 + end + encoded_word + end + + def self.decrypt(encoded_word, code) + decoded_word = '' + index = 0 + encoded_word.split('').map do |s| + decoded_word += (s.ord ^ code[index].ord).chr + index += 1 + end + end + end +end diff --git a/test/encryption/vernam_test.rb b/test/encryption/vernam_test.rb new file mode 100644 index 0000000..de58526 --- /dev/null +++ b/test/encryption/vernam_test.rb @@ -0,0 +1,11 @@ +require 'minitest/autorun' +require_relative "../test_helper" + +class VernamTest < Minitest::Test + include AaaCrypt + include AaaCrypt::Vernam + + def test_vernam_encrypt_a + assert_equal("C",Vernam.encrypt("A","C")) + end +end \ No newline at end of file diff --git a/test/vernam_test.rb b/test/vernam_test.rb deleted file mode 100644 index b1b6187..0000000 --- a/test/vernam_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'minitest/autorun' - -class VernamTest < Minitest::Test - def setup - # Do nothing - end - - def teardown - # Do nothing - end - - def test - skip 'Not implemented' - end -end \ No newline at end of file From 9becffb13533663e01790ed2b785280583d3fdea Mon Sep 17 00:00:00 2001 From: Alexadner Date: Mon, 29 Nov 2021 23:35:22 +0300 Subject: [PATCH 3/7] Added alphabet and restructured method according to it --- lib/aaa_crypt/vernam.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/aaa_crypt/vernam.rb b/lib/aaa_crypt/vernam.rb index e9238b0..392af33 100644 --- a/lib/aaa_crypt/vernam.rb +++ b/lib/aaa_crypt/vernam.rb @@ -1,11 +1,12 @@ module AaaCrypt module Vernam + ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?:;.,(){}[]" def self.encrypt(word, code) encoded_word = '' index = 0 word.split('').map do |s| - encoded_word += (s.ord ^ code[index].ord).chr + encoded_word += ALPHABET[ALPHABET.index(s) ^ ALPHABET.index(code[index])] index += 1 end encoded_word @@ -15,9 +16,10 @@ def self.decrypt(encoded_word, code) decoded_word = '' index = 0 encoded_word.split('').map do |s| - decoded_word += (s.ord ^ code[index].ord).chr + decoded_word += ALPHABET[ALPHABET.index(s) ^ ALPHABET.index(code[index])] index += 1 end + decoded_word end end end From 30a4992894593f315c76dcbe24a8fc94860ce5c7 Mon Sep 17 00:00:00 2001 From: Alexadner Date: Tue, 30 Nov 2021 20:31:36 +0300 Subject: [PATCH 4/7] Changed vernam cypher implementation and added tests for it --- lib/aaa_crypt.rb | 1 + lib/aaa_crypt/vernam.rb | 8 ++++++-- test/encryption/vernam_test.rb | 12 ++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/aaa_crypt.rb b/lib/aaa_crypt.rb index 397ec1c..b303846 100644 --- a/lib/aaa_crypt.rb +++ b/lib/aaa_crypt.rb @@ -6,6 +6,7 @@ require_relative 'cesar/cesar' require_relative 'visener/visener' require_relative 'aaa_crypt/rot13' +require_relative 'aaa_crypt/vernam' module AaaCrypt diff --git a/lib/aaa_crypt/vernam.rb b/lib/aaa_crypt/vernam.rb index 392af33..7fd67a2 100644 --- a/lib/aaa_crypt/vernam.rb +++ b/lib/aaa_crypt/vernam.rb @@ -3,20 +3,24 @@ module Vernam ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?:;.,(){}[]" def self.encrypt(word, code) + raise Error if word.length > code.length + encoded_word = '' index = 0 word.split('').map do |s| - encoded_word += ALPHABET[ALPHABET.index(s) ^ ALPHABET.index(code[index])] + encoded_word += ALPHABET[(ALPHABET.index(s) + ALPHABET.index(code[index])) % 48] index += 1 end encoded_word end def self.decrypt(encoded_word, code) + raise Error if encoded_word.length > code.length + decoded_word = '' index = 0 encoded_word.split('').map do |s| - decoded_word += ALPHABET[ALPHABET.index(s) ^ ALPHABET.index(code[index])] + decoded_word += ALPHABET[(ALPHABET.index(s) - ALPHABET.index(code[index])) % 48] index += 1 end decoded_word diff --git a/test/encryption/vernam_test.rb b/test/encryption/vernam_test.rb index de58526..aa6471d 100644 --- a/test/encryption/vernam_test.rb +++ b/test/encryption/vernam_test.rb @@ -8,4 +8,16 @@ class VernamTest < Minitest::Test def test_vernam_encrypt_a assert_equal("C",Vernam.encrypt("A","C")) end + + def test_vernam_decrypt_a + assert_equal("A",Vernam.decrypt("C","C")) + end + + def test_vernam_encrypt_hw + assert_equal("61N{BFX84T",Vernam.encrypt("HELLOWORLD","ZXC795JRTQ")) + end + + def test_vernam_decrypt_hw + assert_equal("HELLOWORLD",Vernam.decrypt("61N{BFX84T","ZXC795JRTQ")) + end end \ No newline at end of file From c0ed419dbfce225ff4abeb3589a07575cd052e0d Mon Sep 17 00:00:00 2001 From: Alexadner Date: Tue, 30 Nov 2021 21:48:19 +0300 Subject: [PATCH 5/7] Changed variable names in vernam.rb, added tests for vernam_test.rb --- lib/aaa_crypt/vernam.rb | 24 ++++++++++++------------ test/encryption/vernam_test.rb | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/aaa_crypt/vernam.rb b/lib/aaa_crypt/vernam.rb index 7fd67a2..3b4f0b3 100644 --- a/lib/aaa_crypt/vernam.rb +++ b/lib/aaa_crypt/vernam.rb @@ -2,28 +2,28 @@ module AaaCrypt module Vernam ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?:;.,(){}[]" - def self.encrypt(word, code) - raise Error if word.length > code.length + def self.encrypt(word, key) + raise Error if word.length > key.length - encoded_word = '' + encrypted_word = '' index = 0 - word.split('').map do |s| - encoded_word += ALPHABET[(ALPHABET.index(s) + ALPHABET.index(code[index])) % 48] + word.upcase.split('').map do |s| + encrypted_word += ALPHABET[(ALPHABET.index(s) + ALPHABET.index(key[index].upcase)) % 48] index += 1 end - encoded_word + encrypted_word end - def self.decrypt(encoded_word, code) - raise Error if encoded_word.length > code.length + def self.decrypt(encrypted_word, code) + raise Error if encrypted_word.length > code.length - decoded_word = '' + decrypted_word = '' index = 0 - encoded_word.split('').map do |s| - decoded_word += ALPHABET[(ALPHABET.index(s) - ALPHABET.index(code[index])) % 48] + encrypted_word.upcase.split('').map do |s| + decrypted_word += ALPHABET[(ALPHABET.index(s) - ALPHABET.index(code[index].upcase)) % 48] index += 1 end - decoded_word + decrypted_word end end end diff --git a/test/encryption/vernam_test.rb b/test/encryption/vernam_test.rb index aa6471d..81fef09 100644 --- a/test/encryption/vernam_test.rb +++ b/test/encryption/vernam_test.rb @@ -20,4 +20,18 @@ def test_vernam_encrypt_hw def test_vernam_decrypt_hw assert_equal("HELLOWORLD",Vernam.decrypt("61N{BFX84T","ZXC795JRTQ")) end + + def test_vernam_encrypt_hw_mixed_case + assert_equal("61N{BFX84T",Vernam.encrypt("HeLlOwORlD","Zxc795jRtQ")) + end + + def test_vernam_decrypt_hw_mixed_case + assert_equal("HELLOWORLD",Vernam.decrypt("61n{Bfx84T","Zxc795jRtQ")) + end + + def test_vernam_word_longer_than_key + assert_raises Error do + Vernam.encrypt("HELLOWORLD","ZXC795JRT") + end + end end \ No newline at end of file From d8688274246b1092d08719b445b603a514d18bba Mon Sep 17 00:00:00 2001 From: Alexadner Date: Tue, 30 Nov 2021 21:51:56 +0300 Subject: [PATCH 6/7] Added example of usage of Vernam cipher algorithm --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index fde25e3..89ab9f5 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,10 @@ decryptrot13 = Rot13::decrypt("uryy? }?.yqb") #"hello world!" #Binary encrypt Binary::encrypt("hello world") # "1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100 100001" + +#Vernam encrypt +Vernam::encrypt("HELLOWORLD","ZXC795JRTQ")#"61N{BFX84T" +Vernam.decrypt("61N{BFX84T","ZXC795JRTQ")#"HELLOWORLD" ``` ## Development From c5c8a0c9d22a2a46f8194009cb08facedfdb9059 Mon Sep 17 00:00:00 2001 From: aareshetnikov <95224269+aareshetnikov@users.noreply.github.com> Date: Tue, 30 Nov 2021 22:49:24 +0300 Subject: [PATCH 7/7] Update vernam.rb --- lib/aaa_crypt/vernam.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/aaa_crypt/vernam.rb b/lib/aaa_crypt/vernam.rb index 3b4f0b3..4669ab3 100644 --- a/lib/aaa_crypt/vernam.rb +++ b/lib/aaa_crypt/vernam.rb @@ -14,13 +14,13 @@ def self.encrypt(word, key) encrypted_word end - def self.decrypt(encrypted_word, code) - raise Error if encrypted_word.length > code.length + def self.decrypt(encrypted_word, key) + raise Error if encrypted_word.length > key.length decrypted_word = '' index = 0 encrypted_word.upcase.split('').map do |s| - decrypted_word += ALPHABET[(ALPHABET.index(s) - ALPHABET.index(code[index].upcase)) % 48] + decrypted_word += ALPHABET[(ALPHABET.index(s) - ALPHABET.index(key[index].upcase)) % 48] index += 1 end decrypted_word