我正在使用Xcode 11.0 beta 2上苹果公司的新CryptoKit框架。我想创建一个SymmetricKey,然后获取密钥的原始字节。我想使用这些字节来创建相同的密钥,然后检查以确保密钥相等。据我在文档中了解的那样,访问键的原始字节的唯一方法是使用withUnsafeBytes(_:)方法。我有一个带有以下代码的游乐场:
import Foundation
import CryptoKit
let key1 = SymmetricKey(size: .bits256)
key1.withUnsafeBytes { body in
let rawKeyBytes = body.load(as: Data.self)
let key2 = SymmetricKey(data: rawKeyBytes)
print("Are they equal? \(key1 == key2)")
}
其输出为Are they equal? false
,因此不幸的是键不匹配。假设我可以使这些键匹配,我也不确定如何将rawKeyBytes
转换为字符串以便在Playground输出中查看它。总体而言,我对UnsafeRawBufferPointer或ContiguousBytes不太熟悉。
答案 0 :(得分:0)
我认为您不能以这种方式在load
上使用Data
。但是无论如何,您想要的是这样的:
let key1 = SymmetricKey(size: .bits256)
let key2 = key1.withUnsafeBytes { SymmetricKey(data: Data($0)) }
print("Are they equal? \(key1 == key2)")
访问在其自己的withUnsafeBytes
块内的值通常很危险(例如,访问key1
内的key1.withUnsafeBytes
)。我不记得在此特定情况下是否禁止使用它,但通常应避免使用它,因为它会导致独占访问冲突。
答案 1 :(得分:0)
像您说的那样将一个键与另一个键进行比较是没有意义的。如果要提取密钥,请使用以下简单行:
let keyb64 = key.withUnsafeBytes {
return Data(Array($0)).base64EncodedString()
}
或仅将base64EncodedString()
删除Data
才能发送到服务器或放入钥匙串。
最诚挚的问候
答案 2 :(得分:0)
我不得不做同样的事情,最终做了一些扩展以简化流程:
import CryptoKit
import Foundation
extension SymmetricKey {
// MARK: Custom Initializers
/// Creates a `SymmetricKey` from a Base64-encoded `String`.
///
/// - Parameter base64EncodedString: The Base64-encoded string from which to generate the `SymmetricKey`.
init?(base64EncodedString: String) {
guard let data = Data(base64Encoded: base64EncodedString) else {
return nil
}
self.init(data: data)
}
// MARK: - Instance Methods
/// Serializes a `SymmetricKey` to a Base64-encoded `String`.
func serialize() -> String {
return self.withUnsafeBytes { body in
Data(body).base64EncodedString()
}
}
}
并以此进行测试:
import CryptoKit
func symmetricKeyTest() {
let symmetricKey = SymmetricKey(size: .bits256)
let serializedSymmetricKey = symmetricKey.serialize()
guard let deserializedSymmetricKey = SymmetricKey(base64EncodedString: serializedSymmetricKey) else {
print("deserializedSymmetricKey was nil.")
return
}
print("Keys match: \(symmetricKey == deserializedSymmetricKey)")
}
答案 3 :(得分:-1)
以下内容似乎对我有用
import CryptoKit
import Foundation
let key1 = SymmetricKey(size: .bits256)
key1.withUnsafeBytes { ptr in
let rawKeyBytes = Data(bytes: ptr.baseAddress!, count: ptr.count)
let key2 = SymmetricKey(data: rawKeyBytes)
print("Are they equal? \(key1 == key2)")
}