Асинхронное шифрование в Swift

Я пытаюсь зашифровать строку, используя систему Public / Private Key. Мне нужно передать строку на сервер, где скрипт PHP может расшифровать его. У меня есть работающая скриптовая система JavaScript для PHP, однако я бы хотел, чтобы PHP-скрипт также принимал данные из приложения iOS. Может ли кто-нибудь указать мне в правильном направлении или, возможно, даже познакомить меня с системой, которая могла бы достичь аналогичного результата. Я ищу любой тип шифрования, который я мог бы использовать для расшифровки с помощью PHP. Заранее спасибо.

PHP и iOS поддерживают AES-шифрование.

В iOS Common Crypto поддерживается как асимметричное (RSA), так и симметричное (AES) шифрование. Если нет необходимости в PKI (инфраструктура открытого ключа), используйте AES.

Единственная проблема заключается в том, что PHP использует нестандартное дополнение (NULL) вместо PKCS # 7, поэтому вам придется делать свое собственное дополнение либо по размеру iOS, чтобы соответствовать схеме Bozo, используемой PHP, либо на стороне PHP, чтобы соответствовать стандарту PKCS # 7. Обратите внимание, что заполнение PHP не выполняется, если последний байт данных равен 0.

Вот пример реализации, завернутый в функцию с iv:

Swift 2.0

Добавьте в проект Security.framework .

 #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; } 

// Тестовый код:

 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)") } } 

Вывод:

 данные: 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

Существуют и другие примеры шифрования Swift AES здесь, на SO.

Пример ECB. SO ответ, завернутый в функцию, но вы действительно должны использовать режим CBC.

Пример ответа CBC SO .

Возможно, вы можете использовать библиотеку openssl для шифрования / расшифровки RSA.

Он выходит как в iOS, так и в PHP.

Если вы хотите безопасно отправлять свои строки, достаточно использовать уровень безопасности (SSL / TLS), как говорит Zaph.