3

我正在使用 CryptoSwift 加密我将在 URL 中传递的数据。为此,我需要将数据片段的数据类型设为 String 以连接到 NSURL 请求中。加密数据后,以字节为单位输出。如何将字节转换为无意义的字符串以传递 PHP 脚本可以解密的 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")
}

非常感谢你的帮助,

4

1 回答 1

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

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

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

于 2015-12-26T19:02:45.020 回答