Есть ли аналог функции CryptoJS.AES.encrypt в JavaScript?

Каким образом можно написать аналог функции на Python, которая эквивалентна данной функции на JavaScript, используемой для дешифровки на сервере?
  • 14 июля 2024 г. 19:52
Ответы на вопрос 2
В Python можно использовать библиотеку PyCryptodome для шифрования и дешифрования данных с помощью AES алгоритма. 

Вот пример аналогичной функции на Python, которая шифрует данные с использованием AES и эквивалентна функции CryptoJS.AES.encrypt в JavaScript:

```python
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad

def encrypt_data(data, key):
    cipher = AES.new(key, AES.MODE_CBC)
    ct_bytes = cipher.encrypt(pad(data.encode(), AES.block_size))
    iv = cipher.iv
    
    return ct_bytes, iv
```

Пример использования этой функции:

```python
key = get_random_bytes(16)
data = "Hello, World!"
encrypted_data, iv = encrypt_data(data, key)
```

Для дешифровки данных на сервере можно использовать следующий код:

```python
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def decrypt_data(encrypted_data, key, iv):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted_data = cipher.decrypt(encrypted_data)
    
    return unpad(decrypted_data, AES.block_size).decode()
```

Пример использования функции для дешифровки:

```python
decrypted_data = decrypt_data(encrypted_data, key, iv)
print(decrypted_data)
```

Эти функции позволят вам шифровать и дешифровать данные с использованием AES алгоритма как в JavaScript с помощью CryptoJS.
Симметричный шифр типа AES параметризируется многими настройками. В частности 
- длина ключа и длина блока . Например 128, 192, 256
- вектором инициализации . Это что-то вроде виртуального первого блока. IV.
- режимом сцепления блоков (ECB, CFB, CBC ... e.t.c.) в данном случае исходник на Python явным образом нам указывает и режим ECB является вобщем-то самым плохим и нежелательным для нужд криптографии.
(на этот режим а в JS берется какое-то умолчание).
- если мы генерируем ключ на основе парольной фразы то нам должен быть известен этот метод. Это не
всегда преобразование символов в UTF-8. Могут быть нюансы.

Для выравнивания хвоста открытого текста по границе блока есть еще режимы padding-a.
Подозреваю что там - несколько вариантов может быть. Это - тоже надо прояснить.

Поэтому автор должен взять все параметры. Привести их к общему знаменателю и убрать все
defaults на явные параметры чтоб было все одинаково. Тогда и результат дешифрования будет
ожидаемый.
Похожие вопросы