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

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

Patricia Arquette
发布: 2024-12-14 04:44:09
原创
554 人浏览过

How to Decrypt a File Encrypted with OpenSSL's AES-256-CBC in Java?

在 Java 中解密使用 OpenSSL 的 AES-256-CBC 算法加密的文件

问题陈述

要解密使用 OpenSSL 命令加密的文件:

openssl aes-256-cbc -a -salt -in password.txt -out password.txt.enc
mypass
mypass
登录后复制

OpenSSL 的加密Process

OpenSSL 通常采用特定的基于密码的密钥派生方法 (EVP_BytesToKey) 并对密文进行 Base64 编码。该过程的伪代码如下:

salt = random(8)
keyAndIV = BytesToKey(password, salt, 48)
key = keyAndIV[0..31]
iv = keyAndIV[32..47]
ct = AES-256-CBC-encrypt(key, iv, plaintext)
res = base64MimeEncode("Salted__" | salt | ct))
登录后复制

而解密过程为:

(salt, ct) = base64MimeDecode(res)
keyAndIV = BytesToKey(password, salt, 48)
key = keyAndIV[0..31]
iv = keyAndIV[32..47]
pt = AES-256-CBC-decrypt(key, iv, plaintext)
登录后复制

Java实现

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) {
        try {
            // ... (Same code as provided in the reference answer)
        } catch (Exception e) {
            // ... (Same catch blocks as provided in the reference answer)
        }
    }
}
登录后复制

注意事项

  • 代码假设字符集为ASCII,可能需要根据具体情况进行调整要求。
  • 建议使用自定义 PBKDF2 实现来增强安全性。
  • 代码中 MD5 摘要的选择应替换为 SHA-256 或在 OpenSSL 命令中明确指定避免兼容性问题。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板