我試圖將C#中的以下代碼移植到Java中。我嘗試過多次試圖解密我的加密數據,每次都會收到亂碼。下面的代碼使用org.bouncycastle庫,不幸的是,在C#代碼和Java代碼之間似乎沒有1-1映射。AES解密 - 將代碼從C#移植到Java
我基本上知道三兩件事:
- 的byte []文件 - 這包含我的加密文件。通常是一個相當大的字節數組。
- byte [] padding - 每次都是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);
}
P.S:這是解密的最後一步。在此之前,我必須從我的加密文件中取出一些初始字節集,並使用RSA私鑰對它們進行解密以獲得此AES密鑰。
如果有人有鏈接/文檔,我可以正確解釋使用AES加密文件的全過程,然後在密鑰上使用RSA,在加密文件開始時使用RSA,我將非常高興。我剛剛盯着C#代碼,我想看看有圖片的東西。
編輯:字節不是位。
EDIT2:爲了一致性和正確性,將填充更名爲iVector。
也許你應該看看bouncycastle – fge
除了Java API和C#API,我沒有發現任何有用的東西。我已經做了很多四處看看,有什麼特別的你想讓我看看? – Sanchit
我猜*填充*和* aesKey *是32個字節(不是位)。爲什麼你調用第二個參數* padding *實際上它與填充無關,而是初始化向量。爲什麼不調用與C#代碼中相同的參數? (好吧,也許不是m_Key,它是爲成員變量保留的。) – Codo