如何在 AES CryptoSwift 密码后将字节转换为 NSString

How to convert bytes to NSString after AES CryptoSwift cipher

我正在使用 CryptoSwift 来加密我将传入 URL 的数据。为此,我需要将数据片段的数据类型设置为 String 以连接到 NSURL 请求中。数据加密后以字节为单位输出。如何将字节转换为无意义的字符串以传递 URL 脚本可以解密的 URL?

我可以加密成 UInt8,但是我不认为它可以通过 URL 传递给 PHP 脚本所以我需要把它变成一个字符串。

代码:

let string = "hello"
let input: [UInt8] = Array(string.utf8)
let key: [UInt8] = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
let iv: [UInt8] = AES.randomIV(AES.blockSize)
do {
    let encrypted: [UInt8] = try AES(key: key, iv: iv, blockMode: .CBC).encrypt(input, padding: PKCS7())
    print("Encrypted bytes: \(encrypted)")
    let str = String(bytes: encrypted, encoding: NSUTF8StringEncoding)
    print("String of encrypted data: \(str)") // prints a nil value
} catch AES.Error.BlockSizeExceeded {
    print("Block size exceeded")
} catch {
    print("Error encrypting or decrypting data")
}

非常感谢您的帮助,

  1. 不要使用 CryptoSwift,它既不快(比 Common Crypto 慢 500-1000 倍)也不安全(它缺乏实质性审查)。

  2. 加密数据与随机数据字节无法区分。

  3. 并非所有数据数组都可以转换为任何编码的字符串。有许多数据字节没有可打印的表示或字符串编码中的任何表示。这就是为什么原始数据字节通常被编码为 Base64 或十六进制字符串。