Gemnigma 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +14 -0
- data/.travis.yml +17 -0
- data/Gemfile +4 -0
- data/Gemnigma.gemspec +24 -0
- data/LICENSE.txt +22 -0
- data/README.md +87 -0
- data/Rakefile +8 -0
- data/bin/Gemnigma +184 -0
- data/helpers/char_map.rb +11 -0
- data/helpers/cipher_decrypt.rb +9 -0
- data/helpers/cipher_encrypt.rb +10 -0
- data/helpers/key.rb +25 -0
- data/helpers/messages.rb +44 -0
- data/helpers/offset.rb +26 -0
- data/helpers/rotator_decrypt.rb +16 -0
- data/helpers/rotator_encrypt.rb +62 -0
- data/helpers/validate_file_arg.rb +38 -0
- data/lib/Gemnigma/crack.rb +199 -0
- data/lib/Gemnigma/decrypt.rb +64 -0
- data/lib/Gemnigma/encrypt.rb +45 -0
- data/lib/Gemnigma/helpers.rb +4 -0
- data/lib/Gemnigma/version.rb +3 -0
- data/lib/Gemnigma.rb +7 -0
- data/message.txt +1 -0
- data/spec/Gemnigma_spec.rb +55 -0
- data/spec/char_map_spec.rb +38 -0
- data/spec/cipher_decrypt_spec.rb +55 -0
- data/spec/cipher_encrypt_spec.rb +43 -0
- data/spec/crack_spec.rb +170 -0
- data/spec/decrypt_spec.rb +108 -0
- data/spec/encrypt_spec.rb +61 -0
- data/spec/key_spec.rb +48 -0
- data/spec/messages_spec.rb +161 -0
- data/spec/offset_spec.rb +62 -0
- data/spec/rotator_decrypt_spec.rb +21 -0
- data/spec/rotator_encrypt_spec.rb +130 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/validate_file_arg_spec.rb +49 -0
- data/spec/version_spec.rb +11 -0
- metadata +156 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c972d271fb7395b7d645684a4e95991456479375
|
4
|
+
data.tar.gz: 85a3ca12bd9117a3d328386e7b0988ccca761b6e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7cfa961d91ed50852aadcc41edb87009787dc5190a4f5249505b4e9a77e031dc7209543e025ef04032e3c33de9d006a39c03dab3d02ed5b97ef8600b58525f68
|
7
|
+
data.tar.gz: d9728b6ff7bb168039d03489a441463c1e8f032674d6f7c618dcf7ad1e57883b877ba5850223b5adcfdf8d11b436758c70589f31c4614f4d809b263f9774c21f
|
data/.coveralls.yml
ADDED
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemnigma.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'Gemnigma/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "Gemnigma"
|
8
|
+
spec.version = Gemnigma::VERSION
|
9
|
+
spec.authors = ["Chinedu"]
|
10
|
+
spec.email = ["chinedudaniel7@gmail.com"]
|
11
|
+
spec.summary = %q{ Encrypt and decrypt text files on your system }
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency "rspec", "~> 3"
|
23
|
+
spec.add_development_dependency "coveralls"
|
24
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Chinedu
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# Gemnigma [](https://travis-ci.org/andela-cdaniel/Gemnigma) [](https://coveralls.io/github/andela-cdaniel/Gemnigma?branch=master)
|
2
|
+
|
3
|
+
The Gemnigma gem is an encryption engine for encoding messages. It is built using the Ruby programming language and intended to be used from within the command line.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'Gemnigma'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute from the command line:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it directly from the command line yourself as:
|
18
|
+
|
19
|
+
$ gem install Gemnigma
|
20
|
+
|
21
|
+
## How the encryption works
|
22
|
+
|
23
|
+
The encryption is based on rotation of letters based on a a key and the date that message was generated. The character map is made up of alphanumeric characters (alphabets all in lowercase), space character, period character and the comma character.
|
24
|
+
|
25
|
+
### The Key
|
26
|
+
|
27
|
+
* Each message uses a unique encryption key
|
28
|
+
* The key is five digits, like 41521
|
29
|
+
* The first two digits of the key are the "A" rotation (41)
|
30
|
+
* The second and third digits of the key are the "B" rotation (15)
|
31
|
+
* The third and fourth digits of the key are the "C" rotation (52)
|
32
|
+
* The fourth and fifth digits of the key are the "D" rotation (21)
|
33
|
+
|
34
|
+
### The Offset
|
35
|
+
|
36
|
+
* The date of message transmission is also factored into the encryption
|
37
|
+
* Consider the date in the format DDMMYY, like 020315
|
38
|
+
* Square the numeric form (412699225) and find the last four digits (9225)
|
39
|
+
* The first digit is the "A offset" (9)
|
40
|
+
* The second digit is the "B offset" (2)
|
41
|
+
* The third digit is the "C offset" (2)
|
42
|
+
* The fourth digit is the "D offset" (5)
|
43
|
+
|
44
|
+
## Usage
|
45
|
+
|
46
|
+
Encrypt a message by providing an input file and an output file:
|
47
|
+
|
48
|
+
```
|
49
|
+
Gemnigma encrypt message.txt encrypted.txt
|
50
|
+
```
|
51
|
+
|
52
|
+
Decrypt a message by providing an input file, an output file, a key and a date offset:
|
53
|
+
|
54
|
+
```
|
55
|
+
Gemnigma decrypt encrypted.txt decrypted.txt 41521 7225
|
56
|
+
```
|
57
|
+
|
58
|
+
Crack a message when the key is not known by providing an input file, an
|
59
|
+
output file, and a date:
|
60
|
+
|
61
|
+
```
|
62
|
+
Gemnigma crack encrypted.txt cracked.txt 51015
|
63
|
+
```
|
64
|
+
|
65
|
+
List the contents of a directory by calling Gemnigma list and passing in options from "all", "file" or "folder"
|
66
|
+
|
67
|
+
```
|
68
|
+
Gemnigma list file
|
69
|
+
```
|
70
|
+
|
71
|
+
Call the help documentation at any time by typing Gemnigma help
|
72
|
+
|
73
|
+
```
|
74
|
+
Gemnigma help
|
75
|
+
```
|
76
|
+
|
77
|
+
## Contributing
|
78
|
+
|
79
|
+
1. Fork it: [Fork Gemnigma on Github](https://github.com/andela-cdaniel/Gemnigma/fork)
|
80
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
81
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
82
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
83
|
+
5. Create a new Pull Request
|
84
|
+
|
85
|
+
## License
|
86
|
+
|
87
|
+
Gemnigma is released under the [MIT License](https://github.com/andela-cdaniel/Gemnigma/blob/master/LICENSE.txt)
|
data/Rakefile
ADDED
data/bin/Gemnigma
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "Gemnigma"
|
4
|
+
|
5
|
+
class StartApplication
|
6
|
+
def init_application
|
7
|
+
@option = ARGV[0]
|
8
|
+
|
9
|
+
if ARGV.length == 0
|
10
|
+
help
|
11
|
+
end
|
12
|
+
|
13
|
+
if ARGV.length == 1
|
14
|
+
case @option
|
15
|
+
when "-v"
|
16
|
+
version
|
17
|
+
when "--version"
|
18
|
+
version
|
19
|
+
when "-h"
|
20
|
+
help
|
21
|
+
when "--help"
|
22
|
+
help
|
23
|
+
when "-ls"
|
24
|
+
list
|
25
|
+
when "list"
|
26
|
+
list
|
27
|
+
else
|
28
|
+
help
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if ARGV.length > 1
|
33
|
+
case @option
|
34
|
+
when "-e"
|
35
|
+
encrypt
|
36
|
+
when "encrypt"
|
37
|
+
encrypt
|
38
|
+
when "-d"
|
39
|
+
decrypt
|
40
|
+
when "decrypt"
|
41
|
+
decrypt
|
42
|
+
when "-c"
|
43
|
+
crack
|
44
|
+
when "crack"
|
45
|
+
crack
|
46
|
+
when "-ls"
|
47
|
+
list
|
48
|
+
when "list"
|
49
|
+
list
|
50
|
+
else
|
51
|
+
help
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def version
|
60
|
+
version = Gemnigma::VERSION
|
61
|
+
p version
|
62
|
+
end
|
63
|
+
|
64
|
+
def help
|
65
|
+
puts "Usage:\nGemnigma [option] [*arguments]"
|
66
|
+
puts "\nOptions:\n\t-h, [--help]" + "#Displays this help message and quits".rjust(50)
|
67
|
+
puts "\t-v, [--version]" + "#Display Gemnigma version number and quit".rjust(51)
|
68
|
+
puts "\t-ls,[list]" + "#List files in the current working directory".rjust(57)
|
69
|
+
puts "\t-e, [encrypt]" + "#Encrypt a file in the current directory".rjust(50)
|
70
|
+
puts "\t-d, [decrypt]" + "#Decrypt an encrypted file in the current directory".rjust(61)
|
71
|
+
puts "\t-c, [crack]" + "#Cracks an encrypted file in the current directory".rjust(62)
|
72
|
+
|
73
|
+
puts "\nEncrypting files:"
|
74
|
+
puts "To Encrypt files in the current directory, call Gemnigma -e or Gemnigma --encrypt and\npass in "\
|
75
|
+
"the file to be encrypted and a new file to store the encrypted message.\n\n"\
|
76
|
+
"Example:\n Gemnigma -e message.txt encrypted.txt"
|
77
|
+
|
78
|
+
puts "\nDecrypting files:"
|
79
|
+
puts "To decrypt files in the current directory, call Gemnigma -d or Gemnigma --decrypt and\n"\
|
80
|
+
"pass in the file to store the decrypted contents of an encrypted file, you are also\n"\
|
81
|
+
"required to pass in the date that the file was generated and the key used to generate\n"\
|
82
|
+
"the encrypted file.\n\n"\
|
83
|
+
"Example:\n Gemnigma -d encrypted.txt decrypted.txt 41521 #{Time.now.strftime("%d%m%y").to_i}"
|
84
|
+
|
85
|
+
puts "\nCracking files:"
|
86
|
+
puts "To crack files, call Gemnigma -c or Gemnigma --crack. You must specify the date encrypted"\
|
87
|
+
"file was generated and file to be written to\n\n"\
|
88
|
+
"Example:\nGemnigma -c encrypted.txt cracked.txt #{Time.now.strftime("%d%m%y").to_i}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def encrypt
|
92
|
+
enc = Gemnigma::Encrypt.new
|
93
|
+
enc.get_cmd_args
|
94
|
+
end
|
95
|
+
|
96
|
+
def decrypt
|
97
|
+
dec = Gemnigma::Decrypt.new
|
98
|
+
dec.get_cmd_args
|
99
|
+
end
|
100
|
+
|
101
|
+
def crack
|
102
|
+
crack = Gemnigma::Crack.new
|
103
|
+
crack.get_cmd_args
|
104
|
+
end
|
105
|
+
|
106
|
+
def list_all
|
107
|
+
result = %x["ls"]
|
108
|
+
result_arr = result.split("\n")
|
109
|
+
|
110
|
+
result_arr.map! do |item|
|
111
|
+
if File.file? item
|
112
|
+
"[File] " + item
|
113
|
+
else
|
114
|
+
"[Folder] " + item
|
115
|
+
end
|
116
|
+
end
|
117
|
+
puts "All items in current working directory: \n\n"
|
118
|
+
puts result_arr
|
119
|
+
puts "\nTotal amount items in this directory: #{result_arr.length}"
|
120
|
+
end
|
121
|
+
|
122
|
+
def list_file
|
123
|
+
result = %x["ls"]
|
124
|
+
result_arr = result.split("\n")
|
125
|
+
|
126
|
+
result_arr.map! do |item|
|
127
|
+
if File.file? item
|
128
|
+
"[File] " + item
|
129
|
+
else
|
130
|
+
""
|
131
|
+
end
|
132
|
+
end
|
133
|
+
puts "All files in current working directory: \n\n"
|
134
|
+
result_arr.delete("")
|
135
|
+
puts result_arr
|
136
|
+
puts "\nTotal amount of files in this directory: #{result_arr.length}"
|
137
|
+
end
|
138
|
+
|
139
|
+
def list_folder
|
140
|
+
result = %x["ls"]
|
141
|
+
result_arr = result.split("\n")
|
142
|
+
result_arr.map! do |item|
|
143
|
+
if File.directory? item
|
144
|
+
"[Folder] " + item
|
145
|
+
else
|
146
|
+
""
|
147
|
+
end
|
148
|
+
end
|
149
|
+
puts "All folders in current working directory: \n\n"
|
150
|
+
result_arr.delete("")
|
151
|
+
puts result_arr
|
152
|
+
puts "\nTotal amount of folders in this directory: #{result_arr.length}"
|
153
|
+
end
|
154
|
+
|
155
|
+
def list_help
|
156
|
+
puts "Usage:\n Gemnigma list [option]"
|
157
|
+
puts "\nOptions:\n\thelp," + "#Displays this help message and quits".rjust(49)
|
158
|
+
puts "\tall," + "#Display all files and folder in the current working directory".rjust(75)
|
159
|
+
puts "\tfile," + "#Display only files in the current working directory".rjust(64)
|
160
|
+
puts "\tfolder," + "#Display all folders in the current working directory".rjust(63)
|
161
|
+
end
|
162
|
+
|
163
|
+
def list
|
164
|
+
list_all if ARGV.length == 1 || (ARGV.length == 2 && ARGV[1] == "all")
|
165
|
+
|
166
|
+
list_file if ARGV.length == 2 && ARGV[1] == "file"
|
167
|
+
|
168
|
+
list_folder if ARGV.length == 2 && ARGV[1] == "folder"
|
169
|
+
|
170
|
+
list_help if ARGV.length == 2 && ARGV[1] == "help"
|
171
|
+
|
172
|
+
if ARGV.length == 2 && !(ARGV[1] == "all" || ARGV[1] == "file" || ARGV[1] == "folder" || ARGV[1] == "help")
|
173
|
+
puts "Not a valid option"
|
174
|
+
end
|
175
|
+
|
176
|
+
if ARGV.length > 2
|
177
|
+
puts "Too many options passed in. Not valid"
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
StartApplication.new.init_application
|
data/helpers/char_map.rb
ADDED
data/helpers/key.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Gemnigma
|
2
|
+
class Key
|
3
|
+
attr_reader :key
|
4
|
+
|
5
|
+
def initialize(key=41521)
|
6
|
+
if (key.to_s.length == 5) && (key.class == Fixnum)
|
7
|
+
@key = key
|
8
|
+
else
|
9
|
+
puts "Not a valid key, defaulting to 41521"
|
10
|
+
@key = 41521
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def key_map
|
15
|
+
generate_key_map
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def generate_key_map
|
21
|
+
@key_map = @key.to_s.chars.each_cons(2).map(&:join).map(&:to_i)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/helpers/messages.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Gemnigma
|
2
|
+
class Messages
|
3
|
+
def initialize(io=$stdout)
|
4
|
+
@io = io
|
5
|
+
end
|
6
|
+
|
7
|
+
def puts(msg)
|
8
|
+
@io.puts msg
|
9
|
+
end
|
10
|
+
|
11
|
+
def few_args
|
12
|
+
puts "Not enough arguments passed in. Run Gemnigma --help for instructions on usage\nExiting..."
|
13
|
+
end
|
14
|
+
|
15
|
+
def too_much_args
|
16
|
+
puts "Too many arguments passed in. Run Gemnigma --help for instructions on usage\nExiting..."
|
17
|
+
end
|
18
|
+
|
19
|
+
def file_not_in_existence(file)
|
20
|
+
puts "#{file}: File does not exist\nExiting..."
|
21
|
+
end
|
22
|
+
|
23
|
+
def file_in_existence(input_file, output_file)
|
24
|
+
puts "#{input_file} exists... Checking #{output_file}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def creating_new_file(file)
|
28
|
+
puts "#{file} will be created, proceeding..."
|
29
|
+
end
|
30
|
+
|
31
|
+
def overwrite_warning(file)
|
32
|
+
puts "#{file} exists already, do you want to overwrite it? (Y) or (N): "
|
33
|
+
end
|
34
|
+
|
35
|
+
def wrong_date(date)
|
36
|
+
puts "#{date} doesn't match the specified date format\nExiting..."
|
37
|
+
end
|
38
|
+
|
39
|
+
def success_message(output_file, key, date)
|
40
|
+
puts "\n........................................................"
|
41
|
+
puts "\nCreated '#{output_file}' with secret key #{key} and date #{date}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/helpers/offset.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gemnigma
|
2
|
+
class Offset
|
3
|
+
|
4
|
+
def date
|
5
|
+
@current = Time.now
|
6
|
+
end
|
7
|
+
|
8
|
+
def offset
|
9
|
+
squared_date.to_s.chars.last(4).map(&:to_i)
|
10
|
+
end
|
11
|
+
|
12
|
+
def full_date
|
13
|
+
formatted_date
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def formatted_date
|
19
|
+
date.strftime("%d%m%y").to_i
|
20
|
+
end
|
21
|
+
|
22
|
+
def squared_date
|
23
|
+
formatted_date ** 2
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative "cipher_decrypt"
|
2
|
+
require_relative "rotator_encrypt"
|
3
|
+
|
4
|
+
module Gemnigma
|
5
|
+
class RotatorDecrypt < RotatorEncrypt
|
6
|
+
def rot_decrypt(word)
|
7
|
+
mapping = map_word_to_key(word)
|
8
|
+
|
9
|
+
mapping.map! do |arr|
|
10
|
+
Gemnigma::CipherDecrypt.rotate_backward(arr.last)[arr.first]
|
11
|
+
end
|
12
|
+
|
13
|
+
mapping.join
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative "cipher_encrypt"
|
2
|
+
require_relative "key"
|
3
|
+
require_relative "offset"
|
4
|
+
|
5
|
+
module Gemnigma
|
6
|
+
class RotatorEncrypt
|
7
|
+
attr_reader :key_map
|
8
|
+
|
9
|
+
def initialize(key = Gemnigma::Key.new)
|
10
|
+
|
11
|
+
if key.methods.include? :key_map
|
12
|
+
@key_map = key.key_map
|
13
|
+
else
|
14
|
+
puts "Invalid key, using default key: 41521"
|
15
|
+
@key_map = Gemnigma::Key.new.key_map
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def rot_encrypt(word)
|
21
|
+
mapping = map_word_to_key(word)
|
22
|
+
|
23
|
+
mapping.map! do |arr|
|
24
|
+
Gemnigma::CipherEncrypt.rotate_forward(arr.last)[arr.first]
|
25
|
+
end
|
26
|
+
|
27
|
+
mapping.join
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def get_offset
|
33
|
+
Gemnigma::Offset.new.offset
|
34
|
+
end
|
35
|
+
|
36
|
+
def map_key_to_offset
|
37
|
+
@key_map.zip(get_offset)
|
38
|
+
end
|
39
|
+
|
40
|
+
def char_rotation
|
41
|
+
map_key_to_offset.map do |arr|
|
42
|
+
arr.inject(&:+)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def map_word_to_key(word)
|
47
|
+
result = []
|
48
|
+
count_key = 0
|
49
|
+
|
50
|
+
word.downcase.split("").each_with_index do |letter, index|
|
51
|
+
if count_key >= char_rotation.length
|
52
|
+
count_key = 0
|
53
|
+
end
|
54
|
+
result << [letter, char_rotation[count_key]]
|
55
|
+
count_key += 1
|
56
|
+
end
|
57
|
+
|
58
|
+
result
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative "messages"
|
2
|
+
|
3
|
+
module Gemnigma
|
4
|
+
module ValidateFileArg
|
5
|
+
def validate
|
6
|
+
@input_file = ARGV[1]
|
7
|
+
@output_file = ARGV[2]
|
8
|
+
|
9
|
+
unless File.file? @input_file
|
10
|
+
Messages.new.file_not_in_existence(@input_file)
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
if File.file? @input_file
|
15
|
+
Messages.new.file_in_existence(@input_file, @output_file)
|
16
|
+
unless File.file? @output_file
|
17
|
+
Messages.new.creating_new_file(@output_file)
|
18
|
+
yield if block_given?
|
19
|
+
else
|
20
|
+
Messages.new.overwrite_warning(@output_file)
|
21
|
+
user_choice = $stdin.gets.chomp.downcase
|
22
|
+
|
23
|
+
if user_choice == "y"
|
24
|
+
yield if block_given?
|
25
|
+
elsif user_choice == "n"
|
26
|
+
puts "Operation aborted\nExiting..."
|
27
|
+
return
|
28
|
+
else
|
29
|
+
puts "Not a valid choice.\nOperation aborted.\nExiting..."
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|