我使用AES加密了java中的数据,并尝试用同样的方法解密javascript格式,但我得到的输出是空字符串,有什么建议吗

xvw2m8pv  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(99)

下面的代码用于加密在java端和加密的数据共享给用户界面,我们需要解密。前端和后端使用相同的密钥和iv。

public static Optional<String> encrypt(String strToEncrypt) {
            try {
                Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
                field.setAccessible(true);
                Field modifiersField = Field.class.getDeclaredField("modifiers");
                modifiersField.setAccessible(true);
                modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
                field.set(null, false);
    
                byte[] keyHex = Hex.decodeHex(secretKey.toCharArray());
                byte[] decodeHex = Hex.decodeHex(ivKey.toCharArray());
                IvParameterSpec ivspec = new IvParameterSpec(decodeHex);
    
                SecretKeySpec secretKeySpec = new SecretKeySpec(keyHex, AES_ENC);
    
                Cipher cipher = Cipher.getInstance(ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
                String encodedToString = Base64.getEncoder()
                        .encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
                System.out.println("ENC:>"+Base64.getDecoder().decode(encodedToString));
                return Optional.ofNullable(encodedToString);
            } catch (Exception e) {
                //log.error("AesUtil : Error occurred while encrypting the data : " + e);
            }
            return Optional.empty();
        }
    
        public static Optional<String> decrypt(String strToDecrypt) {
    
            try {
                Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
                field.setAccessible(true);
                Field modifiersField = Field.class.getDeclaredField("modifiers");
                modifiersField.setAccessible(true);
                modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
                field.set(null, false);
    
                byte[] keyHex = Hex.decodeHex(secretKey.toCharArray());
                byte[] decodeHex = Hex.decodeHex(ivKey.toCharArray());
                IvParameterSpec ivspec = new IvParameterSpec(decodeHex);
    
                SecretKeySpec secretKeySpec = new SecretKeySpec(keyHex, AES_ENC);
    
                Cipher cipher = Cipher.getInstance(ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivspec);
                byte[] decode = Base64.getDecoder().decode(strToDecrypt);
                String finalRes = new String(cipher.doFinal(decode));
                System.out.println(finalRes);
                return Optional.ofNullable(finalRes);
            } catch (Exception e) {
                //log.error("AesUtil : Error occurred while decrypting the data : " + e);
            }
            return Optional.empty();
        }

'下面的代码我试图解密,但它在控制台日志中打印为空,也试图解码js中的数据,并试图解密,但仍然得到相同的空输出。

const decrypt = ()=>{

    var decode  = atob(encrypted);
var decrypted = CryptoJS.AES.decrypt({
    ciphertext: encrypted //decode
 },key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
    console.log(decrypted.toString()); 
    console.log(decrypted.toString(CryptoJS.enc.Utf8));
    
}
x33g5p2x

x33g5p2x1#

var decrypted = CryptoJS.AES.decrypt({
    ciphertext: CryptoJS.enc.Base64.parse(encrypted) //decode
 },CryptoJS.enc.Hex.parse(key), {
    iv: CryptoJS.enc.Hex.parse(iv),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});

相关问题