Java - AES CBC 算法生成 SecretKeySpec 的不同方式

标签 java encryption aes caesar-cipher encryption-asymmetric

我正在尝试实现AES CBC 256算法。经过在线学习和检查一些代码示例后,我意识到有两种不同的方法来检索 SecretKeySpec 并且都会产生不同的加密消息。

    private static SecretKeySpec getSecretKeySpec(String secretKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        String salt = "a";
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        return new SecretKeySpec(tmp.getEncoded(), "AES");
    }

//    private static SecretKeySpec getSecretKeySpec(String secretKey) throws NoSuchAlgorithmException {
//
//        MessageDigest digest = MessageDigest.getInstance("SHA-256");
//        digest.update(secretKey.getBytes(StandardCharsets.UTF_8));
//        byte[] keyBytes = new byte[32];
//        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
//        return new SecretKeySpec(keyBytes, "AES");
//    }

    public static String encrypt(String strToEncrypt, String secret)
    {
        try
        {
            byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            IvParameterSpec ivspec = new IvParameterSpec(iv);
            SecretKeySpec secretKeySpec = getSecretKeySpec(secret);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
        }
        catch (Exception e)
        {
            System.out.println("Error while encrypting: " + e.toString());
        }
        return null;
    }

请问有人可以告诉我哪一个是 AES CBC 256 位加密的正确实现吗?

最佳答案

AES 和 CBC 没有指定任何有关如何派生 key 的信息。任何 128、192 和 256 位 key 均有效。使用 PBKDF2WithHmacSHA256 等实际 key 派生函数比单次传递 SHA-256 更适合减缓暴力攻击,但除​​此之外,它们都会生成有效 key 。

关于Java - AES CBC 算法生成 SecretKeySpec 的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61068044/

相关文章:

java - IntelliJ 正在运行旧的类文件

javascript - 用户回来时如何恢复 webview Activity

java - 雪花集成测试实现

java - Java 中的替代密码

java - Singleton 读取 Java Web 应用程序中的属性文件;正确的做法?

javax.crypto.BadPaddingException : Decryption error when i try to dectrypt RSA string with private key

java - AES解密NodeJs中的文件

c++ - 将 AES 密文作为参数传递

python aes 加密/解密不返回相同的结果

php - 在 PHP 中确定性地从密码派生 32 字节 key