2014-12-12 3 views
0

У меня проблема с данными дешифрования, зашифрованными в cryptojs. Иногда это иногда работает, если работает, оно возвращает «Сообщение», но если dosent возвращает мусор.AES - Crypto JS & PHP

var salt = CryptoJS.lib.WordArray.random(128/8); 
    var key256Bits500Iterations = CryptoJS.PBKDF2("password", salt, { keySize: 256/32, iterations: 5 }); 
    var iv = CryptoJS.enc.Hex.parse('1011121c1d1e1f'); 
    var encrypted = CryptoJS.AES.encrypt("Message", key256Bits500Iterations, { iv: iv }); 
    var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64); 
    var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);  
    var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64); 

PHP

$encrypted = base64_decode($_POST['data']);/
    $iv  = base64_decode($_POST['iv']); 
    $key  = base64_decode($_POST['key']); 
    $plaintext = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, rtrim($key, "\t\0\r\n "), rtrim($encrypted, "\t\0\r\n "), MCRYPT_MODE_CBC, $iv), "\t\0\r\n "); 

Я хотел бы остаться на cryptoJS.

+0

мусор нормальный, если вы делаете что-то неправильно в расшифровке. вы можете использовать любой ключ, который вы хотите для дешифрования, но только один ключ снова даст вам оригинальный текст. –

+0

Ваш IV слишком короткий. Это должно быть 16 байт или 32 шестнадцатеричных символа. Вы должны использовать случайный IV. Если вы отправляете ключ с данными, зачем даже его шифровать? –

+0

Это просто для тестирования, во-первых, я просто пытаюсь создать работоспособное шифрование php <> javascript. Также попробовали теперь сгенерировать 32char iv, и ошибка все равно возникает, иногда она иногда срабатывает. – Daniel

ответ

0

Вы не должны rtrim ключ. Ключ может содержать любое значение байта, включая те, которые вы только что убрали. Старые версии с удовольствием заполняют ключ с 0 значными байтами, поэтому это означает, что ключ может отличаться от ключа, используемого в источнике CryptoJS.

Отправка ключа с помощью зашифрованного текста не имеет смысла. Вместо этого лучше всего использовать PBKDF2 в PHP и рассчитать ключ от пароля.

Наконец, обратите внимание, что PHP mcrypt по умолчанию имеет нулевое дополнение, вместо которого используется pKCS # 7. Комментарии для mcrypt на страницах справки содержат хорошую реализацию PKCS # 7 для выполнения обновления.

+0

в начале я пытался с помощью: $ plaintext = rtrim (mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $ key, $ encrypted, MCRYPT_MODE_CBC, $ iv), "\ t \ 0 \ r \ n"); и я получал эту ошибку, поэтому я пытался обрезать. – Daniel

1

Наконец я уже закончил: http://wiki.birth-online.de/snippets/php/aes-rijndael http://wiki.birth-online.de/snippets/javascript/aes-rijndael

, но она по-прежнему необходимы некоторые настройки так:

$crypted = rtrim($_POST['msg'],'\t\0\r\n '); 
$crypted = str_replace(" ","+",$crypted); 
$password = 'itsmysecret'; 
$blocksize = 256; 
$decrypted = AES::decrypt($crypted, $password, $blocksize); 

Теперь она работает.