我在swift 3中使用AES加密,我使用这个CryptoSwift库
这是我加密字符串的代码,结果是可读字符串:/QOEtrf3o8buv2wA9FeAyg==
。
我怎样才能得到这样的奇怪字符(不可读):Ί�^��h��y^ғ
?
var input = "CryptoSwift"
var key = "passwordpassword"
var iv = "drowssapdrowssap"
func aesEncrypt(input: String, key: String, iv: String) throws -> String {
let data = input.utf8
let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt([UInt8](data))
let encryptedData = Data(encrypted)
return encryptedData.base64EncodedString()
}
let encrypted = try! aesEncrypt(input: input, key: key, iv: iv)
print("encrypted: \(encrypted)")
--------- Result: /QOEtrf3o8buv2wA9FeAyg== I want the result something like this: Ί�^��h��y^ғ, the strange characters.
答案 0 :(得分:2)
“Ί ^ h y^ғ”不是一个合适的字符串。字符“ ”表示“这不是一个角色”。 (它的技术名称是当字节序列对您正在使用的基于Unicode的编码无效时使用的“替换字符”)。由于“ ”可能是许多不同的字节序列,“Ί ^ h y^ғ”并不是真正有意义的。有大量的字节序列可以解码成无意义的字符串。
你得到一个“可读字符串”,因为你正在编码Base64中加密函数产生的随机字节。
通过“想要”包含something的东西(因为那是胡说八道),你的意思并不是很清楚。如果您需要数据,只需返回Data
(不要致电base64EncodedString()
)。作为一般规则,这是您想要使用的。加密数据为Data
,不是“字符串”。
你想要做什么,你想要一个在编码中丢失信息的无意义字符串?
答案 1 :(得分:1)
您不应该将其转换为Base64。
let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt([UInt8](data))
let encryptedData = Data(bytes: UnsafePointer<UInt8>(encrypted), count: Int(encrypted.count))
// let encryptedString = String(data: encryptedData,encoding: String.Encoding.utf8)
// use the encryptedData to write it into a file.
答案 2 :(得分:0)
您将返回一个base64编码的字符串,该字符串始终是可读的ASCII。我不熟悉CryptoSwift,但是如果你能找到一些方法来返回原始加密数据,它应该看起来像你想要的那样。
答案 3 :(得分:0)
以下是我如何使用它来正确解密和加密字符串。您需要在以后的数据中使用hexString和hexString创建字符串。这就是CryptoSwift的工作原理。
extension String{
func aesEncrypt(key: String, iv: String) throws -> String {
let data = self.data(using: .utf8)!
let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC).encrypt([UInt8](data))
let encryptedData = Data(encrypted)
try? encryptedData.toHexString().aesDecrypt(key: key, iv: iv)
return encryptedData.toHexString()
}
func aesDecrypt(key: String, iv: String) throws -> String {
let data = self.dataFromHexadecimalString()!
print(data)
let decrypted = try! AES(key: key, iv: iv, blockMode: .CBC).decrypt([UInt8](data))
let decryptedData = Data(decrypted)
return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt"
}
func dataFromHexadecimalString() -> Data? {
var data = Data(capacity: characters.count / 2)
let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
regex.enumerateMatches(in: self, options: [], range: NSMakeRange(0, characters.count)) { match, flags, stop in
let byteString = (self as NSString).substring(with: match!.range)
var num = UInt8(byteString, radix: 16)
data.append(num!)
}
return data
}
}
extension Data {
public var bytes: Array<UInt8> {
return Array(self)
}
public func toHexString() -> String {
return self.bytes.toHexString()
}
}