2016-11-10 65 views
0
private static byte[] encryptData(ByteArrayOutputStream data, byte[] symmetricKey) throws EncryptionException { 
     try { 
      SecretKey secKey = new SecretKeySpec(symmetricKey, "AES"); 
      Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.ENCRYPT_MODE, secKey); 
      return cipher.doFinal(data.toByteArray()); 
     } catch (NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | 
       InvalidKeyException | 
       BadPaddingException e) { 
      throw new EncryptionException(e); 
     } 
    } 

我有一種情況,我需要使用.NET加密數據並使用JAVA解密相同的數據。基本上,我需要在.NET中重寫上述加密方法。c#中的對稱加密類似於JAVA

public byte[] Encrypt(byte[] key, byte[] plainText) 
     { 
      using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) 
      { 
       using (ICryptoTransform encryptor = aesProvider.CreateEncryptor(key, magicIV)) 
       { 
        using (MemoryStream ms = new MemoryStream()) 
        { 
         using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
         { 
          cs.Write(plainText, 0, plainText.Length); 
         } 
         byte[] cipherText = ms.ToArray(); 
         return cipherText; 
        } 
       } 
      } 
     } 

上面的代碼我使用的地方強制要求四JAVA不要求。 JAVA代碼中使用的IV是什麼?

我嘗試了很多不起作用的鏈接。 Symmetric Encryption between .NET and Java

請幫

+1

Stackoverflow不是代碼編寫服務。您的這些問題應該以*太寬*來結束。 –

+0

你應該完全拋棄上面的代碼。這遠非安全。 –

回答

2

如果您當前的Java代碼解密也不會因爲是四問(和你的解密將返回加密相同的數據),那麼Cipher.getInstance("AES")正在恢復使用ECB塊模式的對象。

.NET對稱算法默認爲CBC塊模式,這需要IV。

你有兩個選擇:

  • aesProvider.Mode = CipherMode.ECB調用CreateEncryptor之前。
  • aesProvider.IV傳遞給CreateEncryptor的IV參數。如果未設置,IV屬性將在第一次讀取時創建一個加密隨機值。
    • 您需要將這些數據傳遞給解密程序,解密程序然後應該使用「AES/CBC/PKCS5Padding」,然後設置IV,但是在Java中設置IV。
    • 一種常見的傳輸方式是簡單地將數據預先加密到密文,然後在解密時只需選取前16個字節。
    • 請勿爲IV使用固定值,因爲它幾乎與ECB相同。