我是Java和JS方面的新手,并尝试在java中加密密码,这应该由我现有的JS代码解密。 (不想改变我的 JS!)

我认为这与KEY和IV有关,我完全不知道。

** JAVA 程序 **

public class Helper { 
 
public Cipher dcipher, ecipher; 
 
// Responsible for setting, initializing this object's encrypter and 
// decrypter Chipher instances 
public Helper(String passPhrase) { 
 
    // 8-bytes Salt 
    byte[] salt = {(byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x34, (byte) 0xE3, (byte) 0x03}; 
 
    // Iteration count 
    int iterationCount = 19; 
 
    try { 
        // Generate a temporary key. In practice, you would save this key 
        // Encrypting with DES Using a Pass Phrase 
        KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount); 
        SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec); 
 
        ecipher = Cipher.getInstance(key.getAlgorithm()); 
 
        // Prepare the parameters to the cipthers 
        AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); 
        ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);             
 
    } catch (InvalidAlgorithmParameterException e) { 
        System.out.println("EXCEPTION: InvalidAlgorithmParameterException"); 
    } catch (InvalidKeySpecException e) { 
        System.out.println("EXCEPTION: InvalidKeySpecException"); 
    } catch (NoSuchPaddingException e) { 
        System.out.println("EXCEPTION: NoSuchPaddingException"); 
    } catch (NoSuchAlgorithmException e) { 
        System.out.println("EXCEPTION: NoSuchAlgorithmException"); 
    } catch (InvalidKeyException e) { 
        System.out.println("EXCEPTION: InvalidKeyException"); 
    } 
} 
 
// Encrpt Password 
@SuppressWarnings("unused") 
public String encrypt(String str) { 
    try { 
        // Encode the string into bytes using utf-8 
        byte[] utf8 = str.getBytes("UTF8"); 
        System.out.println("\n UTF8 : " + utf8); 
        // Encrypt 
        byte[] enc = ecipher.doFinal(utf8); 
        System.out.println("\n enc: " + enc); 
        // Encode bytes to base64 to get a string 
        return new sun.misc.BASE64Encoder().encode(enc); 
 
    } catch (BadPaddingException e) { 
    } catch (IllegalBlockSizeException e) { 
    } catch (UnsupportedEncodingException e) { 
    } 
    return null; 
} 
 
 
public static void main(String[] args) { 
    try { 
 
        Helper encrypter = new Helper(""); 
 
        System.out.print("Enter a password : "); 
        String password = input.nextLine(); 
 
        String encrypted = encrypter.encrypt(password); 
        System.out.println("encrypted String:" + encrypted); 
    } catch (Exception e) { 
    } 
 
} 

}

上面的程序应该加密 key - 将通过以下 JS 解密:

var encryptedpassword=this.bodyParams.password; 
 
        var bytes  = CryptoJS.AES.decrypt(encryptedpassword.toString(), accKey); 
        var newpassword = bytes.toString(CryptoJS.enc.Utf8); 

WHERE accKey = "Nqnzu3RhCJ1h8ql5fdKOaKUAbsuURze*********_

请您参考如下方法:

您的问题是您使用 DES 加密并使用 AES 解密。

此外,您还可以根据 Java 代码上的密码生成 key ,但直接在 JavaScript 代码上使用它。

您在 Java 端使用了 salt,但似乎没有在消息中包含 salt。有了盐+密码,您就可以恢复 key 和iv。

您将需要寻找另一组在两端使用 AES 的示例,它们以相同的方式生成 key ,并使用相同的填充。

类似的事情:

// Generate a temporary key. In practice, you would save this key 
// Encrypting with AES Using a Pass Phrase 
 KeySpec keySpec = new PBEKeySpec(password.toCharArray(), saltBytes, 100, 128); 
 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
 SecretKey aesKey = keyFactory.generateSecret(keySpec); 
ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
 
// Prepare the parameters to the cipthers 
IvParameterSpec ivParameterSpec = new IvParameterSpec(aesKey.getEncoded()); 
ecipher.init(Cipher.ENCRYPT_MODE, aesKey, ivParameterSpec); 

正如评论中提到的,您还需要考虑使用 TLS 进行通信,因为在 JS 端保护对称加密 key /密码相当困难。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!