2012-12-24 73 views
2

我試圖將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。

+0

也許你應該看看bouncycastle – fge

+0

除了Java API和C#API,我沒有發現任何有用的東西。我已經做了很多四處看看,有什麼特別的你想讓我看看? – Sanchit

+0

我猜*填充*和* aesKey *是32個字節(不是位)。爲什麼你調用第二個參數* padding *實際上它與填充無關,而是初始化向量。爲什麼不調用與C#代碼中相同的參數? (好吧,也許不是m_Key,它是爲成員變量保留的。) – Codo

回答

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

+0

讓我試試JCE。希望解決方案非常簡單! – Sanchit

+0

YEP!我只使用前16個字節,因爲嘗試所有32個字節給我一個密鑰長度錯誤。這有效,也讓我對自己感覺良好。謝謝! – Sanchit