2015-01-09 6 views
2

SecKeyGeneratePair를 사용하여 키퍼를 생성했습니다.서버에서 SecKeyGeneratePair를 사용하여 생성 된 공개 키 <SecKey>을 내보내려면 어떻게해야합니까?

publicKey: <SecKeyRef algorithm id: 1, key type: RSAPublicKey, version: 3, block size: 2048 bits, exponent: {hex: 10001, decimal: 65537}, modulus: B2A7BD90C909F8084AD5B34040ABDAF7D1A6AFBADB35F3B6AB5CDDAB473449B0F175DEA32A7476F339D98F4AB3716AA2C1476D4009A80574B984DDFA1EF1A2550E48C46791CEFBFC39EF281049AA74E4C734C3B2A7B3F621B8A41F8B6689C4978696690D4EF9FFF0F90DB85C8ECBCF721FB7652AD7B337880A09D97EA736008C3ADBB72223F18C522C0C0889B05122561042D8637D1CBEF8F9F5AE88CDC43E411AA217E2A81C2D812B46D01C3BDC2799DFF3EAD46BB092A566E18EE94F63C4690ECE806B993FDDAC3159BE2098C2428F24969C109E221D8F066BEE3530848DE328D888B4C7E701435EACB116F97BB77B9379EF818B4D280890262EE678B92705, addr: 0x144841a00> 

하지만 내가 할 수 있도록 키를 내보내는 방법을 알아낼 수 없습니다 : 나는 내가 확신 계수를 볼 수있는 공개 키를 인쇄 할 경우

 var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>? 

     let publicKeyParameters: [String: AnyObject] = [ 
      kSecAttrIsPermanent: true, 
      kSecAttrApplicationTag: "com.example.site.public" 
     ] 
     let privateKeyParameters: [String: AnyObject] = [ 
      kSecAttrIsPermanent: true, 
      kSecAttrApplicationTag: "com.example.site.private" 
     ] 
     let parameters: [String: AnyObject] = [ 
      kSecAttrKeyType: kSecAttrKeyTypeRSA, 
      kSecAttrKeySizeInBits: 2048, 
      kSecPublicKeyAttrs.takeUnretainedValue() as String: publicKeyParameters, 
      kSecPrivateKeyAttrs.takeUnretainedValue() as String: privateKeyParameters 
     ] 
     let result = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr) 
     let publicKey = publicKeyPtr!.takeRetainedValue() 
     let privateKey = privateKeyPtr!.takeRetainedValue() 
     let blockSize = SecKeyGetBlockSize(publicKey) 

내가 필요하다 내 서버로 보내서 사용하십시오.

내 이해에서. SecKey는 Keychain에 저장되며 포인터입니다. 블록 크기는 메모리에있는 키의 길이입니다. 그래서 이론적으로 NSData로 추출한 다음 서버에서 읽을 수있는 것으로 변환 할 수 있습니다. 이론적으로는 그것이 효과가있을 것이라고 생각합니다. 실제로 벽을 치려고했습니다. 모든 도움을 주시면 감사하겠습니다.

답변

3

SecItemCopyMatching을 위해 : 데이터의 크기가 키의 블록 크기와 동일하지, 270

var dataPtr:Unmanaged<AnyObject>? 
let query: [String:AnyObject] = [ 
    kSecClass: kSecClassKey, 
    kSecAttrApplicationTag: "com.example.site.public", 
    kSecReturnData: kCFBooleanTrue 
] 
let qResult = SecItemCopyMatching(query, &dataPtr) 

// error handling with `qResult` ... 

let publicKeyData = dataPtr!.takeRetainedValue() as NSData 

// convert to Base64 string 
let base64PublicKey = publicKeyData.base64EncodedStringWithOptions(nil) 

하는 것으로. this question on the crypto.stackexchange.com을 참조하십시오.

+0

유망 해 보입니다. 감사합니다. 나는 그것을 시험 할 수있는대로 바로 표시 할 것입니다. 빠른 후속 조치. NSData인데, 웹 서버에 보낼 수있는 것을 어떻게 해석 할 수 있을까요? 감사. – jackreichert

+0

서버가 받아들이는 것에 따라 다릅니다. 일반적으로 HTTP를 사용하여 서버로 전송하려면'publicKeyData.base64EncodedStringWithOptions (nil)'을 사용하여 base64 문자열로 인코딩하고'NSJSONSerialization'을 사용하여 JSON에 직렬화하십시오. – rintaro

+0

PublicKeyData를 NSData로 사용하고 있지만 여전히 base64EncodeString을 사용할 수 있습니까? – jackreichert