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 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 new file mode 100644 index 0000000..4669ab3 --- /dev/null +++ b/lib/aaa_crypt/vernam.rb @@ -0,0 +1,29 @@ +module AaaCrypt + module Vernam + + ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?:;.,(){}[]" + def self.encrypt(word, key) + raise Error if word.length > key.length + + encrypted_word = '' + index = 0 + word.upcase.split('').map do |s| + encrypted_word += ALPHABET[(ALPHABET.index(s) + ALPHABET.index(key[index].upcase)) % 48] + index += 1 + end + encrypted_word + end + + 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(key[index].upcase)) % 48] + index += 1 + end + decrypted_word + end + end +end diff --git a/test/encryption/vernam_test.rb b/test/encryption/vernam_test.rb new file mode 100644 index 0000000..81fef09 --- /dev/null +++ b/test/encryption/vernam_test.rb @@ -0,0 +1,37 @@ +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 + + 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 + + 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