2017-01-02 80 views
0

我正在使用FBEncryptor庫進行加密和解密。如果我從iOS加密數據,它將很容易在C#服務器端解密。但是,從原始數據解密前10個字符會被破壞。iOS和C之間的AES加密#

實施例:
接收到的數據從C#:0Nwr30kSkJxGCYiFg8TUrfW51587SUkS8lQ7Uno7gglxjVGW5gR4MA + isTknjXzK

密鑰用來加密:e64f9fa01f0418

從iOS的

解密的數據:gZUUTabcdefghijklmnopqrstuvwxyz 「}

預期解密的數據:{」 Successeed」: 「ABCDEFGHIJKLMNOPQRSTUVWXYZ」}

的iOS端代碼:

encryptedios = "0Nwr30kSkJxGCYiFg8TUrfW51587SUkS8lQ7Uno7gglxjVGW5gR4MA+isTknjXzK" 
let decryptedString = FBEncryptorAES.decryptBase64String(encryptedios , keyString: "e64f9fa01f0418") 

C#代碼:

public RijndaelManaged GetRijndaelManaged(String secretKey) 
    { 
     var keyBytes = new byte[16]; 
     var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey); 
     Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length)); 
     return new RijndaelManaged 
     { 
      Mode = CipherMode.CBC, 
      Padding = PaddingMode.PKCS7, 
      KeySize = 128, 
      BlockSize = 128, 
      Key = keyBytes, 
      IV = keyBytes 
     }; 
    } 

    public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged) 
    { 
     return rijndaelManaged.CreateEncryptor() 
      .TransformFinalBlock(plainBytes, 0, plainBytes.Length); 
    } 

    public byte[] Decrypt(byte[] encryptedData, RijndaelManaged rijndaelManaged) 
    { 
     return rijndaelManaged.CreateDecryptor() 
      .TransformFinalBlock(encryptedData, 0, encryptedData.Length); 
    } 

    /// <summary> 
    /// Encrypts plaintext using AES 128bit key and a Chain Block Cipher and returns a base64 encoded string 
    /// </summary> 
    /// <param name="plainText">Plain text to encrypt</param> 
    /// <param name="key">Secret key</param> 
    /// <returns>Base64 encoded string</returns> 
    public String Encrypt(String plainText, String key) 
    { 
     var plainBytes = Encoding.UTF8.GetBytes(plainText); 
     return Convert.ToBase64String(Encrypt(plainBytes, GetRijndaelManaged(key))); 
    } 

    /// <summary> 
    /// Decrypts a base64 encoded string using the given key (AES 128bit key and a Chain Block Cipher) 
    /// </summary> 
    /// <param name="encryptedText">Base64 Encoded String</param> 
    /// <param name="key">Secret Key</param> 
    /// <returns>Decrypted String</returns> 
    public String Decrypt(String encryptedText, String key) 
    { 
     var encryptedBytes = Convert.FromBase64String(encryptedText); 
     return Encoding.UTF8.GetString(Decrypt(encryptedBytes, GetRijndaelManaged(key))); 
    } 
+0

顯示客戶端和服務器代碼,否則它是相當困難的幫助你。 – Tinwor

+0

我已添加代碼詳細信息。 FBEncryptor庫中沒有改變 – SM18

回答

1

你的第一個塊的不同之處你在解密使用不同IV。在IOSdecryptBase64String(..)不要把一個IV作爲輸入,這會觸發它被初始化爲全0。在C#中,您將其初始化爲與相同的值。

一般而言,IV需要在加密時產生的隨機值,並與加密的數據一起傳遞。通常它會加密加密的數據,所以當初始化解密庫時,您可以輕鬆獲得它。使用所有0作爲IV是不好的做法..和IV一樣使用密鑰也是一樣。

+0

您能否提供一些使用示例代碼的代碼更改方法。 – SM18

+0

謝謝Ebbe。解決了這個問題。 – SM18

+0

在解密字符串的最後獲取垃圾數據或解密字符串的無響應。 – SM18