2013-04-25 300 views
3

我想解密Java中的C#加密數據,但沒有成功。我正在使用128位密鑰&塊大小與PKCS7填充。下面是C#代碼:AES加密C#解密Java?

public byte[] Encrypt(byte[] data, byte[] key) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      using (var aes = RijndaelManaged.Create()) 
      { 
       aes.Key = key; 
       aes.IV = key; 
       var stream = new CryptoStream(ms, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write); 
       stream.Write(data, 0, data.Length); 
       stream.FlushFinalBlock(); 
       return ms.ToArray(); 
      } 
     } 
    } 

,這是Java代碼:

private static Key generateKey() throws Exception { 

    Key key = new SecretKeySpec(Files.readAllBytes(Paths.get("D:/Temp/cr.key")), "AES"); 

    return key; 
} 

public static byte[] decrypt(byte[] encryptedData) throws Exception { 
    Key key = generateKey(); 

    Cipher c = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); 

    IvParameterSpec ivSpec = new IvParameterSpec(key.getEncoded()); 
    c.init(Cipher.DECRYPT_MODE, key, ivSpec); 

    System.out.println(c.getBlockSize()); 


    c.update(encryptedData); 
    byte[] decValue = c.doFinal(); 
    return decValue; 
} 

public static void main(String[] args) throws Exception { 
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

    byte[] bb = decrypt(Files.readAllBytes(Paths.get("d:\\Temp\\cr~\\OEBPS\\Chapter001.html"))); 
      //decompressFile(bb, new File("D:\\Temp\\enc.html")); 
} 

任何想法可能是錯誤的?

感謝

UPDATE


對不起,怎麼啞了我的,我忘了寫實際的錯誤信息。這裏,它是:在線程 「主」 javax.crypto.BadPaddingException

例外:墊塊 在的javax在 org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(未知 源)損壞.crypto.Cipher.doFinal(Cipher.java:1970)

感謝

+2

什麼實際上不起作用?拋出異常還是數據被破壞? – Fildor 2013-04-25 14:56:31

+0

@Fildor,thansk爲我指點,我更新了我的帖子:) – Davita 2013-04-25 22:08:55

+0

這已經解決了Davida?對不起,如果我沒有更直接的答案... – 2013-05-05 09:23:15

回答

1

你忘記了,每當密文的完整塊已經被處理Cipher.update(byte[]): byte[]將返回數據。

注意:顯然不是這個問題的答案,因爲異常指向另一個錯誤。但是上面的代碼中的一個錯誤是毫無用處的。

+0

Java應該真的有一個註釋來表明返回值***應該*** *不會被忽略*。如果忽略返回值,許多方法都沒有意義,包括大部分不可變'String'類的方法。 – 2013-04-25 20:40:44

+0

對不起愚蠢的questino,但這應該怎麼幫助我? THanks – Davita 2013-04-26 18:14:24

+0

那麼,你需要連接兩個方法的返回值,或者你可以使用doFinal(byte []):byte []來代替這兩種方法。現在你鬆散的數據... – 2013-04-26 19:20:27