расшифровать зашифрованный закрытый ключ с помощью пароля и openssl_decrypt - PullRequest
0 голосов
/ 14 января 2020

У меня есть закрытый ключ зашифрованный скрипт с паролем, и вот его вывод:

{
    "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.

1 Ответ

1 голос
/ 14 января 2020

Нет, у вас есть сценарий, зашифрованный паролем, в котором ключ secret генерируется из этого пароля. И он был сгенерирован с использованием SJCL или совместимой библиотеки, демонстрация здесь .

Соль и счетчик итераций iter вводятся в функцию PBKDF2, которая генерирует ключ AES.

Я надеюсь, что вы можете прогрессировать, используя эту информацию, потому что SO не является службой доставки кода. К счастью, я знаю, что OpenSSL содержит PBKDF2, но я не уверен, что он вам доступен.

...