使用带有密钥和盐值的 AES 256 进行解密

问题描述 投票:0回答:1

我正在尝试制作解密逻辑并知道加密的字符串是使用以下方法制作的: 密钥:8d6ea4d3e6f8c4f8641516baa5e42b85 转换:AES/CBC/ISO10126PADDING 盐:1c4dd21d7ba43bdd 迭代次数:0 加密字符串:JO0blEp+nEl5nNhgUqoZRJNecogM1XHIXUCatPOJycs=

此处给出了密钥和盐的示例。要点是显示我拥有此数据的格式。加密方法基于 JDK 的默认 JCE 提供程序 (SunJCE)。

现在根据我上面的信息,我正在尝试构建解密逻辑。几个疑问: 1. 由于使用了AES-265,它可以有128位Key和64位salt值吗?或者我错误地解释了这些信息。 2.看到加密后的字符串,看起来是Base64编码的值,我们需要在解密的同时对其进行解码。我的理解正确吗? 3. 下面是我正在编写的解密逻辑,当我调用 doFinal() 函数时,该逻辑给出错误:“javax.crypto.BadPaddingException:给定的最终块未正确填充”。 过去三天我在这里感到震惊:(。您能否指出或给我此处用于解密的确切代码并提供信息:

    public static void main(String[] args) throws Exception
 {
        String encstring = "JO0blEp+nEl5nNhgUqoZRJNecogM1XHIXUCatPOJycs=";           
        String salt1 = "1c4dd21d7ba43bdd";
        String keyStr = "8d6ea4d3e6f8c4f8641516baa5e42b85";


        byte[] keyBytes = Hex.decodeHex(keyStr.toCharArray());

        SecretKey secret2 = new SecretKeySpec(keyBytes, "AES");

        byte[] iv = new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
        AlgorithmParameterSpec params = new IvParameterSpec(iv);


        Cipher cipher2 = Cipher.getInstance("AES/CBC/ISO10126PADDING", "SunJCE");


        cipher2.init(Cipher.DECRYPT_MODE, secret2, params);  
        byte[] encryptedString = Base64.decodeBase64(encstring.getBytes());
        byte[] plaintext1 = cipher2.doFinal(encryptedString);

        System.out.println(new String(plaintext));   
        }
    }
java encryption cbc-mode aescryptoserviceprovider
1个回答
0
投票

首先一些观察:

  • 您说它是AES256(使用256位密钥),但您的密钥看起来可能是32个十六进制数字,它提供了128位密钥数据。

  • 你说你有,但 AES 不使用盐。而且您实际上并没有在代码中使用盐。

  • 你谈论0迭代,但迭代不是你指定给AES的,它也不会是0。

我的猜测是你的密钥实际上是用于生成密钥的密码。 类似:

   SecretKeyFactory factory = SecretKeyFactory.getInstance(algorithm);
   KeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
   SecretKey theKey = factory.generateSecret(spec);

查看此问题的答案:Java 256 位 AES 基于密码的加密

© www.soinside.com 2019 - 2024. All rights reserved.