簡體   English   中英

iPhone:如何將包含公鑰位的SecKeyRef或NSData導出為PEM格式?

[英]iPhone: How do you export a SecKeyRef or an NSData containing public key bits to the PEM format?

我使用SecKeyGeneratePair創建了一對密鑰。 我現在想將公鑰傳遞給服務器,但我不確定如何繼續。

我有一個函數getPublicKeyBits (取自Apple的CryptoExercise ),但我真的不知道如何處理原始NSData。 這是功能:

- (NSData *)getPublicKeyBits {
    OSStatus sanityCheck = noErr;
    NSData* publicKeyBits = nil;
    NSData* publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];
    CFDataRef cfresult = NULL;


    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef*)&cfresult); 


    if (sanityCheck != noErr)
    {
        publicKeyBits = nil;
    }
    else 
    {
        publicKeyBits = (__bridge_transfer NSData *)cfresult;
    }

    return publicKeyBits;
}

如何獲取此原始字節數據並將其轉換為PEM或加密庫可以理解的其他格式? 我應該base64編碼嗎? 還有其他我需要做的事情嗎?

如果它有幫助,我正在嘗試使用可用於Python的M2Crypto庫的M2Crypto

我想你會想看http://www.openssl.org/docs/crypto/pem.html#也許:

int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
                                    unsigned char *kstr, int klen,
                                    pem_password_cb *cb, void *u);

此頁面提供了一些很好的提示和示例代碼,用於將您擁有的數據打包成PEM格式,以便將其發送到服務器:

http://blog.wingsofhermes.org/?p=42

您不需要從源編譯並靜態鏈接的整個openssl庫來執行此操作。 我正在使用這種技術,將基本64鍵包裝在“----- BEGIN PUBLIC KEY -----”中,並且Rails應用程序可以使用標准的ruby openssl類來讀取和使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM