gpt4 book ai didi

ios - 无法在 swift 中解密使用 openssl -aes256 加密的字符串

转载 作者:行者123 更新时间:2023-11-29 05:45:34 26 4
gpt4 key购买 nike

我想在应用程序外部加密 key 并传递给应用程序。在应用程序中,再次使用这些 key 时必须使用加密时使用的 key 来解密字符串。

在 Swift 中解密时使用哪个 key ? “FUUU”或由 openssl 命令生成的 key

在 mac 上,我使用 openssl -aes256 生成加密字符串,但在 swift 中解密时,它总是返回 nil。如果我设置由 openssl 生成的 key ,则会出现错误“错误:无法设置 key 。”和“错误:无法设置初始向量。”

echo -n "TEST1" | openssl enc -aes256 -k FUUU -nosalt -a -p

控制台输出

key=59C12FFF74992ED40F4DF80A56AB55AE7C513B17CB4B8CF8342E9444C7F7AF3B
iv =0BEE68AD25123B7076B91A5AFB549E33
bYbkQJcDFZt3y3UQEMbEeg==

用 Swift 解密

let encryptedMessage = "bYbkQJcDFZt3y3UQEMbEeg==".data(using: .utf8)!
let key256 = "59C12FFF74992ED40F4DF80A56AB55AE7C513B17CB4B8CF8342E9444C7F7AF3B" // 32 bytes for AES256
let iv = "0BEE68AD25123B7076B91A5AFB549E33" // 16 bytes for AES128

let aes256 = AES(key: key256, iv: iv)

let decryptedMessage256 = aes256?.decrypt(data: encryptedMessage)
print("Decrypted: \(String(bytes: decryptedMessage256, encoding: .utf8))")

AES

import CommonCrypto

struct AES {

// MARK: - Value
// MARK: Private
private let key: Data
private let iv: Data

// MARK: - Initialzier
init?(key: String, iv: String) {
guard key.count == kCCKeySizeAES128 || key.count == kCCKeySizeAES256, let keyData = key.data(using: .utf8) else {
debugPrint("Error: Failed to set a key.")
return nil
}

guard iv.count == kCCBlockSizeAES128, let ivData = iv.data(using: .utf8) else {
debugPrint("Error: Failed to set an initial vector.")
return nil
}

self.key = keyData
self.iv = ivData
}

// MARK: - Function
// MARK: Public
func encrypt(string: String) -> Data? {
return crypt(data: string.data(using: .utf8), option: CCOperation(kCCEncrypt))
}

func decrypt(data: Data?) -> String? {
guard let decryptedData = crypt(data: data, option: CCOperation(kCCDecrypt)) else { return nil }
return String(bytes: decryptedData, encoding: .utf8)
}

func crypt(data: Data?, option: CCOperation) -> Data? {
guard let data = data else { return nil }

let cryptLength = [UInt8](repeating: 0, count: data.count + kCCBlockSizeAES128).count
var cryptData = Data(count: cryptLength)

let keyLength = [UInt8](repeating: 0, count: kCCBlockSizeAES128).count
let options = CCOptions(kCCOptionPKCS7Padding)

var bytesLength = Int(0)

let status = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
iv.withUnsafeBytes { ivBytes in
key.withUnsafeBytes { keyBytes in
CCCrypt(option, CCAlgorithm(kCCAlgorithmAES), options, keyBytes, keyLength, ivBytes, dataBytes, data.count, cryptBytes, cryptLength, &bytesLength)
}
}
}
}

guard UInt32(status) == UInt32(kCCSuccess) else {
debugPrint("Error: Failed to crypt data. Status \(status)")
return nil
}

cryptData.removeSubrange(bytesLength..<cryptData.count)
return cryptData
}
}

最佳答案

恐怕桌面密码框架与移动密码框架不匹配,这是iOS上的常见问题,您必须创建自己的密码才能匹配它。

但另一方面,您可以使用 CryptoSwift ,它非常可靠,我个人使用它,它确实与服务器密码匹配,所以我认为它可以解决你的问题。

关于ios - 无法在 swift 中解密使用 openssl -aes256 加密的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56170640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com