passphera-core 0.2.1__py3-none-any.whl → 0.3.1__py3-none-any.whl
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.
- passphera_core/__init__.py +2 -234
- passphera_core/exceptions.py +3 -0
- passphera_core/generator.py +231 -0
- {passphera_core-0.2.1.dist-info → passphera_core-0.3.1.dist-info}/METADATA +1 -1
- passphera_core-0.3.1.dist-info/RECORD +7 -0
- passphera_core-0.2.1.dist-info/RECORD +0 -5
- {passphera_core-0.2.1.dist-info → passphera_core-0.3.1.dist-info}/WHEEL +0 -0
- {passphera_core-0.2.1.dist-info → passphera_core-0.3.1.dist-info}/top_level.txt +0 -0
passphera_core/__init__.py
CHANGED
@@ -1,234 +1,2 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
|
4
|
-
class InvalidAlgorithmException(Exception):
|
5
|
-
def __init__(self, algorithm: str) -> None:
|
6
|
-
super().__init__(f"Invalid algorithm name {algorithm}")
|
7
|
-
|
8
|
-
|
9
|
-
class PasswordGenerator:
|
10
|
-
"""
|
11
|
-
A strong password generator use multiple cipher algorithms to cipher a given plain text
|
12
|
-
"""
|
13
|
-
def __init__(
|
14
|
-
self,
|
15
|
-
text: str = None,
|
16
|
-
shift: int = 3,
|
17
|
-
multiplier: int = 3,
|
18
|
-
key_str: str = "secret",
|
19
|
-
key_iter: iter = (9, 4, 5, 7),
|
20
|
-
algorithm: str = 'playfair'
|
21
|
-
):
|
22
|
-
"""
|
23
|
-
:param text: plain text to be ciphered
|
24
|
-
:param shift: number of characters to shift each character (default 3)
|
25
|
-
:param multiplier: number of characters to shift each character (default 3)
|
26
|
-
:param key_str: cipher key string (default "secret")
|
27
|
-
:param key_iter: cipher key matrix (default (9, 4, 5, 7))
|
28
|
-
:param algorithm: main cipher algorithm name (default 'playfair')
|
29
|
-
"""
|
30
|
-
self._chars_replacements: dict = {}
|
31
|
-
self._text: str = text
|
32
|
-
self._shift: int = shift
|
33
|
-
self._multiplier: int = multiplier
|
34
|
-
self._key_str: str = key_str
|
35
|
-
self._key_iter: iter = key_iter
|
36
|
-
self._algorithm_name: str = algorithm.lower()
|
37
|
-
self._algorithm = self._set_algorithm()
|
38
|
-
self._password: str = f'secret{self._text}secret'
|
39
|
-
|
40
|
-
@property
|
41
|
-
def text(self) -> str:
|
42
|
-
"""
|
43
|
-
Returns the text to be ciphered into a password
|
44
|
-
Eg: ```password = pg.text```
|
45
|
-
:return: str: The text to be ciphered into a password
|
46
|
-
"""
|
47
|
-
return self._text
|
48
|
-
|
49
|
-
@text.setter
|
50
|
-
def text(self, text: str) -> None:
|
51
|
-
"""
|
52
|
-
Sets the text to be ciphered into a password
|
53
|
-
Eg: ```pg.text = 'secret 2024 password'```
|
54
|
-
:param text: The text to be ciphered into a password
|
55
|
-
:return:
|
56
|
-
"""
|
57
|
-
self._text = text
|
58
|
-
self._password: str = f'secret{self._text}secret'
|
59
|
-
|
60
|
-
@property
|
61
|
-
def shift(self) -> int:
|
62
|
-
"""
|
63
|
-
Returns the shift value for the cipher algorithm
|
64
|
-
Eg: ```shift = pg.shift```
|
65
|
-
:return: int: The shift value for the cipher algorithm
|
66
|
-
"""
|
67
|
-
return self._shift
|
68
|
-
|
69
|
-
@shift.setter
|
70
|
-
def shift(self, shift: int) -> None:
|
71
|
-
"""
|
72
|
-
Sets the shift value for the cipher algorithm
|
73
|
-
Eg: ```pg.shift = 3```
|
74
|
-
:param shift: The shift value for the cipher algorithm
|
75
|
-
:return:
|
76
|
-
"""
|
77
|
-
self._shift = shift
|
78
|
-
|
79
|
-
@property
|
80
|
-
def multiplier(self) -> int:
|
81
|
-
"""
|
82
|
-
Returns the multiplier value for the cipher algorithm
|
83
|
-
Eg: ```multiplier = pg.multiplier```
|
84
|
-
:return: int: The multiplier value for the cipher algorithm
|
85
|
-
"""
|
86
|
-
return self._multiplier
|
87
|
-
|
88
|
-
@multiplier.setter
|
89
|
-
def multiplier(self, multiplier: int) -> None:
|
90
|
-
"""
|
91
|
-
Sets the multiplier value for the cipher algorithm
|
92
|
-
Eg: ```pg.multiplier = 3```
|
93
|
-
:param multiplier: The multiplier value for the cipher algorithm
|
94
|
-
:return:
|
95
|
-
"""
|
96
|
-
self._multiplier = multiplier
|
97
|
-
|
98
|
-
@property
|
99
|
-
def key_str(self) -> str:
|
100
|
-
"""
|
101
|
-
Returns the key string for the cipher algorithm
|
102
|
-
Eg: ```key_str = pg.key_str```
|
103
|
-
:return: str: The key string for the cipher algorithm
|
104
|
-
"""
|
105
|
-
return self._key_str
|
106
|
-
|
107
|
-
@key_str.setter
|
108
|
-
def key_str(self, key_str: str) -> None:
|
109
|
-
"""
|
110
|
-
Sets the key string for the cipher algorithm
|
111
|
-
Eg: ```pg.key_str = 'secret key'```
|
112
|
-
:param key_str: The key string for the cipher algorithm
|
113
|
-
:return:
|
114
|
-
"""
|
115
|
-
self._key_str = key_str
|
116
|
-
|
117
|
-
@property
|
118
|
-
def key_iter(self) -> iter:
|
119
|
-
"""
|
120
|
-
Returns the key matrix for the cipher algorithm
|
121
|
-
Eg: ```key_iter = pg.key_iter```
|
122
|
-
:return: iter: The key matrix for the cipher algorithm
|
123
|
-
"""
|
124
|
-
return self._key_iter
|
125
|
-
|
126
|
-
@key_iter.setter
|
127
|
-
def key_iter(self, key_iter: iter) -> None:
|
128
|
-
"""
|
129
|
-
Sets the key matrix for the cipher algorithm
|
130
|
-
Eg: ```pg.key_iter = (9, 5, 2, 4)```
|
131
|
-
:param key_iter: The key matrix for the cipher algorithm
|
132
|
-
:return:
|
133
|
-
"""
|
134
|
-
self._key_iter = key_iter
|
135
|
-
|
136
|
-
@property
|
137
|
-
def algorithm(self) -> str:
|
138
|
-
"""
|
139
|
-
Returns the main cipher algorithm name
|
140
|
-
Eg: ```algorithm = pg.algorithm```
|
141
|
-
:return: str: The main cipher algorithm name
|
142
|
-
"""
|
143
|
-
return self._algorithm_name
|
144
|
-
|
145
|
-
@algorithm.setter
|
146
|
-
def algorithm(self, algorithm: str) -> None:
|
147
|
-
"""
|
148
|
-
Sets the main cipher algorithm
|
149
|
-
Eg: ```pg.algorithm = 'playfair'```
|
150
|
-
:param algorithm: The name of the main cipher algorithm
|
151
|
-
:return:
|
152
|
-
"""
|
153
|
-
self._algorithm_name = algorithm.lower()
|
154
|
-
self._algorithm = self._set_algorithm()
|
155
|
-
|
156
|
-
@property
|
157
|
-
def characters_replacements(self) -> dict:
|
158
|
-
"""
|
159
|
-
Returns the dictionary of the characters replacements
|
160
|
-
Eg: ```print(pg.characters_replacements) # {'a': '@1', 'b': '#2'}```
|
161
|
-
:return: dict: The dictionary of the characters replacements
|
162
|
-
"""
|
163
|
-
return self._chars_replacements
|
164
|
-
|
165
|
-
def _set_algorithm(self):
|
166
|
-
"""
|
167
|
-
Return new instance of the used algorithm to the given one by it's name
|
168
|
-
:return: new algorithm class
|
169
|
-
"""
|
170
|
-
match self._algorithm_name:
|
171
|
-
case 'caesar':
|
172
|
-
return CaesarCipher(self._shift)
|
173
|
-
case 'affine':
|
174
|
-
return AffineCipher(self._multiplier, self._shift)
|
175
|
-
case 'playfair':
|
176
|
-
return PlayfairCipher(self._key_str)
|
177
|
-
case 'hill':
|
178
|
-
return HillCipher(self._key_iter)
|
179
|
-
case _:
|
180
|
-
raise InvalidAlgorithmException(self._algorithm_name)
|
181
|
-
|
182
|
-
def _update_algorithm_properties(self) -> None:
|
183
|
-
"""
|
184
|
-
Update the main cipher algorithm
|
185
|
-
"""
|
186
|
-
self._algorithm = self._set_algorithm()
|
187
|
-
|
188
|
-
def replace_character(self, char: str, replacement: str) -> None:
|
189
|
-
"""
|
190
|
-
Replace a character with another character or set of characters
|
191
|
-
Eg: pg.replace_character('a', '@1')
|
192
|
-
:param char: The character to be replaced
|
193
|
-
:param replacement: The (character|set of characters) to replace the first one
|
194
|
-
:return:
|
195
|
-
"""
|
196
|
-
self._chars_replacements[char[0]] = replacement
|
197
|
-
|
198
|
-
def reset_character(self, char: str) -> None:
|
199
|
-
"""
|
200
|
-
Reset a character to it's original value (remove it's replacement from characters_replacements)
|
201
|
-
:param char: The character to be reset to its original value
|
202
|
-
:return:
|
203
|
-
"""
|
204
|
-
if char in self._chars_replacements:
|
205
|
-
del self._chars_replacements[char]
|
206
|
-
|
207
|
-
def generate_raw_password(self) -> str:
|
208
|
-
"""
|
209
|
-
Generate a raw password string using the given parameters
|
210
|
-
:return: str: The generated raw password
|
211
|
-
"""
|
212
|
-
self._update_algorithm_properties()
|
213
|
-
return self._algorithm.encrypt(self._password)
|
214
|
-
|
215
|
-
def generate_password(self) -> str:
|
216
|
-
"""
|
217
|
-
Generate a strong password string using the raw password (add another layer of encryption to it)
|
218
|
-
:return: str: The generated strong password
|
219
|
-
"""
|
220
|
-
old_algorithm = self._algorithm_name
|
221
|
-
self._algorithm_name = 'affine'
|
222
|
-
self._update_algorithm_properties()
|
223
|
-
self._password = self.generate_raw_password()
|
224
|
-
self._algorithm_name = old_algorithm
|
225
|
-
self._update_algorithm_properties()
|
226
|
-
for char, replacement in self._chars_replacements.items():
|
227
|
-
self._password = self._password.replace(char, replacement)
|
228
|
-
for char in self._password:
|
229
|
-
if char in self._text:
|
230
|
-
self._password = self._text.replace(char, char.upper())
|
231
|
-
return self._password
|
232
|
-
|
233
|
-
|
234
|
-
__all__ = ['PasswordGenerator', 'InvalidAlgorithmException']
|
1
|
+
from generator import PasswordGenerator as PasswordGenerator
|
2
|
+
from exceptions import InvalidAlgorithmException as InvalidAlgorithmException
|
@@ -0,0 +1,231 @@
|
|
1
|
+
from cipherspy.cipher import *
|
2
|
+
|
3
|
+
from .exceptions import InvalidAlgorithmException
|
4
|
+
|
5
|
+
|
6
|
+
class PasswordGenerator:
|
7
|
+
"""
|
8
|
+
A strong password generator use multiple cipher algorithms to cipher a given plain text
|
9
|
+
"""
|
10
|
+
def __init__(
|
11
|
+
self,
|
12
|
+
text: str = None,
|
13
|
+
shift: int = 3,
|
14
|
+
multiplier: int = 3,
|
15
|
+
key_str: str = "secret",
|
16
|
+
key_iter: iter = (9, 4, 5, 7),
|
17
|
+
algorithm: str = 'playfair'
|
18
|
+
):
|
19
|
+
"""
|
20
|
+
:param text: plain text to be ciphered
|
21
|
+
:param shift: number of characters to shift each character (default 3)
|
22
|
+
:param multiplier: number of characters to shift each character (default 3)
|
23
|
+
:param key_str: cipher key string (default "secret")
|
24
|
+
:param key_iter: cipher key matrix (default (9, 4, 5, 7))
|
25
|
+
:param algorithm: main cipher algorithm name (default 'playfair')
|
26
|
+
"""
|
27
|
+
self._chars_replacements: dict = {}
|
28
|
+
self._text: str = text
|
29
|
+
self._shift: int = shift
|
30
|
+
self._multiplier: int = multiplier
|
31
|
+
self._key_str: str = key_str
|
32
|
+
self._key_iter: iter = key_iter
|
33
|
+
self._algorithm_name: str = algorithm.lower()
|
34
|
+
self._algorithm = self._set_algorithm()
|
35
|
+
if text:
|
36
|
+
self._password: str = f"secret{self._text.replace(' ', '')}secret"
|
37
|
+
else:
|
38
|
+
self._password: str = f'secret'
|
39
|
+
|
40
|
+
@property
|
41
|
+
def text(self) -> str:
|
42
|
+
"""
|
43
|
+
Returns the text to be ciphered into a password
|
44
|
+
Eg: ```password = pg.text```
|
45
|
+
:return: str: The text to be ciphered into a password
|
46
|
+
"""
|
47
|
+
return self._text
|
48
|
+
|
49
|
+
@text.setter
|
50
|
+
def text(self, text: str) -> None:
|
51
|
+
"""
|
52
|
+
Sets the text to be ciphered into a password
|
53
|
+
Eg: ```pg.text = 'secret 2024 password'```
|
54
|
+
:param text: The text to be ciphered into a password
|
55
|
+
:return:
|
56
|
+
"""
|
57
|
+
self._text = text
|
58
|
+
self._password: str = f"secret{self._text.replace(' ', '')}secret"
|
59
|
+
|
60
|
+
@property
|
61
|
+
def shift(self) -> int:
|
62
|
+
"""
|
63
|
+
Returns the shift value for the cipher algorithm
|
64
|
+
Eg: ```shift = pg.shift```
|
65
|
+
:return: int: The shift value for the cipher algorithm
|
66
|
+
"""
|
67
|
+
return self._shift
|
68
|
+
|
69
|
+
@shift.setter
|
70
|
+
def shift(self, shift: int) -> None:
|
71
|
+
"""
|
72
|
+
Sets the shift value for the cipher algorithm
|
73
|
+
Eg: ```pg.shift = 3```
|
74
|
+
:param shift: The shift value for the cipher algorithm
|
75
|
+
:return:
|
76
|
+
"""
|
77
|
+
self._shift = shift
|
78
|
+
|
79
|
+
@property
|
80
|
+
def multiplier(self) -> int:
|
81
|
+
"""
|
82
|
+
Returns the multiplier value for the cipher algorithm
|
83
|
+
Eg: ```multiplier = pg.multiplier```
|
84
|
+
:return: int: The multiplier value for the cipher algorithm
|
85
|
+
"""
|
86
|
+
return self._multiplier
|
87
|
+
|
88
|
+
@multiplier.setter
|
89
|
+
def multiplier(self, multiplier: int) -> None:
|
90
|
+
"""
|
91
|
+
Sets the multiplier value for the cipher algorithm
|
92
|
+
Eg: ```pg.multiplier = 3```
|
93
|
+
:param multiplier: The multiplier value for the cipher algorithm
|
94
|
+
:return:
|
95
|
+
"""
|
96
|
+
self._multiplier = multiplier
|
97
|
+
|
98
|
+
@property
|
99
|
+
def key_str(self) -> str:
|
100
|
+
"""
|
101
|
+
Returns the key string for the cipher algorithm
|
102
|
+
Eg: ```key_str = pg.key_str```
|
103
|
+
:return: str: The key string for the cipher algorithm
|
104
|
+
"""
|
105
|
+
return self._key_str
|
106
|
+
|
107
|
+
@key_str.setter
|
108
|
+
def key_str(self, key_str: str) -> None:
|
109
|
+
"""
|
110
|
+
Sets the key string for the cipher algorithm
|
111
|
+
Eg: ```pg.key_str = 'secret key'```
|
112
|
+
:param key_str: The key string for the cipher algorithm
|
113
|
+
:return:
|
114
|
+
"""
|
115
|
+
self._key_str = key_str
|
116
|
+
|
117
|
+
@property
|
118
|
+
def key_iter(self) -> iter:
|
119
|
+
"""
|
120
|
+
Returns the key matrix for the cipher algorithm
|
121
|
+
Eg: ```key_iter = pg.key_iter```
|
122
|
+
:return: iter: The key matrix for the cipher algorithm
|
123
|
+
"""
|
124
|
+
return self._key_iter
|
125
|
+
|
126
|
+
@key_iter.setter
|
127
|
+
def key_iter(self, key_iter: iter) -> None:
|
128
|
+
"""
|
129
|
+
Sets the key matrix for the cipher algorithm
|
130
|
+
Eg: ```pg.key_iter = (9, 5, 2, 4)```
|
131
|
+
:param key_iter: The key matrix for the cipher algorithm
|
132
|
+
:return:
|
133
|
+
"""
|
134
|
+
self._key_iter = key_iter
|
135
|
+
|
136
|
+
@property
|
137
|
+
def algorithm(self) -> str:
|
138
|
+
"""
|
139
|
+
Returns the main cipher algorithm name
|
140
|
+
Eg: ```algorithm = pg.algorithm```
|
141
|
+
:return: str: The main cipher algorithm name
|
142
|
+
"""
|
143
|
+
return self._algorithm_name
|
144
|
+
|
145
|
+
@algorithm.setter
|
146
|
+
def algorithm(self, algorithm: str) -> None:
|
147
|
+
"""
|
148
|
+
Sets the main cipher algorithm
|
149
|
+
Eg: ```pg.algorithm = 'playfair'```
|
150
|
+
:param algorithm: The name of the main cipher algorithm
|
151
|
+
:return:
|
152
|
+
"""
|
153
|
+
self._algorithm_name = algorithm.lower()
|
154
|
+
self._algorithm = self._set_algorithm()
|
155
|
+
|
156
|
+
@property
|
157
|
+
def characters_replacements(self) -> dict:
|
158
|
+
"""
|
159
|
+
Returns the dictionary of the characters replacements
|
160
|
+
Eg: ```print(pg.characters_replacements) # {'a': '@1', 'b': '#2'}```
|
161
|
+
:return: dict: The dictionary of the characters replacements
|
162
|
+
"""
|
163
|
+
return self._chars_replacements
|
164
|
+
|
165
|
+
def _set_algorithm(self):
|
166
|
+
"""
|
167
|
+
Return new instance of the used algorithm to the given one by it's name
|
168
|
+
:return: new algorithm class
|
169
|
+
"""
|
170
|
+
match self._algorithm_name:
|
171
|
+
case 'caesar':
|
172
|
+
return CaesarCipher(self._shift)
|
173
|
+
case 'affine':
|
174
|
+
return AffineCipher(self._multiplier, self._shift)
|
175
|
+
case 'playfair':
|
176
|
+
return PlayfairCipher(self._key_str)
|
177
|
+
case 'hill':
|
178
|
+
return HillCipher(self._key_iter)
|
179
|
+
case _:
|
180
|
+
raise InvalidAlgorithmException(self._algorithm_name)
|
181
|
+
|
182
|
+
def _update_algorithm_properties(self) -> None:
|
183
|
+
"""
|
184
|
+
Update the main cipher algorithm
|
185
|
+
"""
|
186
|
+
self._algorithm = self._set_algorithm()
|
187
|
+
|
188
|
+
def replace_character(self, char: str, replacement: str) -> None:
|
189
|
+
"""
|
190
|
+
Replace a character with another character or set of characters
|
191
|
+
Eg: pg.replace_character('a', '@1')
|
192
|
+
:param char: The character to be replaced
|
193
|
+
:param replacement: The (character|set of characters) to replace the first one
|
194
|
+
:return:
|
195
|
+
"""
|
196
|
+
self._chars_replacements[char[0]] = replacement
|
197
|
+
|
198
|
+
def reset_character(self, char: str) -> None:
|
199
|
+
"""
|
200
|
+
Reset a character to it's original value (remove it's replacement from characters_replacements)
|
201
|
+
:param char: The character to be reset to its original value
|
202
|
+
:return:
|
203
|
+
"""
|
204
|
+
if char in self._chars_replacements:
|
205
|
+
del self._chars_replacements[char]
|
206
|
+
|
207
|
+
def generate_raw_password(self) -> str:
|
208
|
+
"""
|
209
|
+
Generate a raw password string using the given parameters
|
210
|
+
:return: str: The generated raw password
|
211
|
+
"""
|
212
|
+
self._update_algorithm_properties()
|
213
|
+
return self._algorithm.encrypt(self._password)
|
214
|
+
|
215
|
+
def generate_password(self) -> str:
|
216
|
+
"""
|
217
|
+
Generate a strong password string using the raw password (add another layer of encryption to it)
|
218
|
+
:return: str: The generated strong password
|
219
|
+
"""
|
220
|
+
old_algorithm = self._algorithm_name
|
221
|
+
self._algorithm_name = 'affine'
|
222
|
+
self._update_algorithm_properties()
|
223
|
+
self._password = self.generate_raw_password()
|
224
|
+
self._algorithm_name = old_algorithm
|
225
|
+
self._update_algorithm_properties()
|
226
|
+
for char, replacement in self._chars_replacements.items():
|
227
|
+
self._password = self._password.replace(char, replacement)
|
228
|
+
for char in self._password:
|
229
|
+
if char in self._text:
|
230
|
+
self._password = self._password.replace(char, char.upper())
|
231
|
+
return self._password
|
@@ -0,0 +1,7 @@
|
|
1
|
+
passphera_core/__init__.py,sha256=42-O53LSA-i4fk2xzQnhul6mhzJ7KQp8CoC6v68F8cA,139
|
2
|
+
passphera_core/exceptions.py,sha256=M0wVUORrukx2wIkHAz42Sz4BMMY8JssZp7iuHaEjARc,155
|
3
|
+
passphera_core/generator.py,sha256=pbz75NUD01ktEtGK2gCuv1B0L2z8RZHMruYukB4cg_Y,7855
|
4
|
+
passphera_core-0.3.1.dist-info/METADATA,sha256=m4wKDt2YPJSOjDhSziT9aJjypZeayyNNGyswfzKp9oM,627
|
5
|
+
passphera_core-0.3.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
6
|
+
passphera_core-0.3.1.dist-info/top_level.txt,sha256=aDUX2iWGOyfzyf6XakLWTbgeWqNrypMHO074Qratyds,15
|
7
|
+
passphera_core-0.3.1.dist-info/RECORD,,
|
@@ -1,5 +0,0 @@
|
|
1
|
-
passphera_core/__init__.py,sha256=UqXK0QCs6UdD1MsysAqpHwkvUQASODzbqaPmoP9F59A,7908
|
2
|
-
passphera_core-0.2.1.dist-info/METADATA,sha256=QLK_4eO9gskm0IjIQeq85FP0B82n1lTmgbVPqOdO0cA,627
|
3
|
-
passphera_core-0.2.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
4
|
-
passphera_core-0.2.1.dist-info/top_level.txt,sha256=aDUX2iWGOyfzyf6XakLWTbgeWqNrypMHO074Qratyds,15
|
5
|
-
passphera_core-0.2.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|