2016-11-14 4 views
0

Я пытаюсь реализовать с помощью AES Encryption в CryptoSwift. Кто-то предлагает cryptoswift от 500 до 1000 раз медленнее, чем commonCrypto. Любой способ интегрировать commonCrypto в мой проект. Шаг за шагом объясните?common crypto in swift 2.3 и Xcode8.1

Я использую в XCode8.1 и стремительные 2,3

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

+0

Есть> 100 хитов на SO для '[быстрой] commoncrypto'. Пожалуйста, покажите, что вы пробовали, и где вы застряли. Как бы то ни было, ваш вопрос слишком широк. –

+0

Я попытался интегрироваться, но он показывает некоторую ошибку. Я не смог бы это сделать – iPhone25

+0

Лучше всего избегать использования CryptoSwift, кроме других, это в 500-1000 раз медленнее, чем реализация на основе Common Crypto. Common Crypto от Apple является сертифицированным FIPS и, как таковой, был хорошо проверен, использование CryptoSwift дает шанс на правильность и безопасность. – zaph

ответ

1

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

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

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

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

ХВ является приставкой к зашифрованным данным

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

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

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

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

Этот пример требует Common Crypto Необходимо иметь мостовую заголовок проекта:

импорт

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

См. Пример 5 для заметок.

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

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("clearData") 
let keyData = toData("keyData89") 

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> 
Смежные вопросы