AES算法Java / Java Script中的128位密钥问题

我需要使用用户选择密钥加密我的Java代码中的值,并解密Java脚本模块中的值。

下面是我加密值的Java代码。 这里我从用户选择键生成128位密钥值,同样用于加密值。

String plainText = "Hello, World! This is a Java/Javascript AES test."; try { byte[] rawKey = getRawKey("12345".getBytes()); SecretKey key = new SecretKeySpec(rawKey, "AES"); AlgorithmParameterSpec iv = new IvParameterSpec( Base64.decodeBase64("5D9r9ZVzEYYgha93/aUK2w==")); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); System.out.println(Base64.encodeBase64String(cipher .doFinal(plainText.getBytes("UTF-8")))); } catch (Exception e) { e.printStackTrace(); System.out.println("Exception in crypto..."); } public static byte[] getRawKey(byte[] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(seed); kgen.init(128, sr); // 192 and 256 bits may not be available SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); String s = new String(raw); System.out.println("raw key.." + raw); return raw; } 

以上代码打印以下值:

 raw key..[B@45b9ce4b vN2GouJcVli/rFMDHEwCNZejraO5cQxBtlo5D64qkaRTkxxRTIo+Vm38H4fUZp7ABxj7ul0Ha6bO5aFxMzMY0g== 

当我在JS代码中使用上述值进行解密时,我没有得到任何响应。

     var encrypted = CryptoJS.enc.Base64.parse('vN2GouJcVli/rFMDHEwCNZejraO5cQxBtlo5D64qkaRTkxxRTIo+Vm38H4fUZp7ABxj7ul0Ha6bO5aFxMzMY0g=='); var key = CryptoJS.enc.Base64.parse('[B@45b9ce4b'); var iv = CryptoJS.enc.Base64.parse('5D9r9ZVzEYYgha93/aUK2w=='); document.write(CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt( { ciphertext: encrypted }, key, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: iv, })));    

hsd h

请指出我如果我的代码中有任何遗漏或请建议我,如果有任何替代产生相同的结果。

您的密钥在JS代码中不正确。 在您的Java代码中,您使用byte[]作为参数调用System.out.println() ,这将不会为您提供有意义的输出。 [B@45b9ce4b无效Base64数据。

要解决此问题,您需要将表示键的byte[]和Base64编码为String,然后打印字符串。

对密钥生成的评论:

您应该避免使用随机数生成器从用户输入(即密码)派生密钥材料。 从用户输入创建密钥材料的正确方法是使用密钥拉伸算法。

你应该绝对使用标准算法,如PBKDF2 。 在Java中,您可以通过SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")获得密钥工厂;