8

我想使用 RSA 加密数据,我试图在我的代码中生成密钥并且它正在工作,但我真正需要的是从服务器获取公钥作为字符串,然后将其用作 Seckey,以便我可以使用它来加密使用 RSA 的数据,我尝试了以下代码:

//KeyString is the string of the key from server
let KeyData = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!


    var cert : Unmanaged<SecCertificateRef>!;
    var  policy : Unmanaged<SecPolicy>!;
    cert = SecCertificateCreateWithData(kCFAllocatorDefault, KeyData);
    policy = SecPolicyCreateBasicX509();
    var status : OSStatus = noErr
    var trust: SecTrust?
    var certArray : [Unmanaged<SecCertificateRef>!] = [cert];
    var certArrayPointer = UnsafeMutablePointer<UnsafePointer<Void>>(certArray)
    status = SecTrustCreateWithCertificates(cert, policy, trust);
    let publicKey: SecKeyRef = SecTrustCopyPublicKey(trust!).takeUnretainedValue()

我无法运行此代码,因为 SecTrustCreateWithCertificates 方法期望证书为 anyObject!,我不知道如何解决这个问题,如果解决这个问题会让我得到 SecKey。

我从objective-c的这个答案中得到了上面的代码

因此,如果有人可以帮助我获得正确的代码来解决这个问题,我将非常感激:)

4

3 回答 3

17

对于 mac:

let pubKey = "-----BEGIN PUBLIC KEY-----MIICIjANBgAgK.......InbFk1FkucQqruMyUCAwEAAQ==-----END PUBLIC KEY-----"
let pubKeyData = pubKey.dataUsingEncoding(NSASCIIStringEncoding)
var error: Unmanaged<CFErrorRef>?
let secKey = SecKeyCreateFromData(NSDictionary(), pubKeyData!, &error)

其中 pubKey 是您的公钥的字符串表示形式。如果您不知道您的公钥,您可以使用以下命令从您的私钥推断它:

openssl rsa -in server.key -pubout  > mykey.pub

其中 server.key 是包含-----BEGIN RSA PRIVATE KEY----- 为第一行的文件。

对于 iOS:

这有点复杂。你需要一个der文件。它是您证书的二进制表示。如果需要转换现有证书,可以使用以下命令进行:

 openssl x509 -outform der -in file.crt|pem -out mycert.der

.crtor.pem文件包含-----BEGIN CERTIFICATE-----作为第一行。

der文件放入您的包中并执行以下操作:

let certificateData = NSData(contentsOfURL:NSBundle.mainBundle().URLForResource("mycert", withExtension: "der")!)

let certificate = SecCertificateCreateWithData(nil, certificateData!)

var trust: SecTrustRef?

let policy = SecPolicyCreateBasicX509()
let status = SecTrustCreateWithCertificates(certificate!, policy, &trust)

if status == errSecSuccess {
    let key = SecTrustCopyPublicKey(trust!)!;
}

亚塔!Key 现在包含SecKey您的公钥的表示。快乐别针。

于 2015-12-08T13:24:14.650 回答
0

我是这样做的:

let cert = SecCertificateCreateWithData(kCFAllocatorDefault, certData)?.takeRetainedValue()

if cert != nil {
    var trust: Unmanaged<SecTrust>?

    let policy = SecPolicyCreateBasicX509().takeRetainedValue()
    let status = SecTrustCreateWithCertificates(cert, policy, &trust)

    if status == errSecSuccess {
        let trustRef = trust!.takeRetainedValue()
        let key = SecTrustCopyPublicKey(trustRef)!.takeRetainedValue();
    }
}

这可行,但您需要确保传递给SecCertificateCreateWithData()的是 DER 编码的证书,而不仅仅是 DER 编码的密钥。您需要由服务器的私钥签名的证书才能获取关联的公钥。

于 2015-04-26T21:48:46.280 回答
0

我这样做使用了 Alamofire:

private static func publicKeyForCertificate(certificate: SecCertificate) -> SecKey? {
    var publicKey: SecKey?
    var trust: Unmanaged<SecTrust>?

    let policy = SecPolicyCreateBasicX509().takeRetainedValue()
    let status = SecTrustCreateWithCertificates(certificate, policy, &trust)

    if status == errSecSuccess {
        let trustRef = trust!.takeRetainedValue()
        publicKey = SecTrustCopyPublicKey(trustRef)!.takeRetainedValue()

    }
    return publicKey

}
于 2015-08-05T07:19:42.733 回答