Search code examples
c#swiftaesrijndaelmanaged

AES 128 Cross-Platform Swift / C#


I've been trying to encrypt and decrypt on both iOS and .NET but I haven't been very successful. I've used this question but I get the error:

Specified initialisation vector (IV) does not match the block size for this algorithm.

Here's my encryption code for Swift using CryptoSwift:

let encrypt = try! "oauth_token".AES_encrypt("my key here (is 32 characters long)", iv: "1234567890123456")

func AES_encrypt(key: String, iv: String) throws -> String {
    let data = self.dataUsingEncoding(NSUTF8StringEncoding)
    let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes(), padding: PKCS7())
    let encData = NSData(bytes: enc, length: Int(enc.count))
    let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0));
    let result = String(base64String)
    return result
}



And my decryption code for .NET:

public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] key, byte[] iv)
    {
        byte[] decryptedBytes = null;

        using (MemoryStream ms = new MemoryStream())
        {
            using (RijndaelManaged AES = new RijndaelManaged())
            {
                AES.KeySize = 256;
                AES.BlockSize = 128;

                AES.Key = key;
                AES.IV = iv;

                AES.Mode = CipherMode.CBC;

                using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                    cs.Close();
                }
                decryptedBytes = ms.ToArray();
            }
        }

        return decryptedBytes;
    }



byte[] encrypted_text = Convert.FromBase64String("secret token");
byte[] key = Convert.FromBase64String("32 character key");
byte[] iv = Convert.FromBase64String("0123456789012345");

string plaintext = Convert.ToBase64String(AES_Decrypt(encrypted_text, key, iv));

Solution

  • The block size is 16 bytes (AES.blockSize). Either you're using old version or your AES_encrypt() have some problem (AES_encrypt is not part of CryptoSwift).

    Simple example from README:

    let input: NSData // data to encrypt
    let encrypted = try? input.encrypt(AES(key: "secret0key000000", iv:"0123456789012345"))
    

    or this

    // Encrypt string and get Base64 representation of result
    let base64: String = try? "my secret string".encrypt(AES(key: "secret0key000000", iv: "0123456789012345"))