当前位置: 首页 > 知识库问答 >
问题:

如何解密AES加密文件与'-no盐'参数

仰翔
2023-03-14

我是加密新手。这个问题是我上一个问题的子问题。我有一个用OpenSSL util加密的文件:

openssl aes-256-cbc -in fileIn -out fileOUT -p -k KEY

我用这个代码来解密它:

        byte[] encrypted = IOUtils.toByteArray(inputStream);
        Security.addProvider(new BouncyCastleProvider());

        String password = "abc";

        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");

        // Openssl puts SALTED__ then the 8 byte salt at the start of the
        // file. We simply copy it out.
        byte[] salt = new byte[8];
        System.arraycopy(encrypted, 8, salt, 0, 8);
        SecretKeyFactory fact = SecretKeyFactory.getInstance(
                "PBEWITHMD5AND256BITAES-CBC-OPENSSL", "BC");
        c.init(Cipher.DECRYPT_MODE, fact.generateSecret(new PBEKeySpec(
                password.toCharArray(), salt, 100)));

        // Decrypt the rest of the byte array (after stripping off the salt)
        byte[] data = c.doFinal(encrypted, 16, encrypted.length - 16);

而且很有效。但这是一个测试案例。实际情况是,我用以下参数对文件进行了加密:

openssl aes-256-cbc-nosalt-in fileIn-out fileOUT-p-k KEY

请注意,出现了'-no盐'参数。问题是PBEKeySpec需要不为空,也不为空的迭代计数参数。它也有没有这些参数的构造函数,但是如果我使用它,我会得到一个错误:

02-11 11:25:06.108:W/系统。err(2155):java。安全InvalidKeyException:PBE要求设置PBE参数。

问题是如何解密这些文件?如何正确处理'-nosalt'参数?

共有1个答案

东方嘉木
2023-03-14

使用空盐而不是空盐,并相应地设置偏移量

Security.addProvider(new BouncyCastleProvider());

final char[] password = "pass".toCharArray();
final int saltLength = 8;
final String saltedPrefix = "Salted__";

String[] files = { "file0.txt.enc", "file0.txt.enc.nosalt" };
for (String file : files) {
    byte[] encrypted = Files.readAllBytes(Paths.get("testData", "openssl", file));

    byte[] salt = new byte[0];
    int offset = 0;
    if (new String(encrypted, 0, saltLength, "ASCII").equals(saltedPrefix)) {
        salt = new byte[saltLength];
        System.arraycopy(encrypted, saltedPrefix.length(), salt, 0, saltLength);
        offset = saltedPrefix.length() + saltLength;
    }

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHMD5AND256BITAES-CBC-OPENSSL", "BC");
    PBEKeySpec keySpec = new PBEKeySpec(password);
    PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 0);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
    cipher.init(Cipher.DECRYPT_MODE, keyFactory.generateSecret(keySpec), paramSpec);

    byte[] data = cipher.doFinal(encrypted, offset, encrypted.length- offset);
    System.out.println(new String(data));
}
 类似资料:
  • 为什么PHP解密方法不能解密用Java加密的数据? 当我仅使用Java或仅在PHP中加密和解密数据时,一切工作都很好。 加密的数据被发送到服务器,在那里我尝试用PHP openssl_decrypt对其进行解密 不幸的是,openssl_decrypt返回一个空字符串。

  • OpenSSL提供了一个流行的(但不安全-请参见下面!)AES加密的命令行界面: Python以PyCrypto包的形式支持AES,但它只提供了工具。如何使用Python/Pycrypto解密已经使用OpenSSL加密的文件? 这个问题过去也涉及使用相同方案在Python中进行加密。我已经删除了这部分,以阻止任何人使用它。不要再用这种方式加密任何数据,因为按照今天的标准,它是不安全的。您应该只使用

  • 我试图解密AES-128加密的m3u8视频文件,例如: m3u8 文件 : 我尝试过使用openssl: 键.txt包含很长的键 - 我做错了什么?

  • 加密是使用Stanford Javascript加密库(SJCL)完成的。下面是一个完整的加密示例,分为两部分。第一个是关于PBKDF2的基于密码的密钥派生。在第二部分中,使用派生密钥和初始化向量(IV)进行实际加密。注意,salt和IV是硬编码的,以便更容易提供C#解密解决方案。 null 变量的值: SJCL位阵列: 十六进制编码: Base64编码: 变量的值: null AES/CCM解密

  • 我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。 首先,我在Android中生成了对称密钥: 在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(PHP): PHP中的结果: 怎么啦?

  • 我正在尝试用AES加密一个大文件,然后解密,与原件进行比较。 这堂课总结了工作。它适用于.txt文件,但不适用于.mp3、.pdf等文件。 我们将非常感谢你的帮助。