Javascript 加密JS加密Java解密

Javascript 加密JS加密Java解密,javascript,java,encryption,Javascript,Java,Encryption,在我的javascript中,我有以下代码: var encrypted = CryptoJS.AES.encrypt("Message that I am trying to send !", k, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv:i }); console.log("Cipher Text"); console.log(encrypted.ciphertext.toString(Cryp

在我的javascript中,我有以下代码:

      var encrypted = CryptoJS.AES.encrypt("Message that I am trying to send !", k, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv:i });
    console.log("Cipher Text");
console.log(encrypted.ciphertext.toString(CryptoJS.enc.Base64));
 //prints out: 1e9z0zjI9MGBLW6AdLE+BiVnv9R9lDAS+SmSkX/Ufx7zTHOVanpiwd4IC2XejJaq
    console.log("Key: " + k);
//prints out f7710e2bcf419dab
    console.log("Iv: " + i);
// prints out 42d39acea111ceb2
以下是我在java端的解密代码:

 import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
    import java.security.Security;
    import java.security.spec.AlgorithmParameterSpec;

    import org.apache.commons.codec.binary.BaseNCodec;
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String encrypted = "1e9z0zjI9MGBLW6AdLE+BiVnv9R9lDAS+SmSkX/Ufx7zTHOVanpiwd4IC2XejJaq";
             SecretKey key = new SecretKeySpec("f7710e2bcf419dab".getBytes("UTf-8"), "AES");
                AlgorithmParameterSpec iv = new IvParameterSpec("42d39acea111ceb2".getBytes("UTf-8"));
                byte[] decodeBase64 = Base64.decodeBase64(encrypted);

                Cipher cipher = null;
                try {
                    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    cipher.init(Cipher.DECRYPT_MODE, key, iv);
                } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

              try {
                 String s = new String(cipher.doFinal(decodeBase64).toString());
                System.out.println(s);
            } catch (IllegalBlockSizeException | BadPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

当我在java端解密时,它会立即抛出一个执行选项“javax.crypto.BadPaddingException:Given final block not ally padded”,我最初的观察结果是,我在加密端的填充是Pkcs7,而在java端的填充是PKCS5。我一直在网上搜索,填充物似乎可以互换?有人能解释一下我做错了什么吗

不确定这是否是您的问题,但不建议使用
String.getBytes
而不指定
Charset
,因为这将使用JVM的默认字符集,这些字符集可能因机器而异。尝试使用
String.getBytes(“UTF-8”)
来代替。这一点很好。我已经根据您的UTF-8建议更新了代码,重新运行了它,但仍然是相同的
“javax.crypto.BadPaddingException:给定的最后一个块没有正确填充”
我将更新我问题中的代码,使其反映UTF-8。是您的CryptoJS代码导致了这个问题。ciohertext输出不正确。在问题中包括您的钥匙和IV。它们采用十六进制编码,但使用十六进制字符的实际字节值作为键,这令人困惑。如果这让人困惑,请澄清并道歉。我在问题中包括了钥匙和iv。它的注释就在console.log输出下面。听起来你的问题是我如何生成密钥和IV。对吗?检查diff
AES/CBC/PKCS5Padding
padding:CryptoJS.pad.Pkcs7
不确定这是否是你的问题,但是使用
String.getBytes
而不指定
Charset
是非常不鼓励的,因为这将使用JVM的默认字符集,这些字符集可能因机器而异。尝试使用
String.getBytes(“UTF-8”)
来代替。这一点很好。我已经根据您的UTF-8建议更新了代码,重新运行了它,但仍然是相同的
“javax.crypto.BadPaddingException:给定的最后一个块没有正确填充”
我将更新我问题中的代码,使其反映UTF-8。是您的CryptoJS代码导致了这个问题。ciohertext输出不正确。在问题中包括您的钥匙和IV。它们采用十六进制编码,但使用十六进制字符的实际字节值作为键,这令人困惑。如果这让人困惑,请澄清并道歉。我在问题中包括了钥匙和iv。它的注释就在console.log输出下面。听起来你的问题是我如何生成密钥和IV。对吗?检查diff
AES/CBC/PKCS5Padding
padding:CryptoJS.pad.Pkcs7