2012-04-18 33 views
7

我使用SecKeyGeneratePair創建了一對密鑰。我現在想將公鑰傳遞給服務器,但我不確定如何繼續。iPhone:如何將SecKeyRef或包含公鑰位的NSData導出爲PEM格式?

我有一個功能getPublicKeyBits(取自蘋果的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

+0

不,它不是BASE64。它是一些ASN.1結構,包含一個帶有兩個'INTEGER'元素的'SEQUENCE'。雖然第二個元素似乎總是「65537」,但其他元素似乎具有密鑰大小。但我仍然不知道如何獲得指數並從它們中取出來將其導出爲另一種格式。 – miho 2014-03-02 14:58:22

回答

2

我想你會想看看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); 
+1

這意味着在我的項目中包含OpenSSL。我一直在用內置的CommonCrypto庫來做所有事情。它在這些鏈接的文檔中說PEM基本上是base64編碼的關鍵,然後用標題行包裝它。我嘗試過,但是我無法使用'M2Crypto'。上面的'getPublicKeyBits'函數生成的字節是否正確的「格式」,以便我可以對它們進行base64編碼?我很抱歉,我對密碼學,這些標準和圖書館知之甚少。 – 2012-04-18 17:28:03

+0

它是DER版本密鑰的base64 ... http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf – 2012-04-18 17:33:38

+0

啊,所以它看起來像' getPublicKeyBits'返回根據[this]編碼的DER'位(http://stackoverflow.com/questions/3840005/how-to-find-out-the-modulus-and-exponent-of-rsa-public-key -on-iphone-目標c)。所以,如果我base64編碼它,幷包裝標題行它應該工作的字符串。我試過這個,但也許我用base64編碼的代碼是錯誤的。謝謝您的幫助!我將這個答案標記爲正確的,因爲它非常有幫助。 – 2012-04-19 20:49:46

1

這個頁面有包裝你有到PEM格式的數據,所以你可以將它發送到服務器的一些偉大的祕訣和示例代碼:

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

你不需要從源代碼編譯和靜態鏈接到做整個OpenSSL庫。我只使用這種技術,將基本的64位密鑰包裝在「----- BEGIN PUBLIC KEY -----」中,它可以被Rails應用程序使用標準的ruby openssl類讀取和使用。

相關問題