将Java的PBEWithMD5AndDES转换为JavaScript
我正在尝试用JavaScript复制Java代码。 下面是我的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 ""; }
和JavaScript代码,到目前为止,下面是:
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); }
但是对于加密,我得到的编码字符串是不同的。
PBEwithMD5andDES是过时的技术,现在不应该使用。 此答案仅用于演示目的。
PBEwithMD5andDES在PKCS#5 v1.5中定义,它只不过是使用PBKDF1(使用MD5)导出密钥+ IV并使用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:
- Tomcat(7,8)无法以java.lang.ClassNotFoundException开头:org.apache.tomcat.util.res.StringManager
- JTable标头中的多个可编辑行