2013-03-21 7 views
5

So überprüfen Sie die digitale Signatur mit dem öffentlichen Schlüssel in iOS ohne Verwendung von Drittanbietercode (z. B. SSL öffnen)?Digitale Signatur mit öffentlichem Schlüssel in iOS überprüfen

Ich muss digitale Signatur in iOS App mit einem öffentlichen Schlüssel überprüfen. Kann jemand mir helfen, das zu erreichen, ohne Software von Drittanbietern zu verwenden?

Ich versuche unten Code, aber das Problem ist, ich habe kein Zertifikat in meiner App, so kann nicht erstellen SecTrustRef.

Code:

NSString *certPath    = [[NSBundle mainBundle] pathForResource:@"yyy" 
                  ofType:@"xxx"]; 
    SecCertificateRef myCertificate = nil; 
    NSData *certificateData   = [[NSData alloc] initWithContentsOfFile :certPath]; 
    myCertificate     = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificateData); 

    SecPolicyRef myPolicy   = SecPolicyCreateBasicX509(); 
    SecTrustRef trustRef; 
    SecTrustCreateWithCertificates(myCertificate, myPolicy, &trustRef); 
    SecKeyRef keyRef  = SecTrustCopyPublicKey (trustRef); 


    BOOL status = SecKeyRawVerify (keyRef, 
           kSecPaddingPKCS1SHA1, 
           (const uint8_t *)[data bytes], 
           (size_t)[data length], 
           (const uint8_t *)[signature bytes], 
           (size_t)[signature length] 
          ); 

Ich habe folgendes:

  • Public Key (NSString *)
  • Unterschrift (NSString *)
  • Daten (NSString *)

Bitte helfen Sie mir, welche Option ich in iOS habe SDK, wenn ich keine Open-Source-Software von Drittanbietern verwenden möchte.

+0

Wenn meine Antwort Ihnen geholfen hat, akzeptieren Sie bitte, damit die Frage als gelöst markiert wird und anderen Benutzern hilft. Danke – mindbomb

+0

Haben Sie jemals eine Lösung oder Sie erstellt .pem? – DivineDesert

Antwort

0

Wenn Ihre Schlüsseldaten als PKCS12-Daten gepackt sind, verwenden Sie SecPKCS12Import, um sie zu importieren und den öffentlichen Schlüssel zu verwenden.

+0

Sein .pem-Format; es ist nur ein NSString, die ich von Server-Antwort-Header bekommen –

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/14637328/import-pem-encoded-x-509-certificate-into-ios-keychain – quellish

1

Sie können Ihren öffentlichen Schlüssel in einem X509-Zertifikat Paket, um die iOS leicht eingebauten Funktionen zu verwenden, mit OpenSSL:

openssl req -x509 -out public_key.pem -outform pem -new -newkey rsa:2048 -keyout private_key.pem 

das PEM-Format Base64 codiert ist, können Sie die -outform zu DEM wechseln zu bekommen Binärdatei. können Sie das PEM-Format importieren, indem Sie einen const NSString zu Ihrem Programm hinzufügen und das Hinzufügen von Kategorie zu NSData mit dieser Funktion:

- (id) initWithBase64EncodedString:(NSString *) string { 
    NSMutableData *mutableData = nil; 

    if(string) { 
     unsigned long ixtext = 0; 
     unsigned long lentext = 0; 
     unsigned char ch = 0; 
     unsigned char inbuf[4], outbuf[3]; // buffer sizes fixed by AOL LLC 
     short i = 0, ixinbuf = 0; 
     BOOL flignore = NO; 
     BOOL flendtext = NO; 
     NSData *base64Data = nil; 
     const unsigned char *base64Bytes = nil; 

     // Convert the string to ASCII data. 
     base64Data = [string dataUsingEncoding:NSASCIIStringEncoding]; 
     base64Bytes = [base64Data bytes]; 
     mutableData = [NSMutableData dataWithCapacity:[base64Data length]]; 
     lentext = [base64Data length]; 

     while(YES) { 
      if(ixtext >= lentext) break; 
      ch = base64Bytes[ixtext++]; 
      flignore = NO; 

      if((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; 
      else if((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; 
      else if((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; 
      else if(ch == '+') ch = 62; 
      else if(ch == '=') flendtext = YES; 
      else if(ch == '/') ch = 63; 
      else flignore = YES; 

      if(! flignore) { 
       short ctcharsinbuf = 3; 
       BOOL flbreak = NO; 

       if(flendtext) { 
        if(! ixinbuf) break; 
        if((ixinbuf == 1) || (ixinbuf == 2)) ctcharsinbuf = 1; 
        else ctcharsinbuf = 2; 
        ixinbuf = 3; 
        flbreak = YES; 
       } 

       inbuf [ixinbuf++] = ch; 

       if(ixinbuf == 4) { 
        ixinbuf = 0; 
        outbuf [0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4); 
        outbuf [1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2); 
        outbuf [2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F); 

        for(i = 0; i < ctcharsinbuf; i++) 
         [mutableData appendBytes:&outbuf[i] length:1]; 
       } 

       if(flbreak) break; 
      } 
     } 
    } 

    self = [self initWithData:mutableData]; 
    return self; 
} 

ofcourse ziehen Sie diese Datei in den certificateData , wenn Sie Ihre vorhandenen öffentlichen Schlüssel verwenden möchten, nur ziehen Sie ihn heraus und schreiben Sie es in einem X509-Zertifikat-Format openSSL

$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout 

Glück

Verwandte Themen