2012-12-24 43 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