我正在尝试将以下代码从C#移植到Java中。我多次尝试尝试解密我的加密数据,每次都得到乱码。下面的代码使用org.bouncycastle库,遗憾的是,C#代码和Java代码之间似乎没有1-1映射。
我基本上知道三件事:
原始C#代码
private byte[] decryptmessage(byte[] cmessage, byte[] iVector, byte[] m_Key)
{
{
//// randomly generated number acts as inetialization vector
m_IV = new byte[16];
Array.Copy(iVector, 0, m_IV, 0, 16);
// GenerateAESKey();
KeyParameter aesKeyParam = ParameterUtilities.CreateKeyParameter("AES", m_Key);
ParametersWithIV aesIVKeyParam = new ParametersWithIV(aesKeyParam, m_IV);
IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CFB/NoPadding");
cipher.Init(false, aesIVKeyParam);
return cipher.DoFinal(cmessage);
}
}
我在Java中的尝试
private static byte[] decryptMessage(byte[] file, byte[] iVector, byte[] aesKey) throws Exception {
IvParameterSpec spec = new IvParameterSpec(Arrays.copyOfRange(iVector, 0, 16));
SecretKeySpec key = new SecretKeySpec(Arrays.copyOfRange(aesKey, 0, 16), "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, spec);
return cipher.doFinal(file);
}
P.S:这是解密的最后一步。在此之前,我必须从加密文件中取出一些初始字节集,然后使用RSA私钥解密它们以获取此AES密钥。
如果有人有链接/文档,我可以阅读正确解释使用AES加密文件的整个过程,然后在密钥上使用RSA,然后在加密文件的开头使用,我将非常高兴。我刚刚盯着C#代码,我想看一些带图片的东西。
编辑:字节不是位。
EDIT2:将填充重命名为iVector以保持一致性和正确性。
答案 0 :(得分:3)
在C#代码中,您使用256位(32字节)初始化密钥,从而获得AES-256。在Java代码中,您只使用128位(16字节)并获得AES-128。
所以修复可能是:
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
然后,您可能会发现Java不想使用256位密钥(出于法律原因)。然后你必须安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6。