c7decrypt 0.3.0 → 0.3.1

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: f70de5c1f93bf9ad137dea9dd3fa33db2a793fa0
4
- data.tar.gz: 5a8f766cf0de4464adf4c87f09e8148b3d8326ec
3
+ metadata.gz: f9b11d4c6617708dd781e31039ea82b65bb34e53
4
+ data.tar.gz: 5aecaa33cbaad57c2f429975d4b5d0d4023f67e6
5
5
  SHA512:
6
- metadata.gz: c55ffa4cb4fa17dafd2c8e97758f057e92b3b65101c53b7c2eec05803792e5e5b32720d195c1633b4a74273a66fcf7284d9c00e8734d8210d0d7e958e6ee5543
7
- data.tar.gz: 3de9b21375709c209da4fd865c33984c3700cee54df3d95d9be6c265c16c6992b6a6110f6b2f85a154c5aadd004192adcd71f520f4e59e196fd28c647f108b78
6
+ metadata.gz: 0724d39e013f76b882e6bf822913b81231ddb45d3b8a9a59127fa87050ce3630f4c9decb959b3dfec63c3bd123265ec31faa278495d85503358727ddfc665a81
7
+ data.tar.gz: 90a3fd6438c7c331ad0d0e3785d528c368b3907b54d1ea638802a9dec1961ba4ea63b2245ee25c6befce0fe5fb178a055413d5e7279c49bd72e4d36a6252d9e3
data/README.md CHANGED
@@ -44,50 +44,24 @@ To use, just require
44
44
  require 'c7decrypt'
45
45
  ```
46
46
 
47
- Decrypt A Single Encrypted Password
47
+ Decrypt A Cisco Type-7 Password
48
48
 
49
49
  ```ruby
50
50
  >> C7Decrypt::Type7.decrypt("060506324F41")
51
51
  => "cisco"
52
52
  ```
53
-
54
- Decrypt Array of Encrypted Passwords
55
-
56
- ```ruby
57
- >> encrypted_hashes = ["060506324F41", "0822455D0A16"]
58
- => ["060506324F41", "0822455D0A16"]
59
- >> C7Decrypt::Type7.decrypt_array(encrypted_hashes)
60
- => ["cisco", "cisco"]
61
- ```
62
-
63
- Decrypt Encrypted Passwords from Config
64
-
65
- ```ruby
66
- >> C7Decrypt::Type7.decrypt_config("cisco_config.txt")
67
- => ["cisco", "Password1", "admin"]
68
- ```
69
-
70
- Encrypt A Single Plaintext Password
53
+ Encrypt A Cisco Type-7 Password
71
54
 
72
55
  ```ruby
73
56
  >> C7Decrypt::Type7.encrypt("cisco")
74
57
  => "02050D480809"
75
58
  ```
76
59
 
77
- Encrypt A Single Plaintext Password w/ Explicit Seed
78
-
79
- ```ruby
80
- >> C7Decrypt::Type7.encrypt("cisco", 6)
81
- => "060506324F41"
82
- ```
83
-
84
- Encrypt An Array of Plaintext Passwords
60
+ Encrypt A Cisco Type-5 Password
85
61
 
86
62
  ```ruby
87
- >> passwords = ["cisco", "password"]
88
- => ["cisco", "password"]
89
- >> C7Decrypt::Type7.encrypt_array(passwords)
90
- => ["02050D480809", "021605481811003348"]
63
+ >> C7Decrypt::Type5.encrypt("cisco")
64
+ => "$1$CQk2$d62sxZKKAp7PHXWq4mOPF."
91
65
  ```
92
66
 
93
67
  ## Rubies Supported
@@ -0,0 +1,94 @@
1
+ require 'digest'
2
+ require 'securerandom'
3
+
4
+ module C7Decrypt
5
+ module Type5
6
+
7
+ # Source Reference:
8
+ #
9
+ # The Ruby logic within this module was adapted
10
+ # directly from https://github.com/mogest/unix-crypt
11
+ #
12
+ # Copyright (c) 2013, Roger Nesbitt
13
+ # All rights reserved.
14
+ #
15
+
16
+ module Constants
17
+ BYTE_INDEXES = [
18
+ [0, 6, 12],
19
+ [1, 7, 13],
20
+ [2, 8, 14],
21
+ [3, 9, 15],
22
+ [4, 10, 5],
23
+ [nil, nil, 11]
24
+ ]
25
+ end
26
+
27
+ # The Encryption Method for Cisco Type-5 Encrypted Strings
28
+ # @param [String] password
29
+ # @param [String] salt
30
+ # @return [String] formatted Type-5 hash
31
+ def self.encrypt(password, salt = generate_salt)
32
+ password = password.encode("UTF-8")
33
+ password.force_encoding("ASCII-8BIT")
34
+
35
+ b = Digest::MD5.digest("#{password}#{salt}#{password}")
36
+ a_string = "#{password}$1$#{salt}#{b * (password.length/16)}#{b[0...password.length % 16]}"
37
+
38
+ password_length = password.length
39
+ while password_length > 0
40
+ a_string += (password_length & 1 != 0) ? "\x0" : password[0].chr
41
+ password_length >>= 1
42
+ end
43
+
44
+ input = Digest::MD5.digest(a_string)
45
+
46
+ 1000.times do |index|
47
+ c_string = ((index & 1 != 0) ? password : input)
48
+ c_string += salt unless index % 3 == 0
49
+ c_string += password unless index % 7 == 0
50
+ c_string += ((index & 1 != 0) ? input : password)
51
+ input = Digest::MD5.digest(c_string)
52
+ end
53
+
54
+ return cisco_md5_format(salt, bit_specified_base64encode(input))
55
+ end
56
+
57
+ # A helper method for formating Cisco Type-5 hashes
58
+ def self.cisco_md5_format(salt, hash)
59
+ return "$1$" + salt + "$" + hash
60
+ end
61
+
62
+ # A helper method for bit specified base64 output (the format Type-5 hashes are in)
63
+ # @param [String] input
64
+ # @return [String] encoded_input
65
+ def self.bit_specified_base64encode(input)
66
+ b64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
67
+ input = input.bytes.to_a
68
+ output = ""
69
+ Constants::BYTE_INDEXES.each do |i3, i2, i1|
70
+ b1, b2, b3 = i1 && input[i1] || 0, i2 && input[i2] || 0, i3 && input[i3] || 0
71
+ output <<
72
+ b64[ b1 & 0b00111111] <<
73
+ b64[((b1 & 0b11000000) >> 6) |
74
+ ((b2 & 0b00001111) << 2)] <<
75
+ b64[((b2 & 0b11110000) >> 4) |
76
+ ((b3 & 0b00000011) << 4)] <<
77
+ b64[ (b3 & 0b11111100) >> 2]
78
+ end
79
+
80
+ remainder = 3 - (16 % 3)
81
+ remainder = 0 if remainder == 3
82
+
83
+ return output[0..-1-remainder]
84
+ end
85
+
86
+ # Generates a random salt using the same character set as the base64 encoding
87
+ # used by the hash encoder.
88
+ # @return [String] salt
89
+ def self.generate_salt(size = 4)
90
+ SecureRandom.base64((size * 6 / 8.0).ceil).tr("+", ".")[0...size]
91
+ end
92
+
93
+ end
94
+ end
@@ -1,3 +1,3 @@
1
1
  module C7Decrypt
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
data/lib/c7decrypt.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  require 'c7decrypt/version'
2
- require 'c7decrypt/type7'
2
+ require 'c7decrypt/type7'
3
+ require 'c7decrypt/type5'
@@ -0,0 +1,31 @@
1
+ require 'c7decrypt'
2
+ require 'rspec/its'
3
+
4
+ describe C7Decrypt::Type5 do
5
+
6
+ context "when encrypting single Cisco Type-5 hash" do
7
+ before(:each) do
8
+ @password = "SECRETPASSWORD"
9
+ @salt = "TMnL"
10
+ @hash = C7Decrypt::Type5.encrypt(@password, @salt)
11
+ end
12
+
13
+ subject{@hash}
14
+ its(:class) {should == ::String}
15
+ it {should == "$1$#{@salt}$iAFs16ZXx7x18vR1DeIp6/"}
16
+ end
17
+
18
+ context "when encrypting single Cisco Type-5 hash" do
19
+ before(:each) do
20
+ @password = "Password123"
21
+ @salt = "VkQd"
22
+ @hash = C7Decrypt::Type5.encrypt(@password, @salt)
23
+ end
24
+
25
+ subject{@hash}
26
+ its(:class) {should == ::String}
27
+ it {should == "$1$#{@salt}$Vma3sR7B1LL.v5lgy1NYc/"}
28
+ end
29
+
30
+
31
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c7decrypt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Claudius
@@ -84,11 +84,13 @@ files:
84
84
  - bin/c7decrypt
85
85
  - c7decrypt.gemspec
86
86
  - lib/c7decrypt.rb
87
+ - lib/c7decrypt/type5.rb
87
88
  - lib/c7decrypt/type7.rb
88
89
  - lib/c7decrypt/version.rb
89
90
  - spec/example_configs/bad_canned_example.txt
90
91
  - spec/example_configs/empty_example.txt
91
92
  - spec/example_configs/simple_canned_example.txt
93
+ - spec/type5_spec.rb
92
94
  - spec/type7_spec.rb
93
95
  homepage: http://rubygems.org/gems/c7decrypt
94
96
  licenses: []