我在最近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!
}
}
答案 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)
。