Ios 使用RSA/SHA-1签名时崩溃

Ios 使用RSA/SHA-1签名时崩溃,ios,objective-c,openssl,keychain,Ios,Objective C,Openssl,Keychain,我使用下面的代码来生成带有私钥的字符串 我在iPhone钥匙链中有私钥。现在,在钥匙链中获取私钥并将其传递到PEM_read_RSAPrivateKey: - (NSString *)RSASHA1HashForString:(NSString *)source { KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initW

我使用下面的代码来生成带有私钥的字符串

我在iPhone钥匙链中有私钥。现在,在钥匙链中获取私钥并将其传递到PEM_read_RSAPrivateKey:

- (NSString *)RSASHA1HashForString:(NSString *)source {

    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                         initWithIdentifier:@"TestKeychain"
                                         accessGroup:@"keys"];       

    if (source == nil) return nil;

    OpenSSL_add_all_algorithms();

    NSString *signature = nil;

    // make a SHA-1 digest of the source string
    const char* sourceChars = [source UTF8String];

    unsigned char digest[SHA_DIGEST_LENGTH];
    SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest);        

    FILE *secretFile;
    RSA *rsa = NULL;
    @try {
        NSData *privateKeyFileData = [keychainItem objectForKey:(__bridge id)kSecAttrLabel];

        secretFile = (__bridge FILE *)(privateKeyFileData);

        PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
    }
    @catch (NSException *exception) {
        NSLog(@"Error %@",[exception description]);
    }

    if (rsa != NULL) {

        unsigned int sigLen = 0;
        unsigned char *sigBuff = malloc(RSA_size(rsa));

        int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest),
                              sigBuff, &sigLen, rsa);

        if (result != 0) {
            NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen];
            signature = [self base64forData:sigData];                
        }

        free(sigBuff);            
        RSA_free(rsa);
    }

    return signature;
}

但它在下面的代码中崩溃了

FILE *secretFile;
RSA *rsa = NULL;
@try {
    NSData *privateKeyFileData = [keychainItem objectForKey:(__bridge id)kSecAttrLabel];

    secretFile = (__bridge FILE *)(privateKeyFileData);

    PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
}
有没有办法解决这个问题,我没有PEM文件,我的钥匙链中有私钥

尝试:



这是不必要的
RSA\u-sign
将为您消化数据。

您正在“崩溃”!?这很有趣,但更有趣的是,确切的崩溃原因是什么!以及行号,例如…我在PEM_read_RSAPrivateKey(secretFile,&rsa,NULL,NULL)行上遇到崩溃;“有没有办法解决这个问题,我没有PEM文件,我的钥匙链中有私钥。”-这是另一个问题(这是一个非常好的问题,因为代码非常重要)。它包括(1)从钥匙链中取出物品;(2) 从字典中检索各种参数,然后放入
RSA
,然后(3)签名。我正在实施SSO概念,因此我的父应用程序创建公钥和私钥并存储在密钥链中,并且密钥链是共享的,因此每个SSO使用程序能够访问公钥和私钥,现在我有了字符串类型的令牌,所以令牌将对私钥进行签名,私钥位于keychain中,但上面的方法是必需的.PEM文件,但我没有,我应该做什么,请在这里为我提供guid。您好,这行仍然崩溃rsa=PEM_read_RSAPrivateKey(privateKeyFile,NULL,NULL,NULL);
PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
rsa = PEM_read_RSAPrivateKey(privateKeyFile, NULL, NULL, NULL);
// make a SHA-1 digest of the source string
const char* sourceChars = [source UTF8String];