· 5 years ago · Feb 11, 2021, 01:38 PM
1from hashlib import sha256
2import base64
3from Crypto import Random
4from Crypto.Cipher import AES
5
6
7def md5_base64(text):
8 # функция для кодирования текста в md5 с последующим base64
9 hash = hashlib.md5()
10 hash.update(text.encode())
11 dig = hash.hexdigest()
12 b = base64.b64encode(bytes(dig, 'utf-8'))
13 return b.decode("utf-8")
14
15def crypt_param(val, key):
16 #Функция для шифрования параметров AES
17 print(type(val), val) # Ключ=Значение из словаря тип строковый
18 print(type(key), key) # Ключ тип строковый
19
20 BLOCK_SIZE = 16
21 print(BLOCK_SIZE - len(val.encode()) % BLOCK_SIZE)
22
23 PADDING = chr(BLOCK_SIZE - len(val) % BLOCK_SIZE)
24
25 pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
26 EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s.encode())))
27
28 cipher = AES.new(key.encode("utf-8"), AES.MODE_ECB) # <----- Тут ошибка
29 encoded = EncodeAES(cipher, val) # <----- И тут ошибка
30
31 return encoded # Вернуть должен Зашифрованое значение приобразованное в base64
32
33### ================ Начало тут ==========================
34API_KEY = "js4cucpn4kkc6jl1p95np054g2" # API ключ от сервиса
35
36#Создаем нужные ключи для шифрования
37md5_api_key = md5_base64(API_KEY) # < ---- шифрование api ключа
38order_date = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%dV%H:%M:%S")
39# order_date = '2014-06-28V13:39:49'
40crypt_key = md5_base64(md5_api_key + order_date)[:16] # Секретный ключ который мы получили в результате кодирования через md5 и преобразованное в base64
41
42params = {
43 'description': 'ORDER 65',
44 'amount': 23,
45 'currency': 'RUB',
46 'orderID': 65,
47 'cardHolderCity': '',
48 'cardHolderCountry': '',
49 'cardHolderPostal': '',
50 'cardHolderRegion': '',
51 'successUrl': 'http://example.com/',
52 'failUrl': 'http://example.com/'
53}
54params_crypted = []
55for k, v in enumerate(params):
56 r = crypt_param('%s=%s' % (k, v), crypt_key) # <--- Здесь заходит в функцию
57 params_crypted.append(r)
58data = quote('&'.join(params_crypted)) # Помоему должно получиться что то на подобии зашифрованный_description&зашифрованный_amount&зашифрованный_currency и тд....
59
60
61