【问题标题】:CCCrypt maximum time it returns nil. What is the problem in EncryptionCCCrypt 返回 nil 的最长时间。加密有什么问题
【发布时间】:2019-06-16 10:27:53
【问题描述】:

我尝试编写基于 CCCrypt 的加密 (AESCBC128) 函数,而 CCCrypt 正在生成一个随机值。

例如,当我将 016768821221 传递给函数时,它将为相同的 iv 和 Key 返回“0oTPFcKNWABTpBGgLlzsjw==”。

这里是 iv:“khabbababab”,关键是:“khabbababab”

为什么它返回 nil。加密是正确的,但有时它返回 nil

extension String {

func aesEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
    if let keyData = key.data(using: String.Encoding.utf8),
        let data = self.data(using: String.Encoding.utf8),
        let cryptData    = NSMutableData(length: Int((data.count)) + kCCBlockSizeAES128) {
        let keyLength              = kCCKeySizeAES128
        let operation: CCOperation = UInt32(kCCEncrypt)
        let algoritm:  CCAlgorithm = CCOptions(kCCAlgorithmAES128)
        let options:   CCOptions   = UInt32(options)
        var numBytesEncrypted :size_t = 0
        let cryptStatus = CCCrypt(operation,
                                  algoritm,
                                  CCOptions(options),
                                  (keyData as NSData).bytes, keyLength,
                                  iv,
                                  (data as NSData).bytes, data.count,
                                  cryptData.mutableBytes, cryptData.length,
                                  &numBytesEncrypted)
        print(String(data: data, encoding: .utf8) as Any)
        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData.length = Int(numBytesEncrypted)
            let base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters)
            print("succccc")
            return base64cryptString
        }
        else {
            print("nill nill llllllllll")
            return nil
        }
    }
    return nil
}

func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
    if let keyData = key.data(using: String.Encoding.utf8),
        let data = NSData(base64Encoded: self, options: .ignoreUnknownCharacters),
        let cryptData    = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) {

        let keyLength              = size_t(kCCKeySizeAES128)
        let operation: CCOperation = UInt32(kCCDecrypt)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
        let options:   CCOptions   = UInt32(options)

        var numBytesEncrypted :size_t = 0

        let cryptStatus = CCCrypt(operation,
                                  algoritm,
                                  options,
                                  (keyData as NSData).bytes, keyLength,
                                  iv,
                                  data.bytes, data.length,
                                  cryptData.mutableBytes, cryptData.length,
                                  &numBytesEncrypted)

        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData.length = Int(numBytesEncrypted)
            let unencryptedMessage = String(data: cryptData as Data, encoding:String.Encoding.utf8)
            return unencryptedMessage
        }
        else {
            return nil
        }
    }
    return nil
}

【问题讨论】:

    标签: encryption swift4 aes cryptoswift


    【解决方案1】:

    您的 aesEncrypt 总是将 16 的 keylength 传递给 CCCrypt,而不检查密钥实际上是否具有至少 16 个字节的数据。

    【讨论】:

    • 密钥长度正常,70% 成功返回,但有时返回 nil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2012-08-26
    • 2017-03-17
    • 1970-01-01
    • 2011-06-26
    • 2014-11-11
    相关资源
    最近更新 更多