AES加密到奇怪的字符

时间:2017-05-23 03:03:58

标签: ios swift xcode encryption aes

我在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.

4 个答案:

答案 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()
    }
}