我有一个使用AES使用java应用程序加密的文件。我还有一个加密的密钥文件。但我无法理解如何使用密钥来解密文件。大多数教程和示例创建临时随机密钥,加密文件并在一个地方解密。 那么,问题是如何指定必须用于解密的密钥?
修改: 我发现的样本使用以下代码生成密钥。我不知道我在哪里可以使用我的钥匙。
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = kgen.generateKey();
答案 0 :(得分:2)
答案可能只是将关键数据作为字节放入SecretKeySpec中,如下所示:
SecretKeySpec aesKey = new SecretKeySpec(myKeyData, "AES");
请注意,SecretKeySpec实现了Key接口,因此您可以直接在Cipher.init()
方法中使用它。所以不需要SecretKeyFactory,否则你会使用它。
答案 1 :(得分:2)
总结一下我对路西法答案的评论。
如果您不知道用于加密的填充,则使用“无填充”设置进行解密。这将解密所有内容,包括填充,并且不会因填充不匹配而引发错误。
解密密文时,请查看输出的最后一个块,看看使用了哪个填充。不同的填充会留下不同的字节模式,因此通常很容易分辨。
设置您的解密方法以获得正确的填充类型,它将自动为您删除。
答案 2 :(得分:0)
请尝试以下方法,如果对您有所帮助。
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);
}
答案 3 :(得分:0)
加密/解密 巨大视频而不抛弃Java OutOfMemoryException
并使用Java SecureRandom
生成初始化向量的完整示例。还描述了将密钥字节存储到数据库,然后从这些字节重建相同的密钥。