Convertendo o PBEWithMD5AndDES do Java em JavaScript

Estou tentando replicar o código Java em JavaScript. abaixo está meu código Java:

public static String encrypt(String input) final byte[] SALT= { (byte) 0x21, (byte) 0x21, (byte) 0xF0, (byte) 0x55, (byte) 0xC3, (byte) 0x9F, (byte) 0x5A, (byte) 0x75 }; final int ITERATION_COUNT = 31; { if (input == null) { throw new IllegalArgumentException(); } try { KeySpec keySpec = new PBEKeySpec(null, SALT, ITERATION_COUNT); AlgorithmParameterSpec paramSpec = new PBEParameterSpec(SALT, ITERATION_COUNT); SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec); Cipher ecipher = Cipher.getInstance(key.getAlgorithm()); ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); byte[] enc = ecipher.doFinal(input.getBytes()); String res = new String(Base64.encodeBase64(enc)); // escapes for url res = res.replace('+', '-').replace('/', '_').replace("%", "%25").replace("\n", "%0A"); LOGGER.info("String Encrypted Successfully"); return res; } catch (Exception e) { LOGGER.error("encrypt Exception: "+e.getMessage()); } return ""; } 

e o código JavaScript, até agora, está abaixo:

 var encrypt = function(){ var iterations = 31; var key = CryptoJS.MD5("PBEWithMD5AndDES"); var salt = CryptoJS.enc.Hex.parse('0021002100f0005500C3009F005A0075'); var options = { mode: CryptoJS.mode.CBC, iv: salt }; var hashedPassword = CryptoJS.MD5($scope.data.webPassword); var encryptedPassword = CryptoJS.DES.encrypt(hashedPassword, key,options).toString(); var result = encryptedPassword.toString(CryptoJS.enc.Base64); } 

mas com a criptografia, a string codificada que estou obtendo é diferente.

PBEwithMD5andDES é uma tecnologia obsoleta e não deve ser usada hoje em dia. Essa resposta é fornecida apenas para fins de demonstração.

PBEwithMD5andDES é definido no PKCS # 5 v1.5 que nada mais é do que derivar chave + IV usando PBKDF1 (com MD5) e criptografar com DES.

 var password = CryptoJS.enc.Utf8.parse("test"); var salt = CryptoJS.enc.Hex.parse("2121F055C39F5A75"); var iterations = 31; // PBE according to PKCS#5 v1.5 (in other words: PBKDF1) var md5 = CryptoJS.algo.MD5.create(); md5.update(password); md5.update(salt); var result = md5.finalize(); md5.reset(); for(var i = 1; i < iterations; i++) { md5.update(result); result = md5.finalize(); md5.reset(); } // splitting key and IV var key = CryptoJS.lib.WordArray.create(result.words.slice(0, 2)); var iv = CryptoJS.lib.WordArray.create(result.words.slice(2, 4)); var encrypted = CryptoJS.DES.encrypt("test", key, { iv: iv }); enchex.innerHTML = encrypted.ciphertext.toString(); encbase64.innerHTML = encrypted.ciphertext.toString(CryptoJS.enc.Base64); 
   
Hex:
Base64: