当我在Swift 4中使用Crypto Swift时,它给出了以下错误
Type of expression is ambiguous without more context
以下是我发布的用于加密的代码
func aesEncrypt(_ key: String, iv: String) throws -> String
{
let data = self.data(using: String.Encoding.utf8)
// Next Line is giving error
let enc = try! AES(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).encrypt([UInt8](data!))
let encData = Data(enc!)
let base64String = encData.base64EncodedString()
let result = String(base64String)
return result
}
答案 0 :(得分:1)
extension String {
func aesEncrypt(key: String) throws -> String {
// Encryption
let data = self.data(using: .utf8)!
let password = key
let ciphertext = RNCryptor.encrypt(data: data, withPassword: password)
let encryptedData = Data(ciphertext)
let stringEncrypt: String = encryptedData.base64EncodedString()
print("encryptedData: \(stringEncrypt)")
return stringEncrypt
}
func aesDecrypt(key: String) throws -> String {
// Decryption
let data = Data(base64Encoded: self)!
let password = key
do {
let ciphertext = try RNCryptor.decrypt(data: data, withPassword: password)
let decryptedData = Data(ciphertext)
let stringDecrypt = String(bytes: decryptedData, encoding: .utf8) ?? "Could not decrypt"
print("decryptedData: \(stringDecrypt)")
return stringDecrypt
} catch {
print(error)
return "Error"
}
}
func aesEncrypt(key: String, iv: String) throws -> String {
let data: Array<UInt8> = (self.data(using: .utf8)?.bytes)!
let key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!
do {
let encrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).encrypt(data)
let encryptedData = Data(encrypted)
let decrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).decrypt(encrypted)
let decryptedData = Data(decrypted)
let str = String.init(data: decryptedData, encoding: .utf8)
print(str ?? String())
return encryptedData.base64EncodedString()
} catch {
print(error)
return "error"
}
}
func aesDecrypt(key: String, iv: String) throws -> String {
let data: Array<UInt8> = (Data(base64Encoded: self)?.bytes)!
let key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!
do {
let decrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).decrypt(data)
let decryptedData = Data(decrypted)
guard let value = String.init(data: decryptedData, encoding: .utf8) else {
return "error"
}
return value
} catch {
print(error)
return "error"
}
}
}
答案 1 :(得分:0)
不要直接使用String,请使用Data或[UInt8]。 CryptoSwift具有方便的转换助手,使其更容易:https://github.com/krzyzanowskim/CryptoSwift#basics