相关疑难解决方法(0)

我可以从Swift中的SecKeyRef对象获得模数或指数吗?

在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)

encryption cryptography public-key-encryption ios swift

25
推荐指数
3
解决办法
6199
查看次数

如何将非托管<SecKey>编码为base64以发送到另一台服务器?

我正在尝试使用密钥对加密来验证我的应用程序和我的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?

base64 public-key-encryption swift

3
推荐指数
1
解决办法
3448
查看次数

如何导出使用SecKeyGeneratePair生成的公钥&lt;SecKey&gt;并在服务器上使用?

我使用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)

public-key-encryption swift ios8

2
推荐指数
1
解决办法
4675
查看次数