Since the existing information on AES encryption and decryption using Node.js, Swift and Android is …
Terminology
AES, CBC –
Initialization Vector –
Node.js
const crypto = require('crypto'); let algorithm = 'aes-256-cbc'; let initializationVector = crypto.randomBytes(16); // IV is always 16-bytes let key = crypto.randomBytes(32); // Using a 256 bit key function encrypt(data) { var cipher = crypto.createCipheriv(algorithm, key, initializationVector) var crypted = cipher.update(data,'utf8','base64') crypted += cipher.final('base64'); return crypted; } function decrypt(text) { let data = new Buffer(text, "base64") let decipher = crypto.createDecipheriv(algorithm, key, initializationVector); let decrypted = decipher.update(data); decrypted = Buffer.concat([decrypted, decipher.final()]); return decrypted.toString('utf8'); }
iOS: Swift
Just like with Node.js, all needed functionality is readily available. All you need to do is add ‘Security.framework’ and a bridging header containing the following:
#import <CommonCrypto/CommonCrypto.h>
func decrypt(data:Data, keyData:Data, ivData:Data) -> Data? { let keyLength = keyData.count let dataLength = data.count let validKeyLengths = [kCCKeySizeAES128, kCCKeySizeAES192, kCCKeySizeAES256] if (validKeyLengths.contains(keyLength) == false) { print("Invalid key length") return nil; } let clearLength = size_t(data.count) var clearData = Data(count:clearLength) var numBytesDecrypted :size_t = 0 let options = CCOptions(kCCOptionPKCS7Padding) let cryptStatus = clearData.withUnsafeMutableBytes {cryptBytes in data.withUnsafeBytes {dataBytes in ivData.withUnsafeBytes {ivBytes in keyData.withUnsafeBytes {keyBytes in CCCrypt(CCOperation(kCCDecrypt), CCAlgorithm(kCCAlgorithmAES128), options, keyBytes, //key bytes keyLength, //key length ivBytes, //iv bytes dataBytes, //iv bytes dataLength, cryptBytes, clearLength, &numBytesDecrypted) } } } } if UInt32(cryptStatus) == UInt32(kCCSuccess) { clearData.count = numBytesDecrypted } else { print("decrypt failed") return nil; // throw AESError.CryptorError(("Decryption failed", Int(cryptStatus))) } return clearData; }
Android: Java
Further reading
http://lollyrock.com/articles/nodejs-encryption/
https://coolaj86.com/articles/symmetric-cryptography-aes-with-webcrypto-and-node-js/