1
1
import sys
2
+ from os import urandom as random_bytes
2
3
from struct import pack
3
4
from base64 import b64decode
4
- from Crypto import Random
5
- from Crypto .Cipher import PKCS1_OAEP , AES
6
- from Crypto .PublicKey import RSA
7
- from Crypto .Hash import HMAC , SHA
8
-
9
- public_key = """
5
+ from cryptography .hazmat .primitives .hmac import HMAC
6
+ from cryptography .hazmat .primitives .hashes import Hash , SHA1
7
+ from cryptography .hazmat .primitives .asymmetric .padding import PSS , OAEP , MGF1
8
+ from cryptography .hazmat .primitives .ciphers import Cipher
9
+ from cryptography .hazmat .primitives .ciphers .algorithms import AES
10
+ from cryptography .hazmat .primitives .ciphers .modes import CBC , ECB
11
+ import cryptography .hazmat .backends
12
+ backend = cryptography .hazmat .backends .default_backend ()
13
+
14
+
15
+ class UniverseKey (object ):
16
+ Public = backend .load_der_public_key (b64decode ("""
10
17
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDf7BrWLBBmLBc1OhSwfFkRf53T
11
18
2Ct64+AVzRkeRuh7h3SiGEYxqQMUeYKO6UWiSRKpI2hzic9pobFhRr3Bvr/WARvY
12
19
gdTckPv+T1JzZsuVcNfFjrocejN1oWI0Rrtgt4Bo+hOneoo3S57G9F1fOpn5nsQ6
13
20
6WOiu4gZKODnFMBCiQIBEQ==
14
- """
21
+ """ ))
15
22
16
- BS = AES . block_size
23
+ BS = 16
17
24
pad = lambda s : s + (BS - len (s ) % BS ) * pack ('B' , BS - len (s ) % BS )
18
25
19
26
if sys .version_info < (3 ,):
@@ -29,29 +36,35 @@ def generate_session_key(hmac_secret=b''):
29
36
:return: (session_key, encrypted_session_key) tuple
30
37
:rtype: :class:`tuple`
31
38
"""
32
- session_key = Random .new ().read (32 )
33
- cipher = PKCS1_OAEP .new (RSA .importKey (b64decode (public_key )))
34
- encrypted_session_key = cipher .encrypt (session_key + hmac_secret )
39
+ session_key = random_bytes (32 )
40
+ encrypted_session_key = UniverseKey .Public .encrypt (session_key + hmac_secret ,
41
+ OAEP (MGF1 (SHA1 ()), SHA1 (), None )
42
+ )
35
43
return (session_key , encrypted_session_key )
36
44
37
45
def symmetric_encrypt (message , key ):
38
- iv = Random . new (). read (BS )
46
+ iv = random_bytes (BS )
39
47
return symmetric_encrypt_with_iv (message , key , iv )
40
48
41
49
def symmetric_encrypt_HMAC (message , key , hmac_secret ):
42
- random_bytes = Random . new (). read (3 )
50
+ prefix = random_bytes (3 )
43
51
44
- hmac = HMAC . new (hmac_secret , digestmod = SHA )
45
- hmac .update (random_bytes )
52
+ hmac = HMAC (hmac_secret , SHA1 (), backend )
53
+ hmac .update (prefix )
46
54
hmac .update (message )
47
55
48
- iv = hmac .digest ()[:13 ] + random_bytes
56
+ iv = hmac .finalize ()[:13 ] + prefix
49
57
50
58
return symmetric_encrypt_with_iv (message , key , iv )
51
59
60
+ def symmetric_encrypt_iv (iv , key ):
61
+ encryptor = Cipher (AES (key ), ECB (), backend ).encryptor ()
62
+ return encryptor .update (iv ) + encryptor .finalize ()
63
+
52
64
def symmetric_encrypt_with_iv (message , key , iv ):
53
- encrypted_iv = AES .new (key , AES .MODE_ECB ).encrypt (iv )
54
- cyphertext = AES .new (key , AES .MODE_CBC , iv ).encrypt (pad (message ))
65
+ encrypted_iv = symmetric_encrypt_iv (iv , key )
66
+ encryptor = Cipher (AES (key ), CBC (iv ), backend ).encryptor ()
67
+ cyphertext = encryptor .update (pad (message )) + encryptor .finalize ()
55
68
return encrypted_iv + cyphertext
56
69
57
70
def symmetric_decrypt (cyphertext , key ):
@@ -63,18 +76,24 @@ def symmetric_decrypt_HMAC(cyphertext, key, hmac_secret):
63
76
iv = symmetric_decrypt_iv (cyphertext , key )
64
77
message = symmetric_decrypt_with_iv (cyphertext , key , iv )
65
78
66
- hmac = HMAC . new (hmac_secret , digestmod = SHA )
79
+ hmac = HMAC (hmac_secret , SHA1 (), backend )
67
80
hmac .update (iv [- 3 :])
68
81
hmac .update (message )
69
82
70
- if iv [:13 ] != hmac .digest ()[:13 ]:
83
+ if iv [:13 ] != hmac .finalize ()[:13 ]:
71
84
raise RuntimeError ("Unable to decrypt message. HMAC does not match." )
72
85
73
86
return message
74
87
75
88
def symmetric_decrypt_iv (cyphertext , key ):
76
- return AES .new (key , AES .MODE_ECB ).decrypt (cyphertext [:BS ])
89
+ decryptor = Cipher (AES (key ), ECB (), backend ).decryptor ()
90
+ return decryptor .update (cyphertext [:BS ]) + decryptor .finalize ()
77
91
78
92
def symmetric_decrypt_with_iv (cyphertext , key , iv ):
79
- message = AES .new (key , AES .MODE_CBC , iv ).decrypt (cyphertext [BS :])
80
- return unpad (message )
93
+ decryptor = Cipher (AES (key ), CBC (iv ), backend ).decryptor ()
94
+ return unpad (decryptor .update (cyphertext [BS :]) + decryptor .finalize ())
95
+
96
+ def sha1_hash (data ):
97
+ sha = Hash (SHA1 (), backend )
98
+ sha .update (data )
99
+ return sha .finalize ()
0 commit comments