如何在 SWIFT 中添加三重 DES 加密解密



由于swift 中的三重 Des 加密/解密,我最近 2 天非常紧张,我遵循以下链接,但没有显示错误,我得到 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!
}
}

错误图像

Tiple des Link 1

三重链接 2

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

#import <CommonCrypto/CommonCrypto.h>

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

无论如何,以上内容将摆脱有关未找到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添加到函数的返回值并抛出错误:

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

下一个问题是在Data对象上使用bytes。在 Swift 中,这是不允许的,因为它不安全;如果在完成bytes之前解除分配Data,您将崩溃或遇到其他奇怪的行为。相反,您应该使用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 主义来制作正确的 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)

最新更新