在Swift中,我SecKeyRef通过调用SecTrustCopyPublicKey一些原始的X509证书数据来创建一个对象.这就是这个SecKeyRef对象的样子.
Optional(<SecKeyRef algorithm id: 1,
key type: RSAPublicKey,
version: 3, block size: 2048 bits,
exponent: {hex: 10001, decimal: 65537},
modulus: <omitted a bunch of hex data>,
addr: 0xsomeaddresshere>)
Run Code Online (Sandbox Code Playgroud)
基本上,这个SecKeyRef对象包含大量关于公钥的信息,但似乎没有办法将它实际转换SecKeyRef为字符串NSData,或其他任何东西(这是我的目标,只是为了得到一个base64公钥).
但是,我有一个函数,我可以给一个modulus和一个exponent,它只会计算公钥是什么.我通过传递从上面记录的数据来测试它SecKeyRef.
但不知怎的,我无法从SecKeyRef对象访问这些属性(我只能在控制台中看到整个对象;例如,我SecKeyRef.modulus似乎无法做或任何类型的东西,似乎).
我的问题:我如何访问SecKeyRef.modulus,或者将其转换SecKeyRef为NSData类似的东西?谢谢
(欲获得更多信息)
我正在创建我的SecKeyRef动态,通过这个函数,我有:
func bytesToPublicKey(certData: NSData) -> SecKeyRef? {
guard let certRef = SecCertificateCreateWithData(nil, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用密钥对加密来验证我的应用程序和我的PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.
if let pubKey = NSData(base64EncodedData: publicKey, options: NSDataBase64DecodingOptions.allZeros)! {
println(pubKey)
}
Run Code Online (Sandbox Code Playgroud)
publicKey是类型的Unmanaged<SecKey>.
我在上面的代码中得到的错误是: Extra argument 'base64EncodedData' in call
我该怎么做?有没有更好的办法?
编辑:这是密钥对的生成方式:
var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?
let parameters = [
String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
String(kSecAttrKeySizeInBits): 2048
]
let result = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr)
let publicKey = publicKeyPtr!.takeRetainedValue()
let privateKey = privateKeyPtr!.takeRetainedValue()
let blockSize = SecKeyGetBlockSize(publicKey)
Run Code Online (Sandbox Code Playgroud)
编辑2:所以问题是SecKey不是NSData,所以我的问题应该是:如何将publicKey:SecKey转换为NSData?
我使用SecKeyGeneratePair生成了一个守护者。
var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?
let publicKeyParameters: [String: AnyObject] = [
kSecAttrIsPermanent: true,
kSecAttrApplicationTag: "com.example.site.public"
]
let privateKeyParameters: [String: AnyObject] = [
kSecAttrIsPermanent: true,
kSecAttrApplicationTag: "com.example.site.private"
]
let parameters: [String: AnyObject] = [
kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits: 2048,
kSecPublicKeyAttrs.takeUnretainedValue() as String: publicKeyParameters,
kSecPrivateKeyAttrs.takeUnretainedValue() as String: privateKeyParameters
]
let result = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr)
let publicKey = publicKeyPtr!.takeRetainedValue()
let privateKey = privateKeyPtr!.takeRetainedValue()
let blockSize = SecKeyGetBlockSize(publicKey)
Run Code Online (Sandbox Code Playgroud)
如果我打印出publicKey,我可以看到模数,我很确定这是我所需要的:
publicKey: <SecKeyRef algorithm id: 1, key type: RSAPublicKey, version: 3, block size: 2048 bits, exponent: …Run Code Online (Sandbox Code Playgroud)