enygma 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []