2011-12-27 17 views
5

Estoy intentando decodificar el siguiente texto cifrado codificado en base 64 en Node.js con el incorporado en la biblioteca de criptografíaDescifrado pez globo-BCE con cripto nodejs vs mcrypt de php

2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A== 

Parece que funciona con mcrypt de PHP funciones usando la cadena typeconfig.sys^_- como la clave, como se muestra ingresando el valor en http://www.tools4noobs.com/online_tools/decrypt/ y seleccionando decodificación Blowfish, ECB, Base64.

Sin embargo, cuando ejecuto el código siguiente en Node.js:

var crypto = require('crypto'); 
var data = "2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A=="; 
var decipher = crypto.createDecipher('bf-ecb', 'typeconfig.sys^_-'); 
data = decipher.update(data, "base64", "utf8"); 
data += decipher.final("utf8"); 
console.log(data); 

consigo la producción de basura:

y 
�:����d�(����Q�i��z1��4�� �k�(� ��a5����u��73c/��(ֻ��)��������fȠ��� 
                   �ec�-<z�8����(�-L���ԛ�I��1L*��u�4�j-�Чh쭊@\P)?޼�.�^���q㊬�U���W&�x��85�T-ג9,dE<g}�`*� 
��|@����k"�!�D'u���,x��7���� 
       ��9q=q�q��ա>�w�T����H3͜�i)R��zy��C�� 
                ��o� 

También he intentado una prueba de la propia biblioteca, en la que parece ser capaz de manejar las cosas que codifica propio bien:

var crypto = require('crypto') 
var cipher = crypto.createCipher("bf-ecb", "key"); 
var data = cipher.update("foobar", "utf8", "base64"); 
data += cipher.final("base64"); 
console.log(data); 
var decipher = crypto.createDecipher("bf-ecb", "key"); 
data = decipher.update(data, "base64", "utf8"); 
data += decipher.final("utf8"); 
console.log(data); 

produce:

y0rq5pYkiU0= 
foobar 

pero copiar y pegar esa cadena de base 64 y la introducción en http://www.tools4noobs.com/online_tools/decrypt/ junto con la "clave" clave produce una salida de basura también.

¿No deberían estas dos bibliotecas producir el mismo resultado, o hay algo que he hecho mal?

+0

La documentación para Node.js y PHP mcrypt no son claras, pero parece Node.js utiliza una función de derivación de claves, mientras que mcrypt utiliza la clave tal cual. Como Node.js implementa PBKDF2, supongo que es su algoritmo clave de derivación, pero no veo cómo especificar los parámetros. Debe averiguar los parámetros que utiliza, luego derivar una clave dada su contraseña, y usar esa clave en el lado de PHP. – erickson

+0

Ah, también, he notado en el código de Node.js que funciona, usted usa 'createCipher()' para encriptar * y * descifrar, mientras que en su código original, que no funciona, está usando 'createDecipher()'. – erickson

+0

@erickson sí, el 'createCipher' dos veces fue un error tipográfico, lo siento .. Mi problema es que estoy tratando de ser compatible con otro servicio que requiere esa clave cruda específica (vea la primera cadena codificada en base64 para el ejemplo), así que la respuesta ayuda a explicar la diferencia entre los dos, en realidad no me ayuda a decodificar y codificar lo que necesito. –

Respuesta

5

Node.js calcula el hash MD5 de la contraseña antes de usarla como clave. Por lo que puedo decir, mcrypt usa la clave tal como está.

Calcule el hash MD5 de la contraseña y utilícela como la clave mcrypt.

+4

Parece que fue un impulso suficiente en la dirección correcta. 'createCipher' y' createDecipher' usan un hash MD5 de la clave, mientras que 'createCipheriv' y' createDecipheriv' usan la clave sin procesar y la IV proporcionada. Cambiar el código para usar 'crypto.createDecipheriv ('bf-ecb', 'typeconfig.sys^_-', '')' lo hace funcionar ahora. ¡Gracias! –

+0

@erickson ¿Alguna idea sobre esta pregunta? http://stackoverflow.com/questions/37825261/php-warning-mcrypt-generic-init-iv-size-is-incorrect-supplied-length-12-n –

2

https://github.com/tugrul/node-mcrypt

var mcrypt = require('mcrypt'); 

var bfEcb = new mcrypt.MCrypt('blowfish', 'ecb'); 

bfEcb.open('typeconfig.sys^_-'); 

var cipherText = new Buffer('2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==', 'base64'); 

console.log(bfEcb.decrypt(cipherText).toString()); 

bfEcb.close();