2014-01-15 117 views
0

我必須做以下操作:墊座損壞

  1. 加密VB - >解密VB
  2. 加密的Android - 解密的Android
  3. 加密VB - >解密的Android
  4. 加密的Android - >解密VB

到目前爲止,我成功地在Android上進行了加密和解密。 當我在VB加密和嘗試解密在Android上,我得到以下異常:

E /例外:墊塊損壞

我還不得不提到的是,當我在VB加密短字符串並將其解密也在VB中,一切運作良好。但是,當我加密一個更大的字節數組時,解密工作,但結果不是預期的結果。

有人能給我提示如何解決這個問題嗎? 謝謝!

這裏是我的代碼:

.NET函數

Public Function AES_Encrypt2(ByVal byteArray() As Byte, ByVal key As String, Optional ByVal ShortKey As Boolean = False) As String 
    Try 

     Dim FirstKeyBytes() As Byte = Encoding.UTF8.GetBytes(key) 

     If Not FirstKeyBytes Is Nothing Then 
      If FirstKeyBytes.Length < 32 Then 
       Array.Resize(FirstKeyBytes, 32) 
      End If 
     End If 

     Dim KeyBytes() As Byte 
     If ShortKey Then 
      KeyBytes = New Byte(15) {} 
      Array.Copy(FirstKeyBytes, KeyBytes, 16) 

     Else 
      KeyBytes = New Byte(31) {} 
      Array.Copy(FirstKeyBytes, KeyBytes, 32) 

     End If 

     Dim InitialVectorBytes() As Byte = New Byte() {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 'Encoding.UTF8.GetBytes("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") 
     Dim SymmetricKey As New RijndaelManaged() 

     SymmetricKey.Mode = CipherMode.CBC 
     SymmetricKey.Padding = PaddingMode.PKCS7 

     Dim Encryptor As ICryptoTransform = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes) 
     Dim MemStream As New MemoryStream() 
     Dim CryptoStream As New CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write) 

     CryptoStream.Write(byteArray, 0, byteArray.Length) 
     CryptoStream.FlushFinalBlock() 
     MemStream.Close() 
     CryptoStream.Close() 

     Dim CipherTextBytes As Byte() = MemStream.ToArray() 
     Dim encryptedString As String = Convert.ToBase64String(CipherTextBytes) 

     Return encryptedString 
    Catch ex As Exception 
     Return String.Empty 
    End Try 
End Function 



Public Function AES_Decrypt2(ByVal encryptedString As String, ByVal key As String, Optional ByVal ShortKey As Boolean = False) As String 
    Try 

     Dim PlainTextBytes1 As Byte() = Convert.FromBase64String(encryptedString) 
     Dim FirstKeyBytes() As Byte = Encoding.UTF8.GetBytes(key) 

     If Not FirstKeyBytes Is Nothing Then 
      If FirstKeyBytes.Length < 32 Then 
       Array.Resize(FirstKeyBytes, 32) 
      End If 
     End If 

     Dim KeyBytes() As Byte 
     If ShortKey Then 
      KeyBytes = New Byte(15) {} 
      Array.Copy(FirstKeyBytes, KeyBytes, 16) 

     Else 
      KeyBytes = New Byte(31) {} 
      Array.Copy(FirstKeyBytes, KeyBytes, 32) 

     End If 


     Dim SymmetricKey As New RijndaelManaged() 
     Dim InitialVectorBytes As Byte() = New Byte() {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 'Encoding.UTF8.GetBytes("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") 

     SymmetricKey.Mode = CipherMode.CBC 
     SymmetricKey.Padding = PaddingMode.PKCS7 

     Dim Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes) 
     Dim MemStream1 As New MemoryStream(PlainTextBytes1) 
     Dim CryptoStream As New CryptoStream(MemStream1, Decryptor, CryptoStreamMode.Read) 
     Dim pltxt As Byte() = New Byte(PlainTextBytes1.Length - 1) {} 
     Dim d As Integer = CryptoStream.Read(pltxt, 0, pltxt.Length) 

     MemStream1.Close() 
     CryptoStream.Close() 

     Dim textConverter As New ASCIIEncoding() 
     Dim round As String = textConverter.GetString(pltxt, 0, d) 

     Return round 

    Catch ex As Exception 
     Return String.Empty 
    End Try 
End Function 

和Android方法:

public static String encrypt(byte[] input, String key) { 
    try { 
     byte[] iv = new byte[16]; 

     AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 

     String newKey = ""; 
     if (key.length() >= 32) { 
      newKey = key.substring(0, 32); 
     } else { 
      for (int i = key.length(); i < 32; i++) { 
       key += "0"; 
      } 
      newKey = key.substring(0, 32); 
     } 

     SecretKeySpec skeySpec = new SecretKeySpec(newKey.getBytes(), "AES"); 
     //skeySpec = new SecretKeySpec(newKey.getBytes(), 0, newKey.length(), "AES"); 
     Cipher fileCipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 

     fileCipher.init(1, skeySpec, paramSpec); 

     byte[] decrypted = fileCipher.doFinal(input); 

     byte[] base64enc = Base64.encode(decrypted, 0); 

     return new String(base64enc); 
    } catch (Exception e) { 
     Log.e("Exception", e.getMessage()); 
    } 
    return null; 
} 

public static byte[] decrypt(String input, String key) { 
    try { 
     byte[] iv = new byte[16]; 

     AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 

     byte[] base64enc = Base64.decode(input.getBytes(), 0); 

     String newKey = ""; 
     if (key.length() >= 32) { 
      newKey = key.substring(0, 32); 
     } else { 
      for (int i = key.length(); i < 32; i++) { 
       key += "0"; 
      } 
      newKey = key.substring(0, 32);; 
     } 

     SecretKeySpec skeySpec = new SecretKeySpec(newKey.getBytes(), "AES"); 
     Cipher fileCipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 

     fileCipher.init(2, skeySpec, paramSpec); 

     int x = base64enc.length; 

     return fileCipher.doFinal(base64enc); 

    } catch (Exception e) { 
     Log.e("Exception: ", e.getMessage()); 
    } 
    return null; 
} 

回答

0

我想主要的問題是,密鑰生成是在兩件不同碼。密碼不是密鑰,您應該使用二進制,隨機生成的密鑰或像PBKDF2這樣的密鑰派生機制。

試圖找到一個經過嚴格審查的庫。在.NET和Java(/ Android)中使用相同的協議進行加密也是一個好主意。

一般來說,對密碼算法的輸入必須是二進制的。在執行算法之前,始終使用十六進制編碼比較算法的所有輸入。