2013-03-21 102 views
5

如何使用iOS中的公鑰驗證數字簽名而不使用任何第三方代碼(例如)打開SSL?使用iOS中的公鑰驗證數字簽名

我需要使用公鑰驗證iOS應用程序中的數字簽名。有人可以幫助我如何在不使用第三方軟件的情況下實現這一目標。

我想下面的代碼,但問題是我沒有證書在我的應用程序,所以不能創建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] 
          ); 

我有以下幾點:

  • 公鑰(的NSString *)
  • 簽名(的NSString *)
  • 數據(的NSString *)

請幫助我在iOS中擁有的所有選項SDK如果我不想使用螞蟻第三方開源。

+0

如果我的答案幫助了您,請接受此問題將標記爲已解決並幫助其他用戶。謝謝 – mindbomb 2014-05-28 14:50:03

+0

你有沒有得到一些解決方案,或者你創建.pem? – DivineDesert 2015-10-26 06:40:19

回答

0

如果您的密鑰數據打包爲PKCS12數據,請使用SecPKCS12Import將其導入並使用公鑰。

+0

它的.pem格式;它只是一個NSString,我從服務器響應標題 – 2013-03-21 21:55:45

+0

看看http://stackoverflow.com/questions/14637328/import-pem-encoded-x-509-certificate-into-ios-keychain – quellish 2013-03-23 00:32:43

1

您可以在X509證書使用內置功能輕鬆的iOS包你的公鑰,使用OpenSSL:

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

的PEM格式base64編碼,可以將-outform切換到DER得到二進制文件。

- (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你拉這個文件到certificateData 如果你只想使用現有的公共密鑰: 您可以通過添加一個const的NSString程序並添加類別的NSData使用此功能導入PEM格式其拉出,然後使用OpenSSL

在X509證書格式寫
$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout 

好運