Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions lib/aaa_crypt.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
require_relative 'cesar/cesar'
require_relative 'visener/visener'
require_relative 'aaa_crypt/rot13'
require_relative 'aaa_crypt/vernam'


module AaaCrypt
Expand Down
29 changes: 29 additions & 0 deletions lib/aaa_crypt/vernam.rb
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions test/encryption/vernam_test.rb
Original file line number Diff line number Diff line change
@@ -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