来自 public 的密钥字符串来自 Swift 中的服务器
Seckey from public key string from server in Swift
我想使用 RSA 加密数据,我尝试在我的代码中生成密钥并且它正在运行,但我实际需要的是从服务器获取 public 密钥作为字符串然后使用它作为 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。
我从 this answer in objective-c
得到了上面的代码
所以如果有人能帮助我获得正确的代码来解决这个问题,我将非常感激:)
我是这样做的:
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 编码的密钥。您需要一个由服务器私钥签名的证书才能获取关联的 public 密钥。
我用 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
}
对于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 是 public 密钥的字符串表示形式。
如果您不知道您的 public 密钥,您可以使用以下命令从您的私钥中推断出它:
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
.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!)!;
}
亚塔!密钥现在包含 public 密钥的 SecKey
表示。固定快乐。
我想使用 RSA 加密数据,我尝试在我的代码中生成密钥并且它正在运行,但我实际需要的是从服务器获取 public 密钥作为字符串然后使用它作为 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。
我从 this answer in objective-c
得到了上面的代码所以如果有人能帮助我获得正确的代码来解决这个问题,我将非常感激:)
我是这样做的:
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 编码的密钥。您需要一个由服务器私钥签名的证书才能获取关联的 public 密钥。
我用 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
}
对于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 是 public 密钥的字符串表示形式。 如果您不知道您的 public 密钥,您可以使用以下命令从您的私钥中推断出它:
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
.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!)!;
}
亚塔!密钥现在包含 public 密钥的 SecKey
表示。固定快乐。