Если вы ищете для полного безопасного решения, которые объединяют довольно легко использовать 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>
Есть> 100 хитов на SO для '[быстрой] commoncrypto'. Пожалуйста, покажите, что вы пробовали, и где вы застряли. Как бы то ни было, ваш вопрос слишком широк. –
Я попытался интегрироваться, но он показывает некоторую ошибку. Я не смог бы это сделать – iPhone25
Лучше всего избегать использования CryptoSwift, кроме других, это в 500-1000 раз медленнее, чем реализация на основе Common Crypto. Common Crypto от Apple является сертифицированным FIPS и, как таковой, был хорошо проверен, использование CryptoSwift дает шанс на правильность и безопасность. – zaph