【问题标题】:Decryption using AES 256 with key and salt values using Java使用 AES 256 解密,使用 Java 的密钥和盐值
【发布时间】:2013-12-14 05:43:55
【问题描述】:

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

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

现在基于我上面的这些信息,我正在尝试构建解密逻辑。几个疑问: 1. 使用AES-265,可以有128位的Key和64位的salt值吗?或者我错误地解释了信息。 2.看到加密后的字符串,看起来是Base64编码的值,需要边解密边解码。我的理解正确吗? 3. 下面是我正在编写的解密逻辑,它在调用 doFinal() 函数时给出错误:“javax.crypto.BadPaddingException: Given final block not proper padded”。 从过去的三天开始我就被打动了:(。你能指出或给我这里用于解密的确切代码吗?有信息:

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

【问题讨论】:

    标签: encryption cbc-mode aescryptoserviceprovider


    【解决方案1】:

    首先观察几点:

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

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

    • 你说的是 0 次迭代,但迭代不是你指定给 AES 的东西,它不会是 0。

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

       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

    【讨论】:

    • 您好,根据建议我修改了代码。但仍然没有运气。我得到了同样的错误:“javax.crypto.BadPaddingException:给定最终块没有正确填充。您能否指出以下代码中是否存在任何问题或任何建议:
    • 有太多未知数,您需要 100% 正确才能进行解密。 BadPaddingException 只是解密时出现问题的症状。除非您可以获得有关如何进行加密的确切信息,否则您将无法成功解密。您拥有的密钥是什么.. 是密码还是实际密钥.. 如果密钥看起来是 128 位(而不是 256 位),那么为什么您有盐以及迭代是什么?此外,在 CBC 模式下运行,您需要知道 IV 的确切值。
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 2011-09-26
    • 1970-01-01
    • 2014-11-19
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    相关资源
    最近更新 更多