AES encripta y descifra

Escribo una aplicación rápidamente, necesito la funcionalidad AES Encrypt and Decrypt, recibí datos encriptados de otra solución .Net, pero no puedo encontrar algo para hacerlo.

Este es mi cifrado .net:

public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes) { byte[] encryptedBytes = null; byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; using (MemoryStream ms = new MemoryStream()) { using (RijndaelManaged AES = new RijndaelManaged()) { AES.KeySize = 256; AES.BlockSize = 128; var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); AES.Key = key.GetBytes(AES.KeySize / 8); AES.IV = key.GetBytes(AES.BlockSize / 8); AES.Mode = CipherMode.CBC; using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length); cs.Close(); } encryptedBytes = ms.ToArray(); } } return encryptedBytes; } 

Necesito descifrar la función en poco tiempo.

Ejemplo de CryptoSwift

Actualizado a Swift 2

 import Foundation import CryptoSwift extension String { func aesEncrypt(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 } func aesDecrypt(key: String, iv: String) throws -> String { let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0)) let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes(), padding: PKCS7()) let decData = NSData(bytes: dec, length: Int(dec.count)) let result = NSString(data: decData, encoding: NSUTF8StringEncoding) return String(result!) } } 

Uso:

 let key = "bbC2H19lkVbQDfakxcrtNMQdd0FloLyw" // length == 32 let iv = "gqLOHUioQ0QjhuvI" // length == 16 let s = "string to encrypt" let enc = try! s.aesEncrypt(key, iv: iv) let dec = try! enc.aesDecrypt(key, iv: iv) print(s) // string to encrypt print("enc:\(enc)") // 2r0+KirTTegQfF4wI8rws0LuV8h82rHyyYz7xBpXIpM= print("dec:\(dec)") // string to encrypt print("\(s == dec)") // true 

Asegúrate de tener la longitud correcta de iv (16) y clave (32) y luego no presionarás “¡El tamaño del bloque y el Vector de inicialización deben ser del mismo largo!” error.

Ejemplo de CryptoSwift

Actualizado a Swift 3

 func aesEncrypt(key: String, iv: String) throws -> String { let data = self.data(using: .utf8)! let encrypted = try! AES(key: key.bytes, blockMode: .CBC(iv: iv.bytes), padding: .pkcs7).encrypt([UInt8](data)) let encryptedData = Data(encrypted) return encryptedData.base64EncodedString() } func aesDecrypt(key: String, iv: String) throws -> String { let data = Data(base64Encoded: self)! let decrypted = try! AES(key: key.bytes, blockMode: .CBC(iv: iv.bytes), padding: .pkcs7).decrypt([UInt8](data)) let decryptedData = Data(decrypted) return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt" } 

Hay una interesante biblioteca de código abierto de “pure-swift”:

Ejemplo con descifrado AES (obtenido del proyecto archivo README.md):

 import CryptoSwift let setup = (key: keyData, iv: ivData) let decryptedAES = Cipher.AES(setup).decrypt(encryptedData) 

El código provisto por SHS no funcionó para mí, pero aparentemente este sí lo hizo (utilicé un encabezado de #import : #import ):

 extension String { func aesEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { if let keyData = key.data(using: String.Encoding.utf8), let data = self.data(using: String.Encoding.utf8), let cryptData = NSMutableData(length: Int((data.count)) + kCCBlockSizeAES128) { let keyLength = size_t(kCCKeySizeAES128) let operation: CCOperation = UInt32(kCCEncrypt) let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) let options: CCOptions = UInt32(options) var numBytesEncrypted :size_t = 0 let cryptStatus = CCCrypt(operation, algoritm, options, (keyData as NSData).bytes, keyLength, iv, (data as NSData).bytes, data.count, cryptData.mutableBytes, cryptData.length, &numBytesEncrypted) if UInt32(cryptStatus) == UInt32(kCCSuccess) { cryptData.length = Int(numBytesEncrypted) let base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters) return base64cryptString } else { return nil } } return nil } func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { if let keyData = key.data(using: String.Encoding.utf8), let data = NSData(base64Encoded: self, options: .ignoreUnknownCharacters), let cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) { let keyLength = size_t(kCCKeySizeAES128) let operation: CCOperation = UInt32(kCCDecrypt) let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) let options: CCOptions = UInt32(options) var numBytesEncrypted :size_t = 0 let cryptStatus = CCCrypt(operation, algoritm, options, (keyData as NSData).bytes, keyLength, iv, data.bytes, data.length, cryptData.mutableBytes, cryptData.length, &numBytesEncrypted) if UInt32(cryptStatus) == UInt32(kCCSuccess) { cryptData.length = Int(numBytesEncrypted) let unencryptedMessage = String(data: cryptData as Data, encoding:String.Encoding.utf8) return unencryptedMessage } else { return nil } } return nil } } 

Desde mi ViewController :

  let encoded = message.aesEncrypt(key: keyString, iv: iv) let unencode = encoded?.aesDecrypt(key: keyString, iv: iv) 

CryptoSwift es un proyecto muy interesante, pero por ahora tiene algunas limitaciones de velocidad AES. Tenga cuidado si necesita hacer una criptografía seria – podría valer la pena pasar por el puente de implementación de CommonCrypto.

BigUps a Marcin para la implementación de pureSwift

Estaba usando CommonCrypto para generar Hash a través del código de MihaelIsaev / HMAC.swift de la implementación Swift fácil de usar de CommonCrypto HMAC . Esta implementación es sin usar Bridging-Header, con creación de archivo de módulo.

Ahora, para usar AESEncrypt y Decrypt, agregué directamente las funciones dentro de “extensión String {” en HAMC.swift.

 func aesEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding), data = self.dataUsingEncoding(NSUTF8StringEncoding), cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) { let keyLength = size_t(kCCKeySizeAES128) let operation: CCOperation = UInt32(kCCEncrypt) let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) let options: CCOptions = UInt32(options) var numBytesEncrypted :size_t = 0 let cryptStatus = CCCrypt(operation, algoritm, options, keyData.bytes, keyLength, iv, data.bytes, data.length, cryptData.mutableBytes, cryptData.length, &numBytesEncrypted) if UInt32(cryptStatus) == UInt32(kCCSuccess) { cryptData.length = Int(numBytesEncrypted) let base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) return base64cryptString } else { return nil } } return nil } func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding), data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters), cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) { let keyLength = size_t(kCCKeySizeAES128) let operation: CCOperation = UInt32(kCCDecrypt) let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) let options: CCOptions = UInt32(options) var numBytesEncrypted :size_t = 0 let cryptStatus = CCCrypt(operation, algoritm, options, keyData.bytes, keyLength, iv, data.bytes, data.length, cryptData.mutableBytes, cryptData.length, &numBytesEncrypted) if UInt32(cryptStatus) == UInt32(kCCSuccess) { cryptData.length = Int(numBytesEncrypted) let unencryptedMessage = String(data: cryptData, encoding:NSUTF8StringEncoding) return unencryptedMessage } else { return nil } } return nil } 

Las funciones fueron tomadas de RNCryptor . Fue una adición fácil en las funciones hash y en un solo archivo “HMAC.swift”, sin usar Bridging-header. Espero que esto sea útil para los desarrolladores en rápida necesidad de Hashing y AES Encryption / Decryption.

Ejemplo de uso de AESDecrypt como debajo.

  let iv = "AA-salt-BBCCDD--" // should be of 16 characters. //here we are convert nsdata to String let encryptedString = String(data: dataFromURL, encoding: NSUTF8StringEncoding) //now we are decrypting if let decryptedString = encryptedString?.aesDecrypt("12345678901234567890123456789012", iv: iv) // 32 char pass key { // Your decryptedString } 

Aquí hay una biblioteca que usa la nueva API WebCrypto .

No se requiere un encabezado de puente y es bastante más rápido que CryptoSwift.

https://github.com/etienne-martin/WebCrypto.swift

Encriptación basada en contraseña

Cifrado

 let crypto = WebCrypto() let input = Data("This is a string".utf8) let password = "password123" crypto.encrypt(data: input, password: password, callback: {(encrypted: Data?, error: Error?) in print(encrypted!) }) 

Descifrado

 crypto.decrypt(data: encrypted, password: password, callback: {(decrypted: Data?, error: Error?) in print(String(data: decrypted!, encoding: .utf8)!) }) 

Encriptación basada en claves

Cifrado

 let crypto = WebCrypto() let input = Data("This is a string".utf8) let key = "6f0f1c6f0e56afd327ff07b7b63a2d8ae91ab0a2f0c8cd6889c0fc1d624ac1b8" let iv = "92c9d2c07a9f2e0a0d20710270047ea2" crypto.encrypt(data: input, key: key, iv: iv, callback: {(encrypted: Data?, error: Error?) in print(encrypted!) }) 

Descifrado

 crypto.decrypt(data: encrypted, key: key, iv: iv, callback: {(encrypted: Data?, error: Error?) in print(String(data: decrypted!, encoding: .utf8)!) }) 

Descargo de responsabilidad: escribí esta biblioteca.

Encontré la solución, es una buena biblioteca.

Cifrado / descifrado AES multiplataforma de 256 bits.

Este proyecto contiene la implementación del cifrado AES de 256 bits que funciona en todas las plataformas (C #, iOS, Android). Uno de los objectives clave es hacer que AES trabaje en todas las plataformas con una implementación simple.

Plataformas compatibles: iOS, Android, Windows (C #).

https://github.com/Pakhee/Cross-platform-AES-encryption