2013-04-25 175 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