c7decrypt 0.1.10 → 0.1.13
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.
- data/lib/c7decrypt.rb +1 -181
- metadata +6 -4
data/lib/c7decrypt.rb
CHANGED
|
@@ -1,181 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
class C7Decrypt
|
|
4
|
-
|
|
5
|
-
# Vigenere translation table (these are our key values for decryption)
|
|
6
|
-
VT_TABLE = [
|
|
7
|
-
0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e,
|
|
8
|
-
0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44,
|
|
9
|
-
0x48, 0x53, 0x55, 0x42, 0x73, 0x67, 0x76, 0x63, 0x61, 0x36, 0x39,
|
|
10
|
-
0x38, 0x33, 0x34, 0x6e, 0x63, 0x78, 0x76, 0x39, 0x38, 0x37, 0x33,
|
|
11
|
-
0x32, 0x35, 0x34, 0x6b, 0x3b, 0x66, 0x67, 0x38, 0x37
|
|
12
|
-
]
|
|
13
|
-
|
|
14
|
-
# Regexes for extracting hashes from configs
|
|
15
|
-
TYPE_7_REGEXES = [
|
|
16
|
-
/enable password 7 ([A-Z0-9]+)/,
|
|
17
|
-
/username [A-Z0-9]+ password 7 ([A-Z0-9]+)/,
|
|
18
|
-
/password 7 ([A-Z0-9]+)/
|
|
19
|
-
]
|
|
20
|
-
|
|
21
|
-
# The Decryption Method for Cisco Type-7 Encrypted Strings
|
|
22
|
-
# @param [String] the Cisco Type-7 Encrypted String
|
|
23
|
-
# @raise [InvalidFirstCharacter,
|
|
24
|
-
# InvalidCharacter,
|
|
25
|
-
# OddNumberOfCharacters]
|
|
26
|
-
# @return [String] the Decrypted String
|
|
27
|
-
def decrypt(e_text)
|
|
28
|
-
check_type_7_errors(e_text)
|
|
29
|
-
|
|
30
|
-
d_text = ""
|
|
31
|
-
seed = nil
|
|
32
|
-
|
|
33
|
-
e_text.scan(/../).each_with_index do |char,i|
|
|
34
|
-
if i == 0
|
|
35
|
-
seed = char.to_i - 1
|
|
36
|
-
else
|
|
37
|
-
d_text += decrypt_char(char, i, seed)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
return d_text
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# The Encryption Method for Cisco Type-7 Encrypted Strings
|
|
45
|
-
# @param [String] the plaintext password
|
|
46
|
-
# @param [String] the seed for the encryption used
|
|
47
|
-
# @raise [InvalidEncryptionSeed,
|
|
48
|
-
# InvalidFirstCharacter,
|
|
49
|
-
# InvalidCharacter,
|
|
50
|
-
# OddNumberOfCharacters]
|
|
51
|
-
# @return [String] the encrypted password
|
|
52
|
-
def encrypt(d_text, seed = 2)
|
|
53
|
-
check_seed(seed)
|
|
54
|
-
|
|
55
|
-
e_text = sprintf("%02d", seed)
|
|
56
|
-
|
|
57
|
-
d_text.each_char.each_with_index do |d_char,i|
|
|
58
|
-
e_text += encrypt_char(d_char, i, seed)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
check_type_7_errors(e_text)
|
|
62
|
-
|
|
63
|
-
return e_text
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# The method for encrypting a single character
|
|
67
|
-
# @param [String] the plain text char
|
|
68
|
-
# @param [FixNum] the index of the char in plaintext string
|
|
69
|
-
# @param [FixNum] the seed used in the encryption process
|
|
70
|
-
# @return [String] the string of the encrypted char
|
|
71
|
-
def encrypt_char(char, i, seed)
|
|
72
|
-
sprintf("%02X", char.unpack('C')[0] ^ VT_TABLE[(i + seed) % 53])
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# The method for decrypting a single character
|
|
76
|
-
# @param [String] the encrypted char
|
|
77
|
-
# @param [Integer] the index of the char pair in encrypted string
|
|
78
|
-
# @param [Integer] the seed used in the decryption process
|
|
79
|
-
# @return [String] the string of the decrypted char
|
|
80
|
-
def decrypt_char(char, i, seed)
|
|
81
|
-
(char.hex^VT_TABLE[(i + seed) % 53]).chr
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# A helper method to decrypt an arracy of Cisco Type-7 Encrypted Strings
|
|
85
|
-
# @param [Array>String] an array of Cisco Type-7 Encrypted Strings
|
|
86
|
-
# @raise [InvalidFirstCharacter,
|
|
87
|
-
# InvalidCharacter,
|
|
88
|
-
# OddNumberOfCharacters]
|
|
89
|
-
# @return [Array>String] an array of Decrypted Strings
|
|
90
|
-
def decrypt_array(pw_array)
|
|
91
|
-
pw_array.collect {|pw| decrypt(pw)}
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# A helper method to encrypt an arracy of passwords
|
|
95
|
-
# @param [Array>String] an array of plain-text passwords
|
|
96
|
-
# @raise [InvalidEncryptionSeed,
|
|
97
|
-
# InvalidFirstCharacter,
|
|
98
|
-
# InvalidCharacter,
|
|
99
|
-
# OddNumberOfCharacters]
|
|
100
|
-
# @return [Array>String] an array of encrypted passwords
|
|
101
|
-
def encrypt_array(pt_array, seed = 2)
|
|
102
|
-
pt_array.collect {|pw| encrypt(pw, seed)}
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# This method scans a raw config file for type 7 passwords and
|
|
106
|
-
# decrypts them
|
|
107
|
-
# @param [String] a string of the config file path that contains
|
|
108
|
-
# Cisco Type-7 Encrypted Strings
|
|
109
|
-
# @raise [InvalidFirstCharacter,
|
|
110
|
-
# InvalidCharacter,
|
|
111
|
-
# OddNumberOfCharacters]
|
|
112
|
-
# @return [Array>String] an array of Decrypted Strings
|
|
113
|
-
def decrypt_config(file)
|
|
114
|
-
f = File.open(file, 'r').to_a
|
|
115
|
-
decrypt_array(f.collect {|line| type_7_matches(line)}.flatten)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# This method scans a config line for encrypted type-7 passwords and
|
|
119
|
-
# returns an array of results
|
|
120
|
-
# @param [String] a line with potential encrypted type-7 passwords
|
|
121
|
-
# @return [Array>String] an array of Cisco type-7 encrypted Strings
|
|
122
|
-
def type_7_matches(string)
|
|
123
|
-
TYPE_7_REGEXES.collect {|regex| string.scan(regex)}.flatten.uniq
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# This method determines if an encrypted hash is corrupted/invalid
|
|
127
|
-
# and throw a specific exeception
|
|
128
|
-
# @param [String] the Cisco Type-7 Encrypted String
|
|
129
|
-
# @raise [InvalidFirstCharacter, InvalidCharacter, OddNumberOfCharacters]
|
|
130
|
-
# @return [Nil]
|
|
131
|
-
def check_type_7_errors(e_text)
|
|
132
|
-
|
|
133
|
-
valid_first_chars = (0..15).to_a.collect {|c| sprintf("%02d", c)}
|
|
134
|
-
first_char = e_text[0,2]
|
|
135
|
-
|
|
136
|
-
# Check for an invalid first character in the has
|
|
137
|
-
unless valid_first_chars.include? first_char
|
|
138
|
-
raise InvalidFirstCharacter,
|
|
139
|
-
"'#{e_text}' hash contains an invalid first chracter (only '00' - '15' allowed)"
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
# Check for an invalid character in the hash
|
|
143
|
-
unless e_text.match(/^[A-Z0-9]+$/)
|
|
144
|
-
raise InvalidCharacter,
|
|
145
|
-
"'#{e_text}' hash contains an invalid character (only upper-alpha numeric allowed)"
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
# Check for an odd number of characters in the hash
|
|
149
|
-
unless e_text.size % 2 == 0
|
|
150
|
-
raise OddNumberOfCharacters,
|
|
151
|
-
"'#{e_text}' hash contains odd length of chars (only even number of chars allowed)"
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
return nil
|
|
155
|
-
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# This method determines if an encryption seed is valid or not
|
|
159
|
-
# and throw a specific exeception
|
|
160
|
-
# @param [FixNum] the seed used in the encryption process
|
|
161
|
-
# @raise [InvalidEncryptionSeed]
|
|
162
|
-
# @return [Nil]
|
|
163
|
-
def check_seed(seed)
|
|
164
|
-
if seed < 0 ||
|
|
165
|
-
seed > 15
|
|
166
|
-
|
|
167
|
-
raise InvalidEncryptionSeed,
|
|
168
|
-
"'#{seed.to_s}' seed is not a valid seed (only 0 - 15 allowed)"
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
return nil
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
#Definition of short-hand methods for the lazy
|
|
175
|
-
alias :d :decrypt
|
|
176
|
-
alias :e :encrypt
|
|
177
|
-
alias :d_a :decrypt_array
|
|
178
|
-
alias :e_a :encrypt_array
|
|
179
|
-
alias :d_c :decrypt_config
|
|
180
|
-
|
|
181
|
-
end
|
|
1
|
+
require 'c7decrypt/c7decrypt'
|
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.1.
|
|
4
|
+
version: 0.1.13
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
12
|
+
date: 2013-05-05 00:00:00.000000000 Z
|
|
13
13
|
dependencies: []
|
|
14
14
|
description: A library for decoding Cisco Type 7 passwords
|
|
15
15
|
email: claudijd@yahoo.com
|
|
@@ -30,6 +30,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
30
30
|
- - ! '>='
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
32
|
version: '0'
|
|
33
|
+
segments:
|
|
34
|
+
- 0
|
|
35
|
+
hash: 3872791078896625045
|
|
33
36
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
34
37
|
none: false
|
|
35
38
|
requirements:
|
|
@@ -38,9 +41,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
38
41
|
version: '0'
|
|
39
42
|
requirements: []
|
|
40
43
|
rubyforge_project:
|
|
41
|
-
rubygems_version: 1.8.
|
|
44
|
+
rubygems_version: 1.8.25
|
|
42
45
|
signing_key:
|
|
43
46
|
specification_version: 3
|
|
44
47
|
summary: Ruby based Cisco Type 7 Password Decryptor
|
|
45
48
|
test_files: []
|
|
46
|
-
has_rdoc:
|