1
- #!/usr/bin/env python
2
1
import os
3
- from base64 import b64encode
4
2
from base64 import b64decode
3
+ from base64 import b64encode
5
4
6
5
from Cryptodome import Random
7
6
from Cryptodome .Cipher import AES
8
7
9
- __author__ = 'rolandh'
10
8
11
9
POSTFIX_MODE = {
12
- " cbc" : AES .MODE_CBC ,
13
- " cfb" : AES .MODE_CFB ,
14
- " ecb" : AES .MODE_CFB ,
10
+ ' cbc' : AES .MODE_CBC ,
11
+ ' cfb' : AES .MODE_CFB ,
12
+ ' ecb' : AES .MODE_CFB ,
15
13
}
16
14
17
15
BLOCK_SIZE = 16
18
16
19
17
20
18
class AESCipher (object ):
21
- def __init__ (self , key , iv = "" ):
19
+ def __init__ (self , key , iv = None ):
22
20
"""
23
-
24
21
:param key: The encryption key
25
22
:param iv: Init vector
26
23
:return: AESCipher instance
27
24
"""
28
25
self .key = key
29
26
self .iv = iv
30
27
31
- def build_cipher (self , iv = "" , alg = " aes_128_cbc" ):
28
+ def build_cipher (self , iv = None , alg = ' aes_128_cbc' ):
32
29
"""
33
30
:param iv: init vector
34
31
:param alg: cipher algorithm
35
32
:return: A Cipher instance
36
33
"""
37
- typ , bits , cmode = alg .split ("_" )
34
+ typ , bits , cmode = alg .split ('_' )
38
35
39
36
if not iv :
40
- if self .iv :
41
- iv = self .iv
42
- else :
43
- iv = Random .new ().read (AES .block_size )
44
- else :
45
- assert len (iv ) == AES .block_size
37
+ iv = self .iv if self .iv else Random .new ().read (AES .block_size )
46
38
47
- if bits not in ["128" , "192" , "256" ]:
48
- raise Exception ("Unsupported key length" )
49
- try :
50
- assert len (self .key ) == int (bits ) >> 3
51
- except AssertionError :
52
- raise Exception ("Wrong Key length" )
39
+ if len (iv ) != AES .block_size :
40
+ raise Exception ('Wrong iv size' )
41
+
42
+ if bits not in ['128' , '192' , '256' ]:
43
+ raise Exception ('Unsupported key length' )
44
+
45
+ if len (self .key ) != int (bits ) >> 3 :
46
+ raise Exception ('Wrong Key length' )
53
47
54
48
try :
55
- return AES .new (self .key , POSTFIX_MODE [cmode ], iv ), iv
49
+ result = AES .new (self .key , POSTFIX_MODE [cmode ], iv )
56
50
except KeyError :
57
- raise Exception ("Unsupported chaining mode" )
58
-
51
+ raise Exception ('Unsupported chaining mode' )
52
+ else :
53
+ return result , iv
59
54
60
- def encrypt (self , msg , iv = None , alg = " aes_128_cbc" , padding = " PKCS#7" ,
55
+ def encrypt (self , msg , iv = None , alg = ' aes_128_cbc' , padding = ' PKCS#7' ,
61
56
b64enc = True , block_size = BLOCK_SIZE ):
62
57
"""
63
58
:param key: The encryption key
@@ -69,51 +64,52 @@ def encrypt(self, msg, iv=None, alg="aes_128_cbc", padding="PKCS#7",
69
64
:return: The encrypted message
70
65
"""
71
66
72
- if padding == " PKCS#7" :
67
+ if padding == ' PKCS#7' :
73
68
_block_size = block_size
74
- elif padding == " PKCS#5" :
69
+ elif padding == ' PKCS#5' :
75
70
_block_size = 8
76
71
else :
77
72
_block_size = 0
78
73
79
74
if _block_size :
80
75
plen = _block_size - (len (msg ) % _block_size )
81
76
c = chr (plen )
82
- msg += c * plen
77
+ msg += c * plen
83
78
84
79
cipher , iv = self .build_cipher (iv , alg )
85
80
cmsg = iv + cipher .encrypt (msg )
81
+
86
82
if b64enc :
87
- return b64encode (cmsg )
83
+ enc_msg = b64encode (cmsg )
88
84
else :
89
- return cmsg
85
+ enc_msg = cmsg
90
86
87
+ return enc_msg
91
88
92
- def decrypt (self , msg , iv = None , alg = "aes_128_cbc" , padding = "PKCS#7" , b64dec = True ):
89
+ def decrypt (self , msg , iv = None , alg = 'aes_128_cbc' , padding = 'PKCS#7' ,
90
+ b64dec = True ):
93
91
"""
94
92
:param key: The encryption key
95
93
:param iv: init vector
96
94
:param msg: Base64 encoded message to be decrypted
97
95
:return: The decrypted message
98
96
"""
99
- if b64dec :
100
- data = b64decode (msg )
101
- else :
102
- data = msg
97
+ data = b64decode (msg ) if b64dec else msg
103
98
104
99
_iv = data [:AES .block_size ]
105
100
if iv :
106
101
assert iv == _iv
107
102
cipher , iv = self .build_cipher (iv , alg = alg )
108
103
res = cipher .decrypt (data )[AES .block_size :]
109
- if padding in [" PKCS#5" , " PKCS#7" ]:
104
+ if padding in [' PKCS#5' , ' PKCS#7' ]:
110
105
res = res [:- ord (res [- 1 ])]
111
106
return res
112
107
113
- if __name__ == "__main__" :
114
- key_ = "1234523451234545" # 16 byte key
108
+
109
+ if __name__ == '__main__' :
110
+ key_ = '1234523451234545' # 16 byte key
115
111
# Iff padded, the message doesn't have to be multiple of 16 in length
116
- msg_ = " ToBeOrNotTobe W.S."
112
+ msg_ = ' ToBeOrNotTobe W.S.'
117
113
aes = AESCipher (key_ )
118
114
iv_ = os .urandom (16 )
119
115
encrypted_msg = aes .encrypt (key_ , msg_ , iv_ )
0 commit comments