2016-08-19 2 views
0

Je n'arrive pas à comprendre ce qui cause la différence entre les langues. En Java je:Impossible de convertir le code de décryptage en utilisant Blowfish ECB de Java à Node.js

byte[] buf = Base64.getDecoder().decode("AutMdzthDvPlE+UnhcHa2h4UZGPdme7t"); 
System.out.println(buf.length); 
String key = "" + 2270457870L; 
byte[] keyBytes = key.getBytes("UTF8"); 
System.out.println(keyBytes.length); 

Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, "Blowfish")); 

byte[] newBytes = cipher.doFinal(buf); 
System.out.println(newBytes.length); 
System.out.println(Arrays.toString(newBytes)); 

(runnable en ligne à http://ideone.com/0dXuJL)

Puis, en nœud je me suis tourné cela en:

const buf = Buffer.from("AutMdzthDvPlE+UnhcHa2h4UZGPdme7t"); 
console.log(buf.length); 
const keyBytes = Buffer.from('2270457870', 'utf8'); 
console.log(keyBytes.length); 
const decipher = require('crypto').createDecipher('bf-ecb', keyBytes); 

const buffers = []; 
buffers.push(decipher.update(buf)); 
buffers.push(decipher.final()); 

const newBytes = Buffer.concat(buffers); 
console.log(newBytes.length); 
console.log(newBytes); 

(runnable en ligne à https://tonicdev.com/paulbgd/57b66c8ea0630d1400081ad0)

qui produit la erreur: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

Répondre

2

Il y a e quelques questions ici:

  1. L'encodage de chaîne est manquante pour buf. Par défaut, utf8 est utilisé, mais la chaîne est en réalité codée en base64. Pour remédier à cette utilisation ceci:

    const buf = Buffer.from("AutMdzthDvPlE+UnhcHa2h4UZGPdme7t", "base64"); 
    
  2. Le deuxième argument passé à createDecipher() est un mot de passe , pas une clé. La différence est que createDecipher() hache l'argument de mot de passe (avec MD5) pour générer la clé. Puisque vous avez déjà la clé, ce que vous voulez à la place est createDecipheriv(), qui attend une clé et IV. L'argument IV peut simplement être un tampon de longueur nulle puisque le mode ECB n'utilise pas de IV. Il faut donc utiliser ceci:

    const decipher = require('crypto').createDecipheriv('bf-ecb', keyBytes, Buffer.alloc(0)); 
    

Enfin, si vous voulez faire correspondre la sortie octets de Java, vous pouvez remplacer console.log(newBytes) quelque chose comme ceci:

for (var i = 0; i < newBytes.length; ++i) 
    process.stdout.write(newBytes.readInt8(i) + ' '); 
console.log(); 
+0

Le base64 était juste une erreur que je faite lors de la copie, mais je ne savais pas que createDecipher attendait un mot de passe! Merci beaucoup. – PaulBGD