来自Swift中服务器的公钥字符串的Seckey
我想使用RSA加密数据,我试图在我的代码中生成密钥并且它正在工作,但我真正需要的是从服务器获取公钥作为字符串然后将其用作Seckey,以便我可以使用它来加密使用RSA的数据,我试过这段代码:
//KeyString is the string of the key from server let KeyData = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! var cert : Unmanaged!; var policy : Unmanaged!; cert = SecCertificateCreateWithData(kCFAllocatorDefault, KeyData); policy = SecPolicyCreateBasicX509(); var status : OSStatus = noErr var trust: SecTrust? var certArray : [Unmanaged!] = [cert]; var certArrayPointer = UnsafeMutablePointer<UnsafePointer>(certArray) status = SecTrustCreateWithCertificates(cert, policy, trust); let publicKey: SecKeyRef = SecTrustCopyPublicKey(trust!).takeUnretainedValue()
我无法运行此代码,因为SecTrustCreateWithCertificates方法期望证书为anyObject! ,我不知道如何解决这个问题,如果解决这个问题,我会得到SecKey。
我在objective-c中从这个答案得到了上面的代码
所以,如果任何人可以帮助我找到正确的代码来解决这个问题,我将非常感谢:)
对于mac:
let pubKey = "-----BEGIN PUBLIC KEY-----MIICIjANBgAgK.......InbFk1FkucQqruMyUCAwEAAQ==-----END PUBLIC KEY-----" let pubKeyData = pubKey.dataUsingEncoding(NSASCIIStringEncoding) var error: Unmanaged? let secKey = SecKeyCreateFromData(NSDictionary(), pubKeyData!, &error)
pubKey是公钥的字符串表示forms。 如果您不知道公钥,可以使用以下命令从私钥中推断出它:
openssl rsa -in server.key -pubout > mykey.pub
其中server.key是包含-----BEGIN RSA PRIVATE KEY-----
作为第一行的文件。
对于iOS:
这有点复杂。 你需要一个文件。 它是您的证书的二进制表示。 如果需要转换现有证书,可以使用以下命令执行此操作:
openssl x509 -outform der -in file.crt|pem -out mycert.der
.crt
或.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!)!; }
Yatta! 密钥现在包含公钥的SecKey
表示。 快乐钉扎。
这是我如何做到这一点:
let cert = SecCertificateCreateWithData(kCFAllocatorDefault, certData)?.takeRetainedValue() if cert != nil { var trust: Unmanaged? 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编码的密钥。 您需要由服务器的私钥签名的证书才能获取关联的公钥。
我这是用过Alamofire:
private static func publicKeyForCertificate(certificate: SecCertificate) -> SecKey? { var publicKey: SecKey? var trust: Unmanaged? let policy = SecPolicyCreateBasicX509().takeRetainedValue() let status = SecTrustCreateWithCertificates(certificate, policy, &trust) if status == errSecSuccess { let trustRef = trust!.takeRetainedValue() publicKey = SecTrustCopyPublicKey(trustRef)!.takeRetainedValue() } return publicKey }
- Transit MKDirectionsRequest产生空错误Error Domain = MKErrorDomain Code = 5“(null)”
- Swift:在数组中find重复的CNContact对象
- 是否有可能dynamic改变代码中的类的名称与variables?
- Swift 3-从主线程更新UI
- Pixate Freestyle:清除styleClass属性不重置样式
- ios Facebook自定义urlscheme打开用户configuration文件
- iOS:如何在设备旋转后运行一个函数(Swift)
- 如何使用委托方法在两个视图控制器之间传递对象?
- 从iOS和.NET的PHPencryption差异