php ios swift encryption

php - Encriptación asincrónica en Swift



ios encryption (2)

Estoy tratando de encriptar una cadena, usando el sistema Clave Pública / Privada. Necesito pasar una cadena al servidor, donde un script PHP puede descifrarlo. Tengo un sistema de script de JavaScript a PHP en funcionamiento, sin embargo, me gustaría hacer posible que el script PHP también acepte datos de la aplicación de iOS. ¿Puede alguien señalarme en la dirección correcta, o tal vez incluso presentarme a un sistema que podría lograr un resultado similar? Estoy buscando cualquier tipo de encriptación que pueda usar para descifrar con PHP. Gracias de antemano.


Posiblemente pueda usar la biblioteca de openssl para encriptar / descifrar RSA.

Sale tanto en iOS como en PHP.

Si desea enviar sus cadenas de manera segura, usar la capa de seguridad (SSL / TLS) es suficiente como dice Zaph.


PHP e iOS son compatibles con el cifrado AES.

En iOS Common Crypto admite el cifrado asimétrico (RSA) y el simétrico (AES). Si no hay una necesidad imperiosa de PKI (Infraestructura de clave pública) use AES.

El único problema es que PHP usa relleno no estándar (nulo) en lugar de PKCS # 7, por lo que tendrá que hacer su propio relleno en el tamaño de iOS para que coincida con el esquema de Bozo PHP o en el lado de PHP para que coincida con el PKCS estándar # 7. Tenga en cuenta que el relleno de PHP falla si el último byte de los datos es 0.

Aquí hay un ejemplo de implementación envuelto en una función con un iv:

Swift 2.0

Agregue Security.framework al proyecto.

#import <CommonCrypto/CommonCrypto.h func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? { let keyBytes = UnsafePointer<UInt8>(keyData.bytes) print("keyLength = /(keyData.length), keyData = /(keyData)") let ivBytes = UnsafePointer<UInt8>(ivData.bytes) print("ivLength = /(ivData.length), ivData = /(ivData)") let dataLength = Int(data.length) let dataBytes = UnsafePointer<UInt8>(data.bytes) print("dataLength = /(dataLength), data = /(data)") let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128) let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes) let cryptLength = size_t(cryptData.length) let keyLength = size_t(kCCKeySizeAES128) let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) let options: CCOptions = UInt32(kCCOptionPKCS7Padding) var numBytesEncrypted :size_t = 0 let cryptStatus = CCCrypt(operation, algoritm, options, keyBytes, keyLength, ivBytes, dataBytes, dataLength, cryptPointer, cryptLength, &numBytesEncrypted) if UInt32(cryptStatus) == UInt32(kCCSuccess) { cryptData.length = Int(numBytesEncrypted) print("cryptLength = /(numBytesEncrypted), cryptData = /(cryptData)") } else { print("Error: /(cryptStatus)") } return cryptData; }

// Código de prueba:

let keyString = "!Use a data key!" let keyData = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! let ivString = "Use a random iv!" let ivData = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! let message = "Don´t try to read this text. Top Secret Stuff" let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! print("data: /(data)") if let encryptedData = testCrypt(data, keyData:keyData, ivData:ivData, operation:UInt32(kCCEncrypt)) { print("encryptedData: /(encryptedData)") if let decryptedData = testCrypt(encryptedData, keyData:keyData, ivData:ivData, operation:UInt32(kCCDecrypt)) { print("decryptedData: /(decryptedData)") } }

Salida:

data: 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666 keyLength = 16, keyData = 21557365 20612064 61746120 6b657921 ivLength = 16, ivData = 21557365 20612064 61746120 6b657921 dataLength = 46, data = 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666 cryptLength = 48, cryptData = c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675 encryptedData: c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675 keyLength = 16, keyData = 21557365 20612064 61746120 6b657921 ivLength = 16, ivData = 21557365 20612064 61746120 6b657921 dataLength = 48, data = c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675 cryptLength = 46, cryptData = 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666 decryptedData: 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666

Hay otros ejemplos de encriptación Swift AES aquí en SO.

Ejemplo de BCE SO respuesta envuelta en una función, pero realmente debería usar el modo CBC.

CBC ejemplo SO código de respuesta .