Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java解密AES加密文件_Java_Key_Aes_Encryption - Fatal编程技术网

用java解密AES加密文件

用java解密AES加密文件,java,key,aes,encryption,Java,Key,Aes,Encryption,我有一个使用AES用java应用程序加密的文件。我还有一个加密的密钥文件。但我不明白如何使用密钥解密文件。大多数教程和示例在一个地方创建临时随机密钥、加密文件和解密文件。 所以,问题是如何指定必须用于解密的密钥? 编辑: 我发现的示例使用以下代码生成密钥。我不知道在哪里可以用我的钥匙 KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); SecretKey key = kgen.generateKey(); 如

我有一个使用AES用java应用程序加密的文件。我还有一个加密的密钥文件。但我不明白如何使用密钥解密文件。大多数教程和示例在一个地方创建临时随机密钥、加密文件和解密文件。 所以,问题是如何指定必须用于解密的密钥?

编辑: 我发现的示例使用以下代码生成密钥。我不知道在哪里可以用我的钥匙

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = kgen.generateKey();

如果可能对您有帮助,请尝试以下方法

private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)
        throws Exception
{
    int minSize = cipher.getOutputSize(data.length);
    byte[] outBuf = new byte[minSize];
    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
    int length2 = cipher.doFinal(outBuf, length1);
    int actualLength = length1 + length2;
    byte[] result = new byte[actualLength];
    System.arraycopy(outBuf, 0, result, 0, result.length);
    return result;
}

private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception
{
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
            new AESEngine()));
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
    aes.init(false, ivAndKey);
    return cipherData(aes, cipher);
}

private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception
{
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
            new AESEngine()));
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
    aes.init(true, ivAndKey);
    return cipherData(aes, plain);
}

答案可能是简单地将密钥数据作为字节放入SecretKeySpec,如下所示:

SecretKeySpec aesKey = new SecretKeySpec(myKeyData, "AES");

注意,它实现了密钥接口,因此您可以在
Cipher.init()方法中直接使用它。因此,不需要SecretKeyFactory,否则您将使用它。

只是总结一下我对路西法答案的评论

  • 如果您不知道使用了什么填充进行加密,则使用“无填充”设置进行解密。这将解密所有内容,包括填充,并且不会因为填充不匹配而引发错误

  • 解密密码文本后,请查看输出的最后一个块,并查看使用了哪些填充。不同的填充会留下不同的字节模式,因此通常很容易区分

  • 将解密方法设置为正确的填充类型,它将自动为您删除

  • 加密/解密大型视频的完整示例,无需抛出Java
    OutOfMemoryException
    并使用Java
    SecureRandom
    生成初始化向量。还描述了将密钥字节存储到数据库,然后从这些字节重建相同的密钥


    您不能将密钥放在教程中,而不是随机密钥吗?或者你真的需要把密码和salt转换成密钥位吗?如果你给我们指出的是你正在看的同一个教程(和/或在这里引用一段代码),我们也许能够帮助找出如何更改它。@Rup我认为这只是一个小的转换问题,字节需要转换成Java密钥实例。我得到了“org.bouncycastle.crypto.InvalidCipherTextException:pad block corrupt”。请检查是否为解密指定了与加密相同的填充。如果您不知道,请指定“无填充”进行解密,并查看最后一个块的结尾以确定使用了什么填充进行加密。@rossum:如果我只知道他们用于加密的填充。@Aleksandr Kravets:显式设置“无填充”进行解密,并检查最后一个块的结尾。这将显示加密之前添加的填充(如果有)。设置“无填充”将接受最后一个块中的任何内容为有效。@rossum:已解密,无填充。最后一个块包含7个字节的值0x07。还有其他的指示吗?)谢谢,这很有帮助。我解密了文件,但它的内容是二进制混乱。很明显,我做错了什么。整个消息是一团糟,还是只有前16个字节?您能给我们提供更多关于所用算法的信息吗?如果您指定了IV向量(如果模式=CBC)?什么填充物?这些是您在
    Cipher.getInstance()中指定的整个文件一团糟。故事是这样的:我要解密的文件是HSQLDB数据库中的.script文件。通常它是一个包含更改日志的纯文本文件。但有人决定使用数据库加密,如中所述。不知何故,数据库已损坏,客户端希望恢复数据。所以我不知道hsqldb用于加密的任何加密选项。提供给DB引擎的参数是“AES”和128位密钥。没有别的。它说数据库支持任何算法,所以很可能只是使用
    Cipher.getInstance(“AES”)
    ,与
    Cipher.getInstance(“AES/ECB/PKCS5Padding”)相同(使用Sun Java时)。然而,很可能只有特定的部分被加密,你必须确保你只解密这些部分。目前为止运气不好。上面指定的选项。还是无法解密。谢谢大家。原来解密结果是GZIP-ed。现在我已经得到了预期的结果。再次感谢!对于unix高手来说,对您无法理解的输出运行“file”命令并没有什么坏处。。。