@maryaTurova

Какой аналог CryptoJS.AES.encrypt от js?

Подскажите, как сделать аналог функции js на Python:
js (encrypt)

function _Encrypt(data, key=PASSPHRASE){
	return CryptoJS.AES.encrypt(JSON.stringify(data), key).toString();
}


На сервере дешифрую так:
php (decrypt)

function evpKDF($password, $salt, $keySize=8, $ivSize=4, $iterations=1, $hashAlgorithm="md5"){
		$targetKeySize = $keySize + $ivSize;
		$derivedBytes = "";
		$numberOfDerivedWords = 0;
		$block = NULL;
		$hasher = hash_init($hashAlgorithm);
		while ($numberOfDerivedWords < $targetKeySize){
			if ($block != NULL) {
				hash_update($hasher, $block);
			}
			hash_update($hasher, $password);
			hash_update($hasher, $salt);
			$block = hash_final($hasher, TRUE);
			$hasher = hash_init($hashAlgorithm);
			for ($i = 1; $i < $iterations; $i++) {
				hash_update($hasher, $block);
				$block = hash_final($hasher, TRUE);
				$hasher = hash_init($hashAlgorithm);
			}
			$derivedBytes .= substr($block, 0, min(strlen($block), ($targetKeySize - $numberOfDerivedWords) * 4));
			$numberOfDerivedWords += strlen($block)/4;
		}
		return array(
			"key" => substr($derivedBytes, 0, $keySize * 4),
			"iv"  => substr($derivedBytes, $keySize * 4, $ivSize * 4)
		);
	}

	function decrypt($ciphertext, $password=PASSPHRASE){
		$ciphertext = base64_decode($ciphertext);
		if(substr($ciphertext, 0, 8) != "Salted__"){
			return false;
		}
		$salt = substr($ciphertext, 8, 8);
		$keyAndIV = evpKDF($password, $salt);
		$decryptPassword = openssl_decrypt(
				substr($ciphertext, 16), 
				"aes-256-cbc",
				$keyAndIV["key"], 
				OPENSSL_RAW_DATA,
				$keyAndIV["iv"]);
		return $decryptPassword;
	}


Пробовал так:
Python (encrypt)

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

def encrypt(message, key=PASSPHRASE):
        raw = pad(json.dumps(message).encode(),32)
        cipher = AES.new(key, AES.MODE_ECB)
        return base64.b64encode(cipher.encrypt(raw)).decode()

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

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

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

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:28
200000 руб./за проект
21 нояб. 2024, в 19:09
5000 руб./за проект
21 нояб. 2024, в 17:47
7000 руб./за проект