如何在 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
不幸的是,目前没有 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
}
下一个问题是 bytes
在 Data
object 上的使用。在Swift中,这是不允许的,因为不安全;如果 Data
在您完成 bytes
之前被释放,您将崩溃或 运行 进入其他奇怪的行为。相反,您应该使用 withUnsafeBytes
,并完成需要闭包内字节的工作。这更安全,因为保证 Data
至少在闭包 return 之前有效。因为我们有三个单独的 Data
s 需要它们的字节,所以使用 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)
.
由于在 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
不幸的是,目前没有 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
}
下一个问题是 bytes
在 Data
object 上的使用。在Swift中,这是不允许的,因为不安全;如果 Data
在您完成 bytes
之前被释放,您将崩溃或 运行 进入其他奇怪的行为。相反,您应该使用 withUnsafeBytes
,并完成需要闭包内字节的工作。这更安全,因为保证 Data
至少在闭包 return 之前有效。因为我们有三个单独的 Data
s 需要它们的字节,所以使用 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)
.