2016-06-06 3 views
3

Я пытаюсь зашифровать некоторый текст из CryptoJS и расшифровать его с помощью Phalcon.Зашифровать с помощью CryptoJs и расшифровать с помощью Phalcon

зашифровать следующим образом,

CryptoJS.AES.encrypt("MyText", 'key123'); 

Теперь для сравнения зашифровать ту же величину с Phalcon как,

$this->crypt = new Crypt(); 
$this->crypt->encrypt("MyText", 'key123'); 

Теперь значения, которые я получаю от JS и PHP отличаются.

Шифрование по умолчанию Phalcon - AES, а также в CryptoJS.

Пожалуйста, помогите мне в этом. Я хочу иметь одинаковое значение с обеих сторон.

+0

Являются ли ваши настройки шифрования одинаковыми на стороне JS и Phalcon? (У меня была эта проблема, и этот вопрос помог мне: http://stackoverflow.com/questions/16600509/aes-encrypt-in-cryptojs-and-decrypt-in-coldfusion) – Timothy

+0

Привет @Timothy, сначала я был по умолчанию , Но затем изменил его, чтобы иметь определенные значения, как в ссылке, которую вы дали. Все еще не может заставить его работать. – masterFly

ответ

3

Шифр ​​по умолчанию в Phalcon - Rijndael-256, который не поддерживается CryptoJS. Было бы необходимо изменить это на Rijndael-128 (AES). Также необходимо использовать какой-то режим заполнения в Phalcon, чтобы иметь возможность шифровать произвольные двоичные данные.

$keyHex = "0102030405060708090a0b0c0d0e0f"; 

$this->crypt = new Crypt(); 
$this->crypt->setPadding($this->crypt->PADDING_PKCS7); 
$this->crypt->setCipher("rijndael-128"); 

// encryption 
$ct = base64_encode($this->crypt->encrypt("MyText", hex2bin($keyHex))); 

// decryption 
var_dump($this->crypt->decrypt(base64_decode($ct), hex2bin($keyHex))); 

вектора инициализации 128 битой приставка к шифртексту, так что должно быть сделано таким же образом в CryptoJS.

var key = CryptoJS.enc.Hex.parse("0102030405060708090a0b0c0d0e0f"); 
var iv = CryptoJS.lib.WordArray.random(128/8); 
var ct = CryptoJS.AES.encrypt("MyText", key, { 
    iv: iv 
}).ciphertext; 
return iv.concat(ct).toString(CryptoJS.enc.Base64); 

Things отметить:

  • Ключ должен быть случайным образом. Это пример 16-байтового ключа (32 гексита), и он должен иметь определенную длину. AES поддерживает размеры ключей 16, 24 и 32 байта (32, 48, 64 гексита).

  • IV генерируется случайным образом для каждого шифрования, поэтому невозможно шифровать один и тот же текст одним и тем же ключом в CryptoJS и Phalcon для проверки совместимости. Необходимо зашифровать в одном и дешифровать в другом.

  • Симметричное шифрование без аутентификации может быть очень опасным. Возможно, в вашем случае можно установить атаку оскорбления. Обычным способом добавления аутентификации является запуск кода аутентификации сообщения через зашифрованный текст IV + с помощью отдельного ключа. HMAC-SHA256 с схемой encrypt-then-MAC является сильным выбором в этом отношении.

  • Если «ключ» передан как строка в CryptoJS.AES.encrypt, он вызывает функцию деривации ключа, совместимую с OpenSSL (EVP_BytesToKey). Данный «ключ» считается паролем, поэтому он генерирует случайную соль и выводит фактический ключ и IV из этих двух.

  • Phalcon использует mcrypt, который является отказом и имеет множество ошибок.

+0

У меня на самом деле нет Phalcon, поэтому этот код создается только после чтения его [исходного кода] (https://github.com/phalcon/cphalcon/blob/phalcon-v2.0.13/phalcon/crypt.zep) , –

+0

Привет @Artjom B., Спасибо за ответ. Не могли бы вы объяснить мне эту строку? 'вар кт = CryptoJS.AES.encrypt ("MyText", ключ, { IV: IV }). Шифротекста;' – masterFly

+0

Phalcon ручки IV для вас, но CryptoJS не делает, поэтому необходимо обеспечить конкретный IV. Результат 'CryptoJS.AES.encrypt (...)' - это объект CipherParams, который содержит много информации в дополнение к фактическому зашифрованному тексту. Здесь вам нужен только шифрованный текст, поэтому вы извлекаете только это. –