如何在swift中添加三重des加密解密

时间:2018-03-20 15:52:21

标签: swift swift3 swift4

我在最近2天非常紧张由于加密/解密在三重Des在swift我跟随下面链接但不是它的显示错误我在哪里获得CCAlgorithem和CCOptions的图书馆请检查下面的图像,请帮助我这个

  

注意:我是Swift Xcode的新手

如何在我的代码中添加这些库我是swift

中的新功能
import UIKit
import CryptoSwift


class CypherSwift: NSObject {


    func tripleDesEncrypt(pass: String) -> String{
        //help from this thread
        //http://stackoverflow.com/questions/25754147/issue-using-cccrypt-commoncrypt-in-swift

        let keyString        = "25d1d4cb0a08403e2acbcbe0"
        let keyData: NSData! = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

        let message       = pass
        let data: NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

        let cryptData    = NSMutableData(length: Int(data.length) + kCCBlockSize3DES)!

        let keyLength              = size_t(kCCKeySize3DES)
        let operation: CCOperation = UInt32(kCCEncrypt)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
        let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

        var numBytesEncrypted :size_t = 0

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

        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData.length = Int(numBytesEncrypted)

            // Not all data is a UTF-8 string so Base64 is used
            var base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)

            print("base64cryptString = \(base64cryptString)")
            base64cryptString = base64cryptString + "\n"
            return encodeString(base64cryptString)

        } else {
            print("Error: \(cryptStatus)")
        }
        return ""
    }

    func encodeString(str: String) -> String{
        let customAllowedSet =  NSCharacterSet(charactersInString:"==\n").invertedSet
        let escapedString = str.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
        print("escapedString: \(escapedString)")
        return escapedString!

    }

}

image of error

tiple des link 1

triple des link 2

1 个答案:

答案 0 :(得分:2)

不幸的是,目前还没有针对CommonCrypto的预定义Swift模块,这意味着您必须自己在module.modulemap文件中创建一个,或者在桥接头中导入它。如果你正在制作一个应用程序而不是一个框架,后者是最简单的:只需创建一个桥接标题(如果你没有,只需将一个Objective-C源文件添加到项目中就可以了#&#&# 39; ll提供自动创建一个;之后可以删除Objective-C源文件)。接下来,将其添加到桥接标题:

#import <CommonCrypto/CommonCrypto.h>

请注意,如果您正在制作一个框架,那么桥接标题将无法正常工作,您必须制作一个模块图(让我知道是否属于这种情况,我是&#39 ;将某些内容编辑到答案中。)

无论如何,上面的内容将消除kCC未找到的所有错误。既然已经完成了,代码中仍有一些东西需要修复。

首先,摆脱不必要的NS类使用。变化:

let keyData: NSData! = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

为:

let keyData = keyString.data(using: .utf8)!

!在这种情况下是可以接受的,因为我们知道keyString是什么,我们知道它绝对可以转换为UTF-8。

现在,对data做同样的事情。不幸的是,在这种情况下,message取决于用户输入,因此我们不应该使用! - 如果消息结果不能转换为UTF-8,!将导致你的应用程序崩溃,这通常不是你想要的。最好使用guard let,然后在转换失败时保释,方法是将您的函数的返回值设为可选,并返回nil或将throws添加到您的函数中#39; s返回值并抛出错误:

guard let data = message.data(using: .utf8) else {
    return nil
    OR:
    throw CocoaError(.fileReadInapplicableStringEncoding) // or some custom error
}

下一个问题是在bytes对象上使用Data。在Swift中,这是不允许的,因为它不安全;如果在您使用Data之前取消分配bytes,您将会崩溃或遇到其他奇怪的行为。相反,您应该使用withUnsafeBytes,并在闭包内完成需要字节的工作。这更安全,因为Data保证至少在闭包返回之前有效。由于我们有三个单独的Data,我们需要字节,这对于三嵌套闭包来说有点笨拙,但我们可以这样做:

let cryptStatus = keyData.withUnsafeBytes { (keyBytes: UnsafePointer<UInt8>) in
    data.withUnsafeBytes { (dataBytes: UnsafePointer<UInt8>) in
        cryptData.withUnsafeMutableBytes { (cryptBytes: UnsafeMutablePointer<UInt8>) in
            CCCrypt(operation,
                    algoritm,
                    options,
                    keyBytes,
                    keyLength,
                    nil,
                    dataBytes,
                    data.count,
                    cryptBytes,
                    cryptData.count,
                    &numBytesEncrypted)
        }
    }
}

在那之后,你还有更多的Objective-C-isms来正确使用Swifty,你的加密功能应该完成:

cryptData.count = Int(numBytesEncrypted)

// Not all data is a UTF-8 string so Base64 is used
var base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters)

我在编码函数中看到的唯一问题是一些你应该现代化的Objective-C-isms:

let customAllowedSet = CharacterSet(charactersIn: "==\n").inverted
let escapedString = str.addingPercentEncoding(withAllowedCharacters: customAllowedSet)

还有你的编码功能的调用约定; func encodeString(str: String)表示您必须像return encodeString(str: base64cryptString)一样调用它,并带有标签。如果您想在没有标签的情况下调用它,可以将签名更改为func encodeString(_ str: String)