2013-03-21 104 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 

好运