enygma 1.0.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f76a0055e8c3902ff594eef74db248e3841263a
4
- data.tar.gz: d60c6eecd0b61b3dc531f4d7d5edfc72404fd6aa
3
+ metadata.gz: 81fe400dc15ce3b9e134048aa3a474a1ceee4c51
4
+ data.tar.gz: 78d8f268727f989a103f719fabb4bfd9311330f8
5
5
  SHA512:
6
- metadata.gz: 89bc34b5057e4889970a789d7ee6a918db8002133ce84e149f84cadde8c98b28625546a0230fb109b058e3f164e4d418a845dc41af020efb07d633a9f35050ce
7
- data.tar.gz: 1fce60030010026281f58c97e2683a53a8cb6353641decf7779e48f71275089e6ccc599cbecb371d882d54f649cd46e5c534e15e40d74dcffda057208d554537
6
+ metadata.gz: 1431acd831b3be2ae33209bebb22d1a1853ea49ec0a286c5b7d7629f7d6080620923130876b18bbe20c3c6b69317f59ce632ed1378994ec0b18f91f114854af4
7
+ data.tar.gz: 9a2e9bc051d0d0dd217a33355991f078633b297db827cfaa9e3bb31aa53ae5c3e7a6ca598bfb296e3af1e42c984d99af4f80d0044861f2a375f62b15828b8211
data/README.md CHANGED
@@ -1,29 +1,6 @@
1
- # Enygma [![Coverage Status](https://coveralls.io/repos/andela-echigbo/enygma/badge.svg?branch=master&service=github)](https://coveralls.io/github/andela-echigbo/enygma?branch=master) [![Circle CI](https://circleci.com/gh/andela-echigbo/enygma.svg?style=shield)](https://circleci.com/gh/andela-echigbo/enygma)
1
+ # Enygma [![Coverage Status](https://coveralls.io/repos/andela-echigbo/enygma/badge.svg?branch=master&service=github)](https://coveralls.io/github/andela-echigbo/enygma?branch=master) [![Circle CI](https://circleci.com/gh/andela-echigbo/enygma.svg?style=shield)](https://circleci.com/gh/andela-echigbo/enygma) [![Code Climate](https://codeclimate.com/github/andela-echigbo/enygma/badges/gpa.svg)](https://codeclimate.com/github/andela-echigbo/enygma)
2
2
 
3
- Enygma is an encryptor engine built (as a gem) with ruby programming language. It follows the principles of [Enigma Encryption Machine](https://en.wikipedia.org/wiki/Enigma_machine) to encrypt and decrypt files. The gem also offers the feature of crack a file.
4
-
5
- ## How the encryption works
6
-
7
- The encryption is based on rotation of letters using a key and the date of the encryption. The character map is made up of lower case alphabets (a - z), numbers(0 - 9), space character, comma, and period character.
8
-
9
- ### The Key
10
-
11
- * Each message uses a unique encryption key
12
- * The key is five digits, like 41521
13
- * The first two digits of the key are the "A" rotation (41)
14
- * The second and third digits of the key are the "B" rotation (15)
15
- * The third and fourth digits of the key are the "C" rotation (52)
16
- * The fourth and fifth digits of the key are the "D" rotation (21)
17
-
18
- ### The Offset
19
-
20
- * The date of message transmission is also factored into the encryption
21
- * Consider the date in the format DDMMYY, like 020315
22
- * Square the numeric form (412699225) and find the last four digits (9225)
23
- * The first digit is the "A offset" (9)
24
- * The second digit is the "B offset" (2)
25
- * The third digit is the "C offset" (2)
26
- * The fourth digit is the "D offset" (5)
3
+ Enygma is an encryption engine built (as a gem) with ruby programming language. It follows the principles of [Enigma Encryption Machine](https://en.wikipedia.org/wiki/Enigma_machine) to encrypt and decrypt files. The gem also offers the feature of cracking a file.
27
4
 
28
5
  ## Installation
29
6
 
@@ -48,14 +25,14 @@ This gem provides you with three command line actions, `encrypt`, `decrypt`, and
48
25
 
49
26
  When you have installed the enygma gem, you can encrypt a file by changing to the directory that contantains the file, and run any of the following commands
50
27
 
51
- ### Encryption
28
+ #### Encryption
52
29
  $ encrypt <filename> [<destination-filename>]
53
30
 
54
- ### Decryption
31
+ #### Decryption
55
32
  $ decrypt <cypher-filename> [<plain-filename>] <key> <date>
56
33
 
57
- ### Cracking
58
- $crack <cypher-filename> [<plain-filename>] <date>
34
+ #### Cracking
35
+ $ crack <cypher-filename> [<plain-filename>] <date>
59
36
 
60
37
  ## Options
61
38
  `<filename>` The file path of the of the file you want to encrypt. This can be the absolute filepath if you are in a different directory.
@@ -92,7 +69,7 @@ To crack a file named `file.encrypted.txt`
92
69
 
93
70
  $ crack file.encrypted.txt 231190
94
71
 
95
- =>#Created file.cracked.txt with key 12345 and date 231190
72
+ =>#Created file.decrypted.txt with key 12345 and date 231190
96
73
 
97
74
 
98
75
  ## Contributing
@@ -107,7 +84,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/andela
107
84
  6. Wait
108
85
 
109
86
  ## Limitations
110
- * The character set of this gem is limited. Lower case alphabets, numbers, space, comma and period characters.
87
+ * The character set of this gem is limited; lower case alphabets, numbers, space, comma and period characters.
111
88
  * The application generates the the key for the encryption, and does not allow user to choose their prefered digit combinations
112
89
 
113
90
  ## Improvement
@@ -9,21 +9,21 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Emmanuel Chigbo"]
10
10
  spec.email = ["emmanuel.chigbo@andela.com"]
11
11
 
12
- spec.summary = "A file encryption gem"
13
- spec.description = "This gem uses Enigma algorithm to
14
- encrypt and decrypt a file. It also provides you
15
- with the ability to crack a file that was encrypted with 'enygma'"
12
+ spec.summary = "A file encryption and decryption gem"
13
+ spec.description = "This gem uses Enigma algorithm to encrypt and decrypt"\
14
+ "a file. It also provides you with the ability to crack a file that was"\
15
+ " encrypted with 'enygma'"
16
16
  spec.homepage = "https://github.com/andela-echigbo/enygma"
17
17
  spec.license = "MIT"
18
18
 
19
19
  spec.files = `git ls-files -z`.split("\x0")
20
20
  .reject { |f| f.match(%r{^(test|spec|features)/}) }
21
21
  spec.bindir = "bin"
22
- spec.executables = %w(encrypt decrypt crack)
22
+ spec.executables = %w(encrypt decrypt crack setup console)
23
23
  spec.require_paths = ["lib"]
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.10', '>= 1.10.6'
26
26
  spec.add_development_dependency "rake", "~> 10.0"
27
- spec.add_development_dependency 'rspec', '~> 0'
27
+ spec.add_development_dependency 'rspec'
28
28
  spec.add_development_dependency "coveralls", "0.8.2"
29
29
  end
@@ -1,10 +1,10 @@
1
- require "enygma/version"
2
- require "enygma/encryptor"
3
- require "enygma/decryptor"
4
1
  require "enygma/cracker"
2
+ require "enygma/decryptor"
3
+ require "enygma/encryptor"
5
4
  require "enygma/helpers/filer"
6
5
  require "enygma/helpers/key_gen"
7
6
  require "enygma/helpers/offset"
8
7
  require "enygma/helpers/rotator"
9
8
  require "enygma/mixins/character_mapper"
10
9
  require "enygma/mixins/confirmation"
10
+ require "enygma/version"
@@ -1,12 +1,13 @@
1
- require 'enygma/mixins/character_mapper'
2
- require 'enygma/helpers/offset'
1
+ require 'enygma/decryptor'
3
2
  require 'enygma/helpers/filer'
4
3
  require 'enygma/helpers/key_gen'
5
- require 'enygma/decryptor'
4
+ require 'enygma/helpers/offset'
5
+ require 'enygma/mixins/character_mapper'
6
6
 
7
7
  module Enygma
8
8
  class Cracker
9
9
  PLAIN_LAST_7_CHARACTERS = "..end.."
10
+
10
11
  def initialize(cypher_filename, encryption_date, plain_filename = nil)
11
12
  @cypher_filename = cypher_filename
12
13
  @plain_filename = plain_filename
@@ -16,30 +17,34 @@ module Enygma
16
17
  end
17
18
 
18
19
  def crack
19
- character_array = Filer.read(@cypher_filename)
20
- cypher_last_4_characters = character_array.last(4)
21
- cypher_last_4_characters.rotate!(4 - (character_array.size % 4))
22
- plain_last_4_characters = PLAIN_LAST_7_CHARACTERS.split('').last(4)
23
- plain_last_4_characters.rotate!(4 - (character_array.size % 4))
24
- offset_characters = @offset.split('')
25
- diff_array = get_difference_array(cypher_last_4_characters,
26
- plain_last_4_characters,
27
- offset_characters
20
+ cypher_characters = Filer.read(@cypher_filename)
21
+ cypher_last_4_characters = cypher_characters.last(4)
22
+ cypher_last_4_characters.rotate!(4 - (cypher_characters.size % 4))
23
+ plain_last_4_characters = PLAIN_LAST_7_CHARACTERS.split("").last(4)
24
+ plain_last_4_characters.rotate!(4 - (cypher_characters.size % 4))
25
+ offset_characters = @offset.split("")
26
+ differences = get_differences(
27
+ cypher_last_4_characters,
28
+ plain_last_4_characters,
29
+ offset_characters
28
30
  )
29
- key = KeyGen.get_key(diff_array)
31
+
32
+ key = KeyGen.get_key(differences)
30
33
  Decryptor.new(@cypher_filename, key, @encryption_date, @plain_filename).
31
- decrypt
34
+ decrypt
32
35
  end
33
36
 
34
- def get_difference_array(cypher_array, plain_array, offset_array)
35
- difference = []
37
+ def get_differences(cypher_array, plain_array, offset_array)
38
+ differences = []
36
39
  4.times do |i|
37
40
  diff = Enygma::CHARACTER_MAP.index(cypher_array[i]) -
38
- Enygma::CHARACTER_MAP.index(plain_array[i])
41
+ Enygma::CHARACTER_MAP.index(plain_array[i])
42
+
39
43
  diff -= offset_array[i].to_i
40
- difference[i] = diff.to_s.rjust(2, '0')
44
+ differences[i] = diff.to_s.rjust(2, '0')
41
45
  end
42
- difference
46
+
47
+ differences
43
48
  end
44
49
  end
45
50
  end
@@ -1,7 +1,7 @@
1
- require 'enygma/mixins/character_mapper'
2
- require 'enygma/helpers/offset'
3
1
  require 'enygma/helpers/filer'
2
+ require 'enygma/helpers/offset'
4
3
  require 'enygma/helpers/rotator'
4
+ require 'enygma/mixins/character_mapper'
5
5
  require 'enygma/mixins/confirmation'
6
6
 
7
7
  module Enygma
@@ -9,8 +9,12 @@ module Enygma
9
9
  include Confirmation
10
10
  attr_reader :plain_filename, :cypher_filename, :encryption_key,
11
11
  :encryption_date, :decrypted
12
- def initialize(cypher_filename, encryption_key, encryption_date,
13
- plain_filename = nil
12
+
13
+ def initialize(
14
+ cypher_filename,
15
+ encryption_key,
16
+ encryption_date,
17
+ plain_filename = nil
14
18
  )
15
19
  @cypher_filename = cypher_filename
16
20
  @plain_filename = plain_filename
@@ -23,30 +27,36 @@ module Enygma
23
27
  def decrypt
24
28
  begin
25
29
  cypher_characters = Filer.read(@cypher_filename)
26
- cypher_characters.each_slice(4) do |batch|
27
- decrypt_batch(batch)
28
- end
29
- @plain_filename = Filer.write(@plain_filename, @decrypted,
30
- @cypher_filename, "decrypted"
30
+ cypher_characters.each_slice(4) { |batch| decrypt_batch(batch) }
31
+ @plain_filename = Filer.write(
32
+ @plain_filename,
33
+ @decrypted,
34
+ @cypher_filename,
35
+ "decrypted"
31
36
  )
32
- show_confirmation_message(@plain_filename, @encryption_key,
33
- @encryption_date
37
+
38
+ show_confirmation_message(
39
+ @plain_filename,
40
+ @encryption_key,
41
+ @encryption_date
34
42
  )
35
43
  rescue StandardError => e
36
- puts "Could not open the file you supplied.
37
- Make sure you are correctly typing the correct path #{e.message}"
44
+ puts "Could not open the file you supplied."\
45
+ "Make sure you are correctly typing the correct path #{e.message}"
38
46
  end
39
47
  end
40
48
 
41
49
  def decrypt_batch(batch)
42
50
  key_characters = @encryption_key.split("")
43
- offset_characters = @offset.split('')
51
+ offset_characters = @offset.split("")
44
52
  batch.each_with_index do |_value, index|
45
- new_index = Rotator.rotate(key_characters[index],
46
- key_characters[index + 1],
47
- offset_characters[index],
48
- batch[index]
53
+ new_index = Rotator.rotate(
54
+ key_characters[index],
55
+ key_characters[index + 1],
56
+ offset_characters[index],
57
+ batch[index]
49
58
  ) { |x, y| x - y }
59
+
50
60
  @decrypted += Enygma::CHARACTER_MAP[new_index]
51
61
  end
52
62
  end
@@ -1,7 +1,7 @@
1
- require 'enygma/mixins/character_mapper'
2
- require 'enygma/helpers/offset'
3
1
  require 'enygma/helpers/filer'
2
+ require 'enygma/helpers/offset'
4
3
  require 'enygma/helpers/rotator'
4
+ require 'enygma/mixins/character_mapper'
5
5
  require 'enygma/mixins/confirmation'
6
6
 
7
7
  module Enygma
@@ -9,10 +9,11 @@ module Enygma
9
9
  include Confirmation
10
10
  attr_reader :filename, :cypher_filename, :offset, :encryption_key,
11
11
  :encryption_date, :encrypted
12
+
12
13
  def initialize(filename, cypher_filename = nil)
13
14
  @filename = filename
14
15
  @cypher_filename = cypher_filename
15
- @encryption_key = rand(10**5).to_s.rjust(5,'0')
16
+ @encryption_key = rand(10**5).to_s.rjust(5, '0')
16
17
  @encryption_date = Time.now.strftime("%d%m%y")
17
18
  @offset = Offset.get_offset(@encryption_date)
18
19
  @encrypted = ""
@@ -21,18 +22,22 @@ module Enygma
21
22
  def encrypt
22
23
  begin
23
24
  plain_characters = Filer.read(@filename)
24
- plain_characters.each_slice(4) do |batch|
25
- encrypt_batch(batch)
26
- end
27
- @cypher_filename = Filer.write(@cypher_filename, @encrypted, @filename,
28
- "encrypted"
25
+ plain_characters.each_slice(4) { |batch| encrypt_batch(batch) }
26
+ @cypher_filename = Filer.write(
27
+ @cypher_filename,
28
+ @encrypted,
29
+ @filename,
30
+ "encrypted"
29
31
  )
30
- show_confirmation_message(@cypher_filename, @encryption_key,
31
- @encryption_date
32
+
33
+ show_confirmation_message(
34
+ @cypher_filename,
35
+ @encryption_key,
36
+ @encryption_date
32
37
  )
33
38
  rescue StandardError => e
34
- puts "Could not open the file you supplied.
35
- Make sure you are correctly typing the correct path. #{e.message}"
39
+ puts "Could not open the file you supplied."\
40
+ "Make sure you are correctly typing the correct path. #{e.message}"
36
41
  end
37
42
  end
38
43
 
@@ -40,10 +45,13 @@ Make sure you are correctly typing the correct path. #{e.message}"
40
45
  key_characters = @encryption_key.split('')
41
46
  offset_characters = @offset.split('')
42
47
  batch.each_with_index do |_value, index|
43
- new_index = Rotator.rotate(key_characters[index],
44
- key_characters[index + 1],
45
- offset_characters[index], batch[index]
48
+ new_index = Rotator.rotate(
49
+ key_characters[index],
50
+ key_characters[index + 1],
51
+ offset_characters[index],
52
+ batch[index]
46
53
  ) { |x, y| x + y }
54
+
47
55
  @encrypted += Enygma::CHARACTER_MAP[new_index]
48
56
  end
49
57
  end
@@ -5,12 +5,14 @@ module Enygma
5
5
  content.split('')
6
6
  end
7
7
 
8
+ # TODO: use options params instead
8
9
  def self.write(dest_file, content, source_file = '', action = '')
9
10
  unless dest_file
10
- name_split_array = source_file.split('.')
11
- name_split_array.delete("encrypted")
12
- dest_file = name_split_array.insert(-2, action).join('.')
11
+ name_split = source_file.split('.')
12
+ name_split.delete("encrypted")
13
+ dest_file = name_split.insert(-2, action).join('.')
13
14
  end
15
+
14
16
  File.open(dest_file, "w") { |file| file.write(content) }
15
17
  dest_file
16
18
  end
@@ -1,4 +1,5 @@
1
1
  require "enygma/mixins/character_mapper"
2
+
2
3
  module Enygma
3
4
  class KeyGen
4
5
  def self.get_key(differences)
@@ -7,21 +8,34 @@ module Enygma
7
8
  break if index == differences.size - 1
8
9
  value1 = value
9
10
  value2 = differences[index + 1]
10
- until value1.to_i >= 100 || tracker[index]
11
- until value2.to_i >= 100 || tracker[index]
12
- if value1[1] == value2[0]
13
- differences[index] = value1
14
- differences[index + 1] = value2
15
- tracker[index] = true
16
- else
17
- value2 = (value2.to_i + Enygma::CHARACTER_MAP.size).to_s
18
- end
11
+
12
+ compare(index, value1, value2, tracker, differences)
13
+ end
14
+
15
+ "%d%d%d%d" % [
16
+ differences[0],
17
+ differences[1][-1],
18
+ differences[2][-1],
19
+ differences[3][-1]
20
+ ]
21
+ end
22
+
23
+ private
24
+ def self.compare(index, value1, value2, tracker, differences)
25
+ until value1.to_i >= 100 || tracker[index]
26
+ until value2.to_i >= 100 || tracker[index]
27
+ if value1[1] == value2[0]
28
+ differences[index] = value1
29
+ differences[index + 1] = value2
30
+ tracker[index] = true
31
+ else
32
+ value2 = (value2.to_i + Enygma::CHARACTER_MAP.size).to_s
19
33
  end
20
- value2 = differences[index + 1]
21
- value1 = (value1.to_i + Enygma::CHARACTER_MAP.size).to_s
22
34
  end
35
+
36
+ value2 = differences[index + 1]
37
+ value1 = (value1.to_i + Enygma::CHARACTER_MAP.size).to_s
23
38
  end
24
- "#{differences[0]}#{differences[1][-1]}#{differences[2][-1]}#{differences[3][-1]}"
25
39
  end
26
40
  end
27
41
  end
@@ -1,12 +1,16 @@
1
1
  require "enygma/mixins/character_mapper"
2
+
2
3
  module Enygma
3
4
  class Rotator
4
- def self.rotate(key_character_1, key_character_2, offset_character,
5
- character
5
+ def self.rotate(
6
+ key_character_1,
7
+ key_character_2,
8
+ offset_character,
9
+ character
6
10
  )
7
11
  character_index = Enygma::CHARACTER_MAP.index(character)
8
12
  total_shift = (key_character_1 + key_character_2).to_i +
9
- offset_character.to_i
13
+ offset_character.to_i
10
14
  rotation = yield(character_index, total_shift)
11
15
  rotation % Enygma::CHARACTER_MAP.size
12
16
  end
@@ -1,3 +1,3 @@
1
1
  module Enygma
2
- CHARACTER_MAP = ('a'..'z').to_a + ('0'..'9').to_a + [' ', '.', ',']
2
+ CHARACTER_MAP = ("\n".."z").to_a
3
3
  end
@@ -1,3 +1,3 @@
1
1
  module Enygma
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enygma
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emmanuel Chigbo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-21 00:00:00.000000000 Z
11
+ date: 2015-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -48,14 +48,14 @@ dependencies:
48
48
  name: rspec
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
@@ -72,16 +72,16 @@ dependencies:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
74
  version: 0.8.2
75
- description: |-
76
- This gem uses Enigma algorithm to
77
- encrypt and decrypt a file. It also provides you
78
- with the ability to crack a file that was encrypted with 'enygma'
75
+ description: This gem uses Enigma algorithm to encrypt and decrypta file. It also
76
+ provides you with the ability to crack a file that was encrypted with 'enygma'
79
77
  email:
80
78
  - emmanuel.chigbo@andela.com
81
79
  executables:
82
80
  - encrypt
83
81
  - decrypt
84
82
  - crack
83
+ - setup
84
+ - console
85
85
  extensions: []
86
86
  extra_rdoc_files: []
87
87
  files:
@@ -137,5 +137,5 @@ rubyforge_project:
137
137
  rubygems_version: 2.4.8
138
138
  signing_key:
139
139
  specification_version: 4
140
- summary: A file encryption gem
140
+ summary: A file encryption and decryption gem
141
141
  test_files: []