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

how to add triple des encryption decryption in swift

由于在 swift 中的三重 Des 加密/解密,我最近 2 天非常紧张,我在下面关注 link 但不是它的显示错误,我得到 CCAlgorithem 和 CCOptions 的库请检查下图,请帮我这个

Note: I'm New In Swift Xcode

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

的新手
import UIKit
import CryptoSwift


class CypherSwift: NSObject {


    func tripleDesEncrypt(pass: String) -> String{
        //help from this thread
        //

        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

不幸的是,目前没有 pre-defined Swift CommonCrypto 模块,这意味着您必须自己在 module.modulemap 文件中创建一个,或者将其导入您的桥接 header。如果你正在制作一个应用程序而不是一个框架,那么后者是最简单的:只需创建一个桥接 header(如果你没有,只需将一个 Objective-C 源文件添加到项目中并它会自动创建一个;您可以随后删除 Objective-C 源文件)。接下来,将其添加到桥接 header:

#import <CommonCrypto/CommonCrypto.h>

请注意,如果您正在制作一个框架,桥接 header 将不起作用,您将不得不制作一个模块映射(如果是这种情况请告诉我,我会在答案中编辑一些内容)。

无论如何,以上将消除所有关于 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 然后在转换失败时退出,方法是将函数的 return 值设为可选,然后 returning nil 或将 throws 添加到您的函数的 return 值并抛出错误:

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

下一个问题是 bytesData object 上的使用。在Swift中,这是不允许的,因为不安全;如果 Data 在您完成 bytes 之前被释放,您将崩溃或 运行 进入其他奇怪的行为。相反,您应该使用 withUnsafeBytes,并完成需要闭包内字节的工作。这更安全,因为保证 Data 至少在闭包 return 之前有效。因为我们有三个单独的 Datas 需要它们的字节,所以使用 triple-nested 闭包有点笨拙,但我们可以做到:

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 主义:

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

还有编码函数的调用约定; func encodeString(str: String) 意味着您必须像 return encodeString(str: base64cryptString) 一样使用标签来称呼它。如果想不带标签调用,可以把签名改成func encodeString(_ str: String).