У меня есть закрытый ключ зашифрованный скрипт с паролем, и вот его вывод:
{
"iv":"Ra6kDXvh2DBiZ0r37pNuzg==",
"v":1,
"iter":10000,
"ks":256,
"ts":64,
"mode":"ccm",
"adata":"",
"cipher":"aes",
"salt":"pNN1xP7SZks=",
"ct":"Sd8p3C3vPuW+LD
nO9GwltDnqGOHg7+qguaEjQxzidEh5RNDh7bodJfmzmoB4DjFYQ4Qi8ferWoVV6bwJ2Q9/BnqI+
X4A1MQY/HgVbtc9AnXj1EczsKxsUxG/ET7W+OBGQGLddzKVC38ACRg9q0NjOieOH0yTx64="
}
Я не знаю точно, как называется этот тип шифрования, и я хочу знать как расшифровать его с помощью пароля и PHP.
Согласно моим исследованиям, его можно расшифровать с помощью функции openssl_decrypt
. Но я не мог найти, как использовать мои параметры в этой функции.
Например, у меня есть ключ с именем salt в json, который у меня есть, и я не знаю что с ним делать.
Кроме того, в функции openssl_decrypt есть входной аргумент с именем tag . Я не знаю ключ json, которому он принадлежит.
Это пример кода, который я использую:
$ct = 'Sd8p3C3vPuW+LD
nO9GwltDnqGOHg7+qguaEjQxzidEh5RNDh7bodJfmzmoB4DjFYQ4Qi8ferWoVV6bwJ2Q9/BnqI+
X4A1MQY/HgVbtc9AnXj1EczsKxsUxG/ET7W+OBGQGLddzKVC38ACRg9q0NjOieOH0yTx64=';
$method = 'aes-256-ccm';
$password = 'Qw370207610';
$options = 0;
$iv = base64_decode('Ra6kDXvh2DBiZ0r37pNuzg==');
$output = openssl_decrypt($ct, $method, $password, $options, $iv);
И я получил эту ошибку:
openssl_decrypt (): сбой установки длины IV для режима AEAD
ОБНОВЛЕНИЕ:
Итак, я получил это для создания Третий параметр (ключ), который используется в openssl_decrypt, я должен действовать следующим образом:
$ks = 256;
$key_length = $ks/8;
$password = 'Qw370207610';
$salt_base64 = 'pNN1xP7SZks=';
$salt = base64_decode($salt_base64);
$iterations = 10000;
$digest_algorithm = 'sha256';
$key = openssl_pbkdf2 ( $password , $salt , $key_length , $iterations , $digest_algorithm );
И тогда его можно расшифровать следующим образом:
$ct_base64 = 'Sd8p3C3vPuW+LD
nO9GwltDnqGOHg7+qguaEjQxzidEh5RNDh7bodJfmzmoB4DjFYQ4Qi8ferWoVV6bwJ2Q9/BnqI+
X4A1MQY/HgVbtc9AnXj1EczsKxsUxG/ET7W+OBGQGLddzKVC38ACRg9q0NjOieOH0yTx64=';
$ct = base64_decode($ct_base64);
$ts = 64;
$tag_length = $ts/8;
$tag = substr($ct,-$tag_length);
$ccm = substr($ct,0,-$tag_length);
$method = 'aes-256-ccm';
$options = OPENSSL_RAW_DATA;
$iv_base64 = 'Ra6kDXvh2DBiZ0r37pNuzg==';
$iv = base64_decode($iv_base64); // 16 bytes length
$output = openssl_decrypt($ccm, $method, $key, $options, $iv, $tag);
Однако в PHP для расшифровки aes-ccm есть просто openssl, и они не предложили другую библиотеку.
С другой стороны, эти функции не принимают IV (вектор инициализации) больше 12 байт. Потому что IV моего зашифрованного сообщения составляет 16 байт, и его вообще нельзя расшифровать в PHP !!
Разве PHP разработчики не думали об этом?
У меня никогда не было таких проблем в nodejs, но я всегда сталкиваюсь с какими-то ограничениями в PHP.