Шифрование не работает в Swift4.2 с использованием CommonCrypto.Бросая ошибка 4301 - PullRequest
0 голосов
/ 08 февраля 2019

Я пытался реализовать шифрование с помощью библиотеки CommonCrypto в swift 4.2.Но не повезло, что привело к неизвестной ошибке.

Кто-нибудь, пожалуйста, посмотрите на этот код и помогите мне.

func encrypty(data value: String) -> EncryptionResult {

    guard var messageData = value.data(using: .utf8), var key = getSecretkey()?.data(using: .utf8)  else {
        return EncryptionResult.failure
    }
    //iv ata
    guard let ivData = generateRandomBytes(of: Int32(SecurityConstants.blockSize))?.data(using: .utf8) else {
        return EncryptionResult.failure
    }
    //output
    var outputData = Data(count: (messageData.count + SecurityConstants.blockSize + ivData.count))
    var localOutput = outputData
    //output length
    var outputLength: size_t = 0

    //encyrption
    let status = key.withUnsafeBytes { keyBytes in
        messageData.withUnsafeBytes { messageBytes in
            localOutput.withUnsafeMutableBytes { mutableOutput in
                ivData.withUnsafeBytes { ivDataBytes in
                    CCCrypt( CCOperation(kCCEncrypt),
                             CCAlgorithm(kCCAlgorithmAES128),
                             CCOptions(kCCOptionPKCS7Padding),
                             keyBytes,
                             key.count,
                             ivDataBytes,
                             messageBytes,
                             messageData.count,
                             mutableOutput,
                             outputData.count,
                             &outputLength)
                }
            }
        }
    }
    guard status == Int32(kCCSuccess) else {
        logError("Error in encryption")
        return EncryptionResult.failure
    }
    outputData.count = outputLength
    return EncryptionResult.success(value: outputData.base64EncodedString())
}

1 Ответ

0 голосов
/ 08 февраля 2019

Ошибка -4310 - это kCCKeySizeError (см. CommonCryptoError.h).Это означает, что ваш ключ имеет неправильный размер.

Глядя на этот код, это особенно подозрительно:

getSecretkey()?.data(using: .utf8)

Если ключ декодируется как UTF-8, это неправильный ключ.Похоже, у вас такая же проблема с вашим IV.Я подозреваю, что generateRandomBytes() не совсем делает то, что говорит.Также невозможно будет расшифровать эти данные, потому что вы выбрасываете случайный IV (который потребуется для расшифровщика).Вы создаете место для этого в выводе (что хорошо), но вы никогда не пишете это.

...