2016-03-02 3 views
1

Я пытаюсь зашифровать строку, используя phpseclib AES в режиме CBC (по умолчанию библиотеки):Шифрование с AES с использованием phpseclib и дешифрования с CryptoJS

$cipher = new Crypt_AES(); 
$cipher->setKey('abcdefghijklmnop'); 
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); 
$cipher->encrypt("hello world") 

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

У кого-нибудь есть рабочий пример того, как реализовать этот сценарий взаимодействия?

Другая библиотека, такая как Crypto, может быть использована. Пример Base64 выход MF9lCR4DaW1R0adIe03VEw==

Так что идея состоит в том, чтобы расшифровать следующим образом:

var helloWorld = CryptoJS.AES.decrypt("MF9lCR4DaW1R0adIe03VEw==", key).toString(); 
+0

Почему вы используете стороннюю библиотеку криптографической в ​​узле, когда есть один, который встроен и быстрее? – mscdex

+0

Можете ли вы привести пример зашифрованного вывода (например, в hex или base64)? – mscdex

+0

@mscdex только что обновил вопрос несколькими примерами по вашему запросу. Btw, криптографическая библиотека узла также является опцией. – Roberto14

ответ

2

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

CryptoJS поддерживает два типа шифрования. Если вы передадите ключ в виде строки, он будет использовать функцию деривации ключей OpenSSL для получения нового ключа с солью. Вы не хотите этого, потому что используете явный ключ. Для этого вам нужно передать ключ в виде двоичной структуры данных WordArray (CryptoJS). Кроме того, шифротекст, как ожидается, будет либо OpenSSL отформатированной строка или объект CipherParams:

var message = CryptoJS.AES.decrypt({ 
    ciphertext: CryptoJS.enc.Base64.parse("MF9lCR4DaW1R0adIe03VEw==") 
}, CryptoJS.enc.Utf8.parse('abcdefghijklmnop'), { 
    iv: iv // retrieve the IV somehow 
}).toString(CryptoJS.enc.Utf8); 
+0

Я думал, что IV уже был добавлен в зашифрованные данные (зашифрованный текст) и будет легко анализироваться на узле. Поэтому я не пытался установить его вручную. Спасибо за ответ! – Roberto14

+1

Вы можете проверить это, посмотрев длину зашифрованного текста. Base64 имеет коэффициент раздутия 4/3. Это означает, что фактическая длина зашифрованного текста 'len (b64) * 3/4-paddingChars', которая находится в вашем случае' 24 * 3/4-2 = 18 - 2 = 16'. 16 - размер блока AES, и поскольку CBC является режимом без потоковой передачи, он должен создавать по меньшей мере блок. Таким образом, нет места для IV. –

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