Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AES-256(CBC):Java加密/JavaScript解密(CryptoJS)_Javascript_Java_Aes_Sha256_Cbc Mode - Fatal编程技术网

AES-256(CBC):Java加密/JavaScript解密(CryptoJS)

AES-256(CBC):Java加密/JavaScript解密(CryptoJS),javascript,java,aes,sha256,cbc-mode,Javascript,Java,Aes,Sha256,Cbc Mode,我正在用Java进行加密,并用JavaScript使用AES-256/CBC对其进行解密,但实际上情况是这样的: 当对.pdf,.jpg进行加密时,换句话说,除了文本文件之外,Java生成的加密文件的字节数大致相同,但在JavaScript()的情况下,它输出的文件大小约为原始文件大小的1.5倍,这就是为什么我认为使用它进行解密时,不会期望Java提供较小的加密文件大小。我已经给出了两方面的代码,即Java端的加密,JavaScript端的解密 问题: 我需要用Java加密任何文件,用JavaS

我正在用Java进行加密,并用JavaScript使用AES-256/CBC对其进行解密,但实际上情况是这样的: 当对.pdf.jpg进行加密时,换句话说,除了文本文件之外,Java生成的加密文件的字节数大致相同,但在JavaScript()的情况下,它输出的文件大小约为原始文件大小的1.5倍,这就是为什么我认为使用它进行解密时,不会期望Java提供较小的加密文件大小。我已经给出了两方面的代码,即Java端的加密,JavaScript端的解密

问题

我需要用Java加密任何文件,用JavaScript解密同一个文件。请参考下面给出的代码和本文件

Java:Encryption

  • 密钥生成:

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
     SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
     KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), hex(salt), iterationCount, keySize);
     SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
    
  • 加密:

    参数:

    private static final String IV = "F27D5C9927726BCEFE7510B1BDD3D137";
    private static final String SALT = "3FF2EC019C627B945225DEBAD71A01B6985FE84C95A70EB132882F88C0A59A55";
    private static final int KEY_SIZE = 128;
    private static final int ITERATION_COUNT = 10000;
    private static final String PASSWORD = "SET_YOUR_PASSWORD_HERE";
    
    代码:


  • 欢迎来到SO!看来你的代码是有效的。你能指定哪一个是你的问题吗?当我用CryptoJS解密java加密文件时,它会显示错误“格式错误的UTF-8数据”,根据我的谷歌搜索,这意味着该文件加密不好,但java对其进行了加密,java中的解码输出原始文件。所以我很困惑为什么JavaScript中会出现这个错误(JavaScript本身就是真实的代码)。大多数人都在考虑这个问题,如果不清楚,他们会选择下一个问题。你为什么要把密文重新编码?它已经被base64编码用于传输,因此您应该在那里解码它,而不是再次编码。
    public String encrypt(String salt, String iv, String passphrase, String plaintext) {
        try {
            SecretKey key = generateKey(salt, passphrase);
            byte[] encrypted = doFinal(Cipher.ENCRYPT_MODE, key, iv, plaintext.getBytes("UTF-8"));
            return base64(encrypted);
        } catch (Exception e) {
            throw fail(e);
        }
    }
    private byte[] doFinal(int encryptMode, SecretKey key, String iv, byte[] bytes) {
        try {
            cipher.init(encryptMode, key, new IvParameterSpec(hex(iv)));
            return cipher.doFinal(bytes);
        } catch (InvalidKeyException |
            InvalidAlgorithmParameterException |
            IllegalBlockSizeException |
            BadPaddingException e) {
            throw fail(e);
        }
    }
    public static String base64(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes);
    }
    public static byte[] base64(String str) {
        return Base64.getDecoder().decode(str);
    }
    protected static byte[] hex(String str) {
        try {
            return decodeHex(str.toCharArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return new byte[0];
    }
    public static byte[] decodeHex(char[] data) throws Exception {
        int len = data.length;
        if ((len & 1) != 0) {
            throw new Exception("Odd number of characters.");
        } else {
            byte[] out = new byte[len >> 1];
            int i = 0;
    
            for (int j = 0; j < len; ++i) {
                int f = toDigit(data[j], j) << 4;
                ++j;
                f |= toDigit(data[j], j);
                ++j;
                out[i] = (byte)(f & 255);
            }
    
            return out;
        }
    }
    protected static int toDigit(char ch, int index) throws Exception {
        int digit = Character.digit(ch, 16);
        if (digit == -1) {
            throw new Exception("Illegal hexadecimal character " + ch + " at index " + index);
        } else {
            return digit;
        }
    }
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
    
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4) +
                Character.digit(s.charAt(i + 1), 16));
        }
        return data;
    }
    private IllegalStateException fail(Exception e) {
        return new IllegalStateException(e);
    }
    
    var cipherParams = CryptoJS.lib.CipherParams.create({
      ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
    });
    
    var decrypted = CryptoJS.AES.decrypt(
       cipherParams,
       key,
       { iv: CryptoJS.enc.Hex.parse(iv) });
    
    var plaintext = decrypted.toString(CryptoJS.enc.Utf8);