我正在尝试将以下代码从 C# 移植到 Java 中。我已经多次尝试尝试解密我的加密数据,但每次都会出现乱码。下面的代码使用 org.bouncycastle 库,不幸的是,C# 代码和 Java 代码之间似乎没有 1-1 映射。
我基本上知道三件事:
- byte[] 文件 - 这包含我的加密文件。通常是一个相当大的字节数组。
- byte[] 填充 - 每次都是 32*字节* ,似乎前 16 个字节被用作 IV。
- byte[] aesKey - 每次都是 32*字节*,我不知道 C# 代码是如何使用这个数组的。
原始 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);
}
PS:这是解密的最后一步。在这之前,我必须从我的加密文件中取出一些初始字节集,并使用 RSA 私钥对它们进行解密以获得这个 AES 密钥。
如果有人有一个链接/文档,我可以阅读它正确地解释了使用 AES 加密文件的整个过程,然后在密钥上使用 RSA 并在加密文件的开头使用 iv,我将非常高兴。我一直在盯着C#代码,我想看看有图的东西。
编辑:字节不是位。
EDIT2:将填充重命名为 iVector 以保持一致性和正确性。