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

时间:2013-12-14 05:43:56

标签: encryption cbc-mode aescryptoserviceprovider

我正在尝试制作解密逻辑并知道加密字符串已经使用: 键:8d6ea4d3e6f8c4f8641516baa5e42b85 转型:AES / CBC / ISO10126PADDING 盐:1c4dd21d7ba43bdd 迭代次数:0 加密字符串:JO0blEp + nEl5nNhgUqoZRJNecogM1XHIXUCatPOJycs =

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

现在基于我上面提到的这种信息,我正在尝试构建解密逻辑。几个疑惑: 1.使用AES-265时,它可以有128位密钥和64位盐值吗?或者我错误地解释了这些信息。 2.看到加密的字符串,它看起来像是Base64编码的值,我们需要在解密时对其进行解码。我的理解是否正确? 3.下面是我正在编写的解密逻辑,它给出了错误:“javax.crypto.BadPaddingException:给定最终块未正确填充”当我调用doFinal()函数时。 从最近三天开始我就被打到了这里:(。你能指出或给我一些确切的代码,用于在这里用信息进行解密:

    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));   
        }
    }

1 个答案:

答案 0 :(得分:-1)

首先观察几点:

  • 你说它是 AES256 (使用 256位键),但你的密钥看起来可能是32位十六进制数字,它提供 128位< / strong>关键数据。

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

  • 您谈论 0次迭代,但迭代不是您为AES指定的,并且它不会为0.

我的猜测是你的密钥实际上是用来生成密钥的密码。 Somethig喜欢:

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

看看这个问题的答案:Java 256-bit AES Password-Based Encryption