我有一个简单的加密例程,每次执行时都会产生不同的结果。任何人都可以识别问题吗?下面的代码只显示了三个不同时间的相同调用,您可以看到每次调用的结果都不同。
import SwiftUI
import CryptoKit
struct ContentView: View {
@State var password = "TopSecret"
@State var text = "My text"
var body: some View {
VStack {
TextField("Password", text: $password)
TextField("Text", text: $text)
Text(try! encrypt(password: password, text: text).hexEncodedString())
Text(try! encrypt(password: password, text: text).hexEncodedString()).foregroundColor(Color.blue)
Text(try! encrypt(password: password, text: text).hexEncodedString())
}
}
}
func encrypt(password: String, text: String) throws -> Data {
let x = [UInt8](text.utf8)
return try encrypt(password: password, input: x)
}
func encrypt(password: String, input: [UInt8]) throws -> Data {
let pwd = password.padding(toLength: 32, withPad: "@", startingAt: 0)
let key = SymmetricKey(data: pwd.data(using: String.Encoding.utf8)!)
let sealedBox = try AES.GCM.seal(input, using: key)
return sealedBox.combined!
}
extension Data {
struct HexEncodingOptions: OptionSet {
let rawValue: Int
static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
}
func hexEncodedString(options: HexEncodingOptions = []) -> String {
let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
return self.map { String(format: format, $0) }.joined()
}
}