2015-03-23 3 views
1

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

+0

Возможный дубликат [HTTP-запрос в Swift с методом POST] (http://stackoverflow.com/questions/26364914/http-request-in-swift-with-post-method) –

+0

Я знаю, как передать строку , Мне просто нужно зашифровать его. – Alex

+0

Можете ли вы добавить сведения о том, какое шифрование вы хотите? Например, GPG? – joelparkerhenderson

ответ

1

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

Выход:

 
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 

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

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

CBC пример SO answer код.

+0

Спасибо, я думаю, что смогу с этим справиться. – Alex

0

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

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

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

+0

RSA - это то, что я использую на веб-сайте, и я бы предпочел использовать это на данный момент. Я не смог найти рабочие примеры, которые реализуют его для быстрого. Если у вас есть предложения, я буду благодарен им. – Alex

+0

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

Смежные вопросы