распространенная криптография в swift 2.3 и Xcode8.1

Я пытаюсь реализовать с помощью шифрования AES в CryptoSwift. Кто-то предлагает криптосвифт в 500-1000 раз медленнее, чем обычный крипто. Кто-нибудь поможет мне интегрировать commonCrypto в мой проект. Пошагово объяснить?

Я использую в XCode8.1 и Swift 2.3

Заранее спасибо


person Senthil    schedule 14.11.2016    source источник
comment
На SO найдено ›100 обращений для [swift] commoncrypto. Пожалуйста, покажите, что вы пробовали и где вы застряли. В нынешнем виде ваш вопрос слишком широк.   -  person Martin R    schedule 14.11.2016
comment
Я пытался интегрировать, но он показывает какую-то ошибку. я не смог сделать это   -  person Senthil    schedule 14.11.2016
comment
Лучше избегать использования CryptoSwift, среди прочего, он в 500-1000 раз медленнее, чем реализации на основе Common Crypto. Common Crypto от Apple сертифицирован FIPS и, как таковой, был хорошо проверен, использование CryptoSwift дает шанс на правильность и безопасность.   -  person zaph    schedule 14.11.2016
comment
@zaph Не могли бы вы объяснить, как интегрировать   -  person Senthil    schedule 14.11.2016


Ответы (1)


Если вы ищете полное безопасное решение, которое довольно легко интегрируется, используйте RNCryptor.

Если вы ищете частичное решение, то есть просто шифрование AES без создания пароля или аутентификации, посмотрите на этот пример реализации:

Пример из раздела закрытой документации:

Шифрование AES в режиме CBC со случайным IV (Swift 3+)

iv ставится перед зашифрованными данными

aesCBC128Encrypt создаст случайный IV и префикс к зашифрованному коду. aesCBC128Decrypt будет использовать префикс IV во время расшифровки.

Входы — это данные, а ключ — это объекты данных. Если закодированная форма, такая как Base64, при необходимости преобразуется в и/или из вызывающего метода.

Ключ должен быть точно 128-битным (16-байтовым). Другие размеры ключей см. в примере Swift 3.0.

Заполнение PKCS#7 установлено по умолчанию.

Для этого примера требуется Common Crypto. Необходимо иметь связующий заголовок для проекта:

импорт

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

См. пример Swift 3 для заметок.

Это пример, а не производственный код.

func aesCBC128Encrypt(data data:[UInt8], keyData:[UInt8]) -> [UInt8]? {
    let keyLength   = size_t(kCCKeySizeAES128)
    let ivLength    = size_t(kCCBlockSizeAES128)
    let cryptDataLength = size_t(data.count + kCCBlockSizeAES128)
    var cryptData = [UInt8](count:ivLength + cryptDataLength, repeatedValue:0)

    let status = SecRandomCopyBytes(kSecRandomDefault, Int(ivLength), UnsafeMutablePointer<UInt8>(cryptData));
    if (status != 0) {
        print("IV Error, errno: \(status)")
        return nil
    }

    var numBytesEncrypted :size_t = 0
    let cryptStatus = CCCrypt(CCOperation(kCCEncrypt),
                              CCAlgorithm(kCCAlgorithmAES128),
                              CCOptions(kCCOptionPKCS7Padding),
                              keyData, keyLength,
                              cryptData,
                              data, data.count,
                              &cryptData + ivLength, cryptDataLength,
                              &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.removeRange(numBytesEncrypted+ivLength..<cryptData.count)
    }
    else {
        print("Error: \(cryptStatus)")
        return nil;
    }

    return cryptData;
}

func aesCBC128Decrypt(data data:[UInt8], keyData:[UInt8]) -> [UInt8]? {
    let clearLength = size_t(data.count)
    var clearData   = [UInt8](count:clearLength, repeatedValue:0)

    let keyLength   = size_t(kCCKeySizeAES128)
    let ivLength    = size_t(kCCBlockSizeAES128)

    var numBytesDecrypted :size_t = 0
    let cryptStatus = CCCrypt(CCOperation(kCCDecrypt),
                              CCAlgorithm(kCCAlgorithmAES128),
                              CCOptions(kCCOptionPKCS7Padding),
                              keyData, keyLength,
                              data,
                              UnsafePointer<UInt8>(data) + ivLength, data.count - ivLength,
                              &clearData, clearLength,
                              &numBytesDecrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        clearData.removeRange(numBytesDecrypted..<clearLength)

    } else {
        print("Error: \(cryptStatus)")
        return nil;
    }

    return clearData;
}

Пример использования:

let clearData = toData("clearData0123456")
let keyData   = toData("keyData890123456")

print("clearData:   \(toHex(clearData))")
print("keyData:     \(toHex(keyData))")
let cryptData = aesCBC128Encrypt(data:clearData, keyData:keyData)!
print("cryptData:   \(toHex(cryptData))")
let decryptData = aesCBC128Decrypt(data:cryptData, keyData:keyData)!
print("decryptData: \(toHex(decryptData))")

Пример вывода:

clearData:   <636c6561 72446174 61303132 33343536>
keyData:     <6b657944 61746138 39303132 33343536>
cryptData:   <9fce4323 830e3734 93dd93bf e464f72a a653a3a5 2c40d5ea e90c1017 958750a7 ff094c53 6a81b458 b1fbd6d4 1f583298>
decryptData: <636c6561 72446174 61303132 33343536>
person zaph    schedule 14.11.2016