iOS和C之间的AES加密#

问题描述:

我正在使用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

你的第一个块的不同之处你在解密使用不同IV。在IOSdecryptBase64String(..)不要把一个IV作为输入,这会触发它被初始化为全0。在C#中,您将其初始化为与相同的值。

一般而言,IV需要在加密时产生的随机值,并与加密的数据一起传递。通常它会加密加密的数据,所以当初始化解密库时,您可以轻松获得它。使用所有0作为IV是不好的做法..和IV一样使用密钥也是一样。

+0

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

+0

谢谢Ebbe。解决了这个问题。 – SM18

+0

在解密字符串的最后获取垃圾数据或解密字符串的无响应。 – SM18