Теперь функция в самом javascript выглядит так:
getVideoManifests: function() {
var e = "617adae21a8aedc4e13938619b62f4ecdd3b947cd64620569df257d333e4f11d", // значение ключа шифрования
t = { // Данные, которые будут шифроваться. Вместо переменных нужно подставить их реальные значения.
a: this.options.partner_id,
b: this.options.domain_id,
c: window._mw_adb,
d: window["7268338cb2fefca17ebbd2be216fd1de"],
e: this.options.video_token,
f: navigator.userAgent
},
n = "c46b534f9def34b0f2040a503d978eed", // значение инициализирующего вектора iv для шифрования
r = JSON.stringify(t), // преобрпзования объекта в строковое представление JSON
i = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(r), CryptoJS.enc.Hex.parse(e), { // Непосредственное шифрование методом AES 256 CBC PKCS7 Padding
iv: CryptoJS.enc.Hex.parse(n)
}),
o = $.ajax({
url: "/vs", // теперь путь запроса стал коротким: http://moonwalk.cc/vs
type: "post",
data: {
q: i.toString() // передаётся единственный параметр с шифрованным значением JSON представления параметров t (и не забыть сделать urlencode)
},
dataType: "json"
});
o.done(_.bind(this.onGetManifestSuccess, this)), o.fail(_.bind(this.onGetManifestError, this))
},
Ответ тоже изменился. Теперь в JSON данных ссылка на m3u8 плейлист и может быть ссылка на json данные, которые содержат ссылки на mp4 файлы разного качества.
В принципе, ничего сложного. Дольше разбирался, почему у меня шифрованные данные немного короче получались и их конец немного отличался.
Всё дело в Padding - дополнение длины данных до 16-ти кратного размера методом PKCS7.
На PHP функция шифрования выглядит так, если установлено PHP расширение openssl:
$crypted = openssl_encrypt($data4Encrypt, 'AES-256-CBC', hex2bin($key), 0, hex2bin($iv));
В случае использовании функции openssl_encrypt - дополнение будет делаться автоматически. Если использовать mcrypt_encrypt (должен быть установлен модуль mcrypt), то нужно заботиться об этом самим:
function aes256_cbc_encrypt($data, $key, $iv) {
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
}
Функцию hex2bin используется только если (как в нашем случае) в $key и $iv шестнадцатиричное строковое представление значений.
В $data4Encrypt должно быть что-то вроде:
{"a":4787,"b":445219,"c":true,"d":"8156109e46b295466542f3587f35f0fe","e":"491a79f12da8d2fa","f":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
В $iv: c46b534f9def34b0f2040a503d978eed
В $key: 617adae21a8aedc4e13938619b62f4ecdd3b947cd64620569df257d333e4f11d
После шифрования с этими значениями должны получиться данные:
TaceW9SHQD4kcvcEcGkKH4VNqX6ass2AalGk0S9hG5F9QoAViXV51KksyWXdSPqr2DNEKzVmkeDfK8Wh0W6LJIO4ZGUo2UNIUhJtPwLndK4VwBJsdVLPmTepIo4Lkagq7XY87AhYl1faWh1eQZGdr27ZRy55916dbj9SQR5tF9axNNUZcZ/PpMyXdQLtLOkZOYLjz9XDWpBWQuED1kw7rBDqz6+0Ao2DBok1h1p17tubM2+CvEsHAw27xV6SXpcQbQnL6Ug5Gx0rPZSADIfZfNpdwufVFv6963rO8z4MK5I=
Это для проверки правильности работы реализуемой функции, если кто будет писать.
Sony Bravia KDL-32CX523