2016-11-15 4 views
0

Может ли кто-нибудь помочь мне с AES? Я использовал phpseclib для шифрования и дешифрования данных, однако, похоже, он не смог расшифровать данные. см. мой код ниже. Я хотел расшифровать данные на других страницах. Заранее спасибо!Шифрование AES с использованием phpseclib

$base64 = "AAA"; 

$cipher = new Crypt_AES(); 
$cipher->setKey('QrzMwvH7zmVn5Kzu%ks8GSTWzyLJu#Ck!^f%-UpXefuYBhv^%qLwYsuPx0d&zmNo'); 
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); 
echo $encrypted = $cipher->encrypt($base64); 


$cipher = new Crypt_AES(); 
$cipher->setKey('QrzMwvH7zmVn5Kzu%ks8GSTWzyLJu#Ck!^f%-UpXefuYBhv^%qLwYsuPx0d&zmNo'); 
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); 
echo 'decrypted:'. $cipher->decrypt($encrypted); 

Результат

% NKy0k: расшифровано:

Update:

Означает ли это, что это необходимо, чтобы сохранить список Инициализация вектора для дешифрования данных?

Update:

Я решил использовать Lumen Framework. Lumen имеет встроенную функцию encrpytion, которая обрабатывает IV и другие технические характеристики. Спасибо за вашу помощь!

ответ

-1

Вы используете библиотеку. Почему вы не используете openssl_encrypt()?

Для шифрованной:

openssl_encrypt($text, $method, $key); 

Параметры:

  1. $text: Текст Вы хотите зашифровать.
  2. $method: Метод, который вы будете использовать для шифрования. В основном я использую AES-256-ECB.
  3. $key: Ключ, который вы используете для шифрования.

Пример:

$data = openssl_encrypt('Hello', 'AES-256-ECB' 'test'); 

дешифрования:

openssl_decrypt($encrypted_text, $method, $key); 

Параметры:

  1. $encrypted_text: текст зашифрован.
  2. $method: Метод, который вы будете использовать для дешифрования.
  3. $key: Ключ к расшифровке текста.

Пример:

openssl_decrypt($data, 'AES-256-ECB', 'test'); 
+0

Я пробовал использовать его, прежде чем я решил использовать библиотеку. Я столкнулся с ошибкой/предупреждением о том, что мне нужен Инициализационный вектор, который у меня нет, чтобы понять, что это такое. – bwaaaaaa

+0

есть очень хороший пример на [здесь] (http://creepergaming.net/encrypt) использует openssl –

+3

@bwaaaaaa Это просто означает, что вам нужно сделать перерыв, чтобы изучить шифрование. Простое использование шифрования и дешифрования не обеспечивает безопасность, если оно не используется должным образом. – zaph

0

Вы используете другую IV в обоих случаях - вы должны использовать один и тот же IV.Попробуйте следующее:

$base64 = "AAA"; 
$iv = crypt_random_string($cipher->getBlockLength() >> 3); 

$cipher = new Crypt_AES(); 
$cipher->setKey('QrzMwvH7zmVn5Kzu%ks8GSTWzyLJu#Ck!^f%-UpXefuYBhv^%qLwYsuPx0d&zmNo'); 
$cipher->setIV($iv); 
echo $encrypted = $cipher->encrypt($base64); 


$cipher = new Crypt_AES(); 
$cipher->setKey('QrzMwvH7zmVn5Kzu%ks8GSTWzyLJu#Ck!^f%-UpXefuYBhv^%qLwYsuPx0d&zmNo'); 
$cipher->setIV($iv); 
echo 'decrypted:'. $cipher->decrypt($encrypted); 
+1

Будет ли проблема в отношении безопасности, если я использую астатический IV? Спасибо за ваш ответ. – bwaaaaaa

+0

Не используйте статический IV, потому что если вы снова зашифруете одни и те же сообщения, зашифрованные данные будут одинаковыми и будут утечки информации. – zaph

+0

@zaph спасибо! Я согласен, и я тоже это сделал. Я также сравнивал различные библиотеки/плагин, и лучше всего, если IV динамичен. Сделать динамику сложнее, но более безопасно. Во всяком случае, я решил использовать lumen framework. Он имеет встроенное шифрование. Поэтому нет необходимости копать в этом глубже. – bwaaaaaa

0

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

Ключ шифрования 'QrzMwvH7zmVn5Kzu%ks8GSTWzyLJu#Ck!^f%-UpXefuYBhv^%qLwYsuPx0d&zmNo' является 512-битным (64-байтным), но есть только три размера ключа AES: 128, 192 и 256 бит.

Смежные вопросы