моя проблема в том, что я кодирую строку в PHP с модулем m_crypt в aes-256-cbc с base64 следующим образом:
function encrypt($data) { if(32 !== strlen($this->secret)) $this->secret = hash('SHA256', $this->secret, true); $padding = 16 - (strlen($data) % 16); $data .= str_repeat(chr($padding), $padding); $encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->secret, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)); return base64_encode($encrypt); }
Где $ this-> secret – это 32-разрядный ключ aes, а $ data – это строка, которую я хочу зашифровать.
Это отлично работает, текст зашифрован и отправляется на сервер без каких-либо проблем (я проверил это дважды!), И теперь я хочу декодировать все это с помощью Node.JS следующим образом:
var decipher = Core.crypto.createDecipher('aes-256-cbc', rows[0]['sessionkey']); decipher.update(body.user, 'base64', 'utf8'); var user = decipher.final('utf8');
Где Core.crypto является требованием вызова нормального криптового модуля в Node.JS, строки [0] ['sessionkey'] – это ключ, используемый для шифрования, полученного с помощью запроса mysql, и body.user – это зашифрованная строка PHP по почте ,
Как я уже упоминал, все работает отлично, за исключением этой маленькой дециптической вещи … я искал google и все, и попробовал образец кода, но кажется, что что-то с моим кодом не так.
Хорошо, я сам это понял. Я забыл установить iv при расшифровке сообщения в Node.js, рабочий код выглядит следующим образом:
var key = new Buffer(rows[0]['sessionkey'], 'binary'); function decipher(key, data) { var decipher = Core.crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16)); decipher.update(data, 'base64', 'utf8'); return decipher.final('utf8'); }
Надеюсь, это поможет любому в будущем!
С наилучшими пожеланиями