Kann ich das Modul oder exponent aus einer SecKeyRef Objekt in Swift?

In Swift habe ich eine SecKeyRef - Objekt durch Aufruf SecTrustCopyPublicKey auf einige raw-X509-Zertifikat-Daten. Dies ist, was diese SecKeyRef Objekt aussieht.

Optional(<SecKeyRef algorithm id: 1,
key type: RSAPublicKey,
version: 3, block size: 2048 bits,
exponent: {hex: 10001, decimal: 65537},
modulus: <omitted a bunch of hex data>,
addr: 0xsomeaddresshere>)

Grundsätzlich SecKeyRef - Objekt enthält eine ganze Reihe von Informationen über den öffentlichen Schlüssel, aber es scheint kein Weg, um tatsächlich zu konvertieren SecKeyRef in einen string NSData oder sonst etwas (das ist mein Ziel, ist, nur um eine base64-public-key).

Allerdings habe ich eine Funktion, die ich geben kann modulus und ein exponent, und es wird nur berechnet, was der öffentliche Schlüssel ist. Ich habe es getestet, indem in den Daten protokolliert, die von den oben SecKeyRef.

Aber irgendwie kann ich keinen Zugriff auf diese Eigenschaften vom SecKeyRef Objekt (ich kann nur sehen, wie das ganze Objekt in die Konsole; ich kann zum Beispiel nicht tun SecKeyRef.modulus oder irgendetwas in der Art, wie es scheint).

Meine Frage: wie kann ich den Zugriff SecKeyRef.modulus oder alternativ konvertieren Sie diese SecKeyRef in NSData oder etwas ähnliches? Dank

Bearbeiten

(weitere Informationen)

Ich bin mir SecKeyRef dynamisch, durch diese Funktion habe ich noch:

func bytesToPublicKey(certData: NSData) -> SecKeyRef? {
    guard let certRef = SecCertificateCreateWithData(nil, certData) else { return nil }
    var secTrust: SecTrustRef?
    let secTrustStatus = SecTrustCreateWithCertificates(certRef, nil, &secTrust)
    if secTrustStatus != errSecSuccess { return nil }
    var resultType: SecTrustResultType = UInt32(0) //result will be ignored.
    let evaluateStatus = SecTrustEvaluate(secTrust!, &resultType)
    if evaluateStatus != errSecSuccess { return nil }
    let publicKeyRef = SecTrustCopyPublicKey(secTrust!)

    return publicKeyRef
}

Was das bedeutet ist dauert die raw-byte-stream aus einer Bescheinigung, die ausgestrahlt werden können, von, sagen wir, ein Stück hardware mit PKI), und dann verwandelt sich in ein SecKeyRef.

Edit 2

(Kommentare auf vorhandene Antworten, die von 7. Januar 2015)

Funktioniert nicht:

let mirror = Mirror(reflecting: mySecKeyObject)

for case let (label?, value) in mirror.children {
    print (label, value)
}

Diese Ergebnisse, die in dieser Ausgabe in der Konsole:

Some <Raw SecKeyRef object>

Nicht sicher, was der string "Einige" bedeutet.

Darüber hinaus mirror.descendant("exponent") (oder "E-Modul") Ergebnisse in nil, auch wenn beim drucken der raw-Objekt in der Konsole, ich kann deutlich sehen, dass diese Eigenschaften vorhanden sind, und dass Sie in der Tat aufgefüllt.

Auch, wenn überhaupt möglich, ich möchte vermeiden, dass das speichern auf den Schlüsselbund, das Lesen als NSData, und dann löschen aus dem Schlüsselbund. Wie bereits in der bounty-Beschreibung, wenn nur auf diese Weise möglich, bitte zitieren Sie eine autoritative Referenz. Danke für alle Antworten so weit.

  • Haben Sie sah das Antwort noch? Oder die Antworten aufgelistet, here? Sie sind Obj-C aber es ist nicht schwer zu übersetzen.
  • vielen Dank für Ihren Kommentar. Leider habe ich ja schon kämmen durch diejenigen, die für ein paar Stunden jetzt, und hatte noch nicht viel Glück. Sie scheinen nicht zu sein, ganz das, was ich bin auf der Suche nach genau (Sie geht es hauptsächlich um das erzeugen von Schlüsselpaaren, wie es scheint). Vielleicht bin ich falsch.
  • Das ist bedauerlich,. Ich konnte nicht wirklich was finden andere an diesem Thema und alles was den letzten ignoriert wurde. Ich habe keine spezifische Kenntnisse zu diesem Thema. Viel Glück und sorry, ich konnte nicht helfen!
  • danke!!!
  • stackoverflow.com/questions/27758446/...
  • let mirrorKey = Mirror(reflecting: secKey); let exponent = mirrorKey.descendant("exponent"); let modulus = mirrorKey.descendant("modulus");
  • Schreiben Sie es in den Schlüsselbund und Sie erhalten eine NSData zurück. Sie können es löschen, nach, dass. Auf diese Weise ist auch das, was ich in meiner Produktions-app.
  • Früh Sie sagen, '...das ist mein Ziel, ist, nur um eine base64-public-key " und noch die Funktion, das Gebäude der SecKeyRef nimmt ein array von bytes (in NSData form) als parameter. Wenn Sie möchten, dass die öffentlichen Schlüssel in base64-Sie kann aus NSData.
  • vielen Dank für Ihre Antwort. Wie so? Das array von bytes (in NSData-form) ist eine ganze X509-Zertifikat.
  • Mein Fehler, habe ich falsch gelesen, dass Absatz zu bedeuten, dass Sie waren vorbei in der public-key in NSData form. Koffein-Mangel. Wenn Sie das Zertifikat mit dem öffentlichen und privaten Schlüssel, ich bin 100% sicher, dass ich weiß, wie man den öffentlichen Schlüssel, der mit obj-c. Gebt mir ein paar zu übersetzen, dass der Swift.
  • Ich weiß von Koffein Mangel nur allzu gut. Danke! Freue mich zu hören wieder von Ihnen.
  • nur eine Anmerkung: die Verwendung von SecKeyCopyModulus in einer iOS-app wird von b abgelehnt von Apple: ich habe von iTunesConnect: Wir haben entdeckt, dass einer oder mehrere Probleme mit Ihrer letzten Lieferung für ".....". Für die Bearbeitung Ihrer Lieferung, die folgenden Probleme müssen behoben werden: Nicht-öffentliche API-Nutzung: Die app Referenzen, die nicht-öffentliche Symbole in .....: _SecKeyCopyModulus so vorsichtig sein.
  • "Ich habe eine Funktion, die ich geben kann, ein modulus und den Exponenten, und es wird nur berechnet, was der öffentliche Schlüssel ist" -- modulus und exponent zusammen sind die public-key! Der rest ist nur Verpackung/dressing Dinge.
  • haben u die Lösung gefunden für dieses Problem?

InformationsquelleAutor Josh Beam | 2015-12-22
Schreibe einen Kommentar