jam*_*mil 5 encryption-asymmetric public-key-encryption ios swift seckeyref
我想使用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()
Run Code Online (Sandbox Code Playgroud)
我无法运行此代码,因为SecTrustCreateWithCertificates方法期望证书为anyObject!,我不知道如何解决这个问题,如果解决这个问题,我会得到SecKey.
我在objective-c中从这个答案得到了上面的代码
所以,如果任何人可以帮助我找到正确的代码来解决这个问题,我将非常感谢:)
Ant*_*tzi 15
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)
Run Code Online (Sandbox Code Playgroud)
pubKey是公钥的字符串表示形式.如果您不知道公钥,可以使用以下命令从私钥推断出它:
openssl rsa -in server.key -pubout > mykey.pub
Run Code Online (Sandbox Code Playgroud)
其中server.key是包含-----BEGIN RSA PRIVATE KEY-----
第一行的文件.
这有点复杂.你需要一个der文件.它是您的证书的二进制表示.如果需要转换现有证书,可以使用以下命令执行此操作:
openssl x509 -outform der -in file.crt|pem -out mycert.der
Run Code Online (Sandbox Code Playgroud)
该.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!)!;
}
Run Code Online (Sandbox Code Playgroud)
Yatta!Key现在包含公钥的SecKey表示.快乐钉扎.