首页 >Java >java教程 >如何使用 AES 在 Java 中解密 OpenSSL 加密的文件?

如何使用 AES 在 Java 中解密 OpenSSL 加密的文件?

Barbara Streisand
Barbara Streisand原创
2024-12-03 08:42:11193浏览

How to Decrypt OpenSSL-Encrypted Files in Java using AES?

使用 JAVA 和 AES 解密 OpenSSL 加密的文件

在 UNIX 中,您可以使用以下 OpenSSL 命令加密文件:

openssl aes-256-cbc -a -salt -in password.txt -out password.txt.enc

要在 JAVA 中解密此文件,您无法复制确切的 UNIX 命令。相反,您必须遵循不同但实用的解密方法。

JAVA 实现

下面是一个 Java 代码片段,演示了如何使用解密 OpenSSL 加密的文件AES:

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.List;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.util.encoders.Base64;

public class OpenSSLDecryptor {
    private static final Charset ASCII = Charset.forName("ASCII");
    private static final int INDEX_KEY = 0;
    private static final int INDEX_IV = 1;
    private static final int ITERATIONS = 1;

    private static final int ARG_INDEX_FILENAME = 0;
    private static final int ARG_INDEX_PASSWORD = 1;

    private static final int SALT_OFFSET = 8;
    private static final int SALT_SIZE = 8;
    private static final int CIPHERTEXT_OFFSET = SALT_OFFSET + SALT_SIZE;

    private static final int KEY_SIZE_BITS = 256;

    ...

    public static void main(String[] args) {
        ...
        // Parse command-line arguments
        File f = new File(args[ARG_INDEX_FILENAME]);

        // Read and decode base 64 encoded file
        String dataBase64 = new String(Files.readAllBytes(f.toPath()), ASCII);
        byte[] headerSaltAndCipherText = Base64.decode(dataBase64);

        ...

        // Decrypt the file using the provided password and encryption parameters
        byte[] decrypted = aesCBC.doFinal(encrypted);

        // Convert decrypted bytes to a string and print the result
        String answer = new String(decrypted, ASCII);
        System.out.println(answer);
    }
}

此代码利用 EVP_BytesToKey 方法来派生加密密钥和初始化向量(IV) 基于给定的密码。然后使用 Cipher 类以 CBC 模式和 PKCS5 填充执行 AES 解密。

附加说明

  • 注意字符集: 确保代码使用 OpenSSL 命令中指定的相同字符集(在此为 ASCII)
  • 考虑 NIST 批准的 PBKDF2:它比默认的 OpenSSL 密码派生方法更安全。
  • 注意摘要算法的更改 :OpenSSL 版本可能使用不同的摘要算法,因此请在命令行界面和 Java 中显式指定摘要代码。

以上是如何使用 AES 在 Java 中解密 OpenSSL 加密的文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn