обща крипто в swift 2.3 и Xcode8.1

Опитвам се да внедря, като използвам AES криптиране в CryptoSwift. Някой предлага cryptoswift 500 до 1000 пъти по-бавно от commonCrypto. Някой да ми помогне да интегрирам commonCrypto в моя проект. Обяснете стъпка по стъпка?

Използвам в XCode8.1 и swift 2.3

Благодаря предварително


person Senthil    schedule 14.11.2016    source източник
comment
Има ›100 посещения на SO за [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