Я пытаюсь зашифровать имя пользователя отправленное с помощью запроса POST на мой сервер (написанный в Codeigniter 3), так что я шифровании на стороне клиента с CryptoJS так:AES шифрование с CryptoJS и дешифрования с CodeIgniter
var user = $('.user').val();
var key = "<? echo($key);?>"; //$key is created on the server side
var encUser = CryptoJS.AES.encrypt(user, key, {
mode: CryptoJS.mode.CBC
}).toString();
Я получаю прекрасную строку длиной 64 символа, которую я отправляю на свой сервер.
На моем сервере (работает CodeIgniter 3) Я использую библиотеку CI encryption и я загружаю его по мере необходимости, но когда я пытаюсь расшифровать строку следующим образом:
$this->encryption->decrypt($this->input->post('encUser'), array(
'cipher' => 'aes-128',
'mode' => 'cbc',
'hmac' => FALSE,
'key' => $key
));
функция возвращает (bool)false
, что значит что-то пошло не так.
Что я делаю неправильно?
Примечание: не знаю, сколько мне нужно зашифровать с помощью iv
, потому что библиотека CI просто использует первые 16 символов из самой строки.
** EDIT **
Я создаю мой $kay
(ключевую фразу) с помощью random_int polyfill и это моя функция:
private function random_str($length, $keyspace = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$str = '';
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$str .= $keyspace[random_int(0, $max)];
}
return $str;
}
Что я звоню random_str(32)
;
Пример сгенерированного ключа: 1xB8oBQgXGPhcKoD0QkP1Uj4CRZ7Sy1c
** UPDATE ** благодаря ответу Artjom.B (и чат :)
) мы получили его работы, используя код на стороне клиента, его ответ и фиксируя на стороне сервера код be:
$user = $this->encryption->decrypt(base64_decode($this->input->post('encUser')), array(
'cipher' => 'aes-256',
'mode' => 'cbc',
'hmac' => FALSE,
'key' => $key
));
и теперь все работает.
@ RyanVincent, но как я могу зашифровать без ключа? – FireBrand
Дело в том, что я не могу использовать 'iv' на стороне сервера, lib просто берет первые 16 символов из строки и использует это как' iv' – FireBrand