来自Swift中服务器的公钥字符串的Seckey

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

对于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)
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----- 第一行的文件.

对于iOS:

这有点复杂.你需要一个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表示.快乐钉扎.

  • 这不会回答问题“来自服务器发送的公钥字符串中的SecKey” (2认同)