2012-07-29 25 views
2

由於openssl在osx 10.7+中已棄用,因此我想從openssl切換到內部的osx鑰匙串和加密函數。如何在沒有openssl的情況下使用OSX 10.7+進行非對稱加密/解密?

但現在我卡在非對稱加密/解密。

如何使用非對稱(RSA)密鑰對隨機生成的對稱密鑰進行加密/解密。用openssl很容易。

apple dev docs中,他們說CommonCrypto支持非對稱加密,但在檢查標題時,我只能看到對稱對象的支持。

任何提示?

+0

相關問題:http://stackoverflow.com/questions/4140664/sample-code-for-public-key-encryption-decryption-on-mac – JWWalker 2012-08-18 00:49:04

+0

另請參閱[加密和解密數據](https://開發人員.pple.com/library/mac/documentation/Security/Conceptual/SecTransformPG/EncryptionandDecryption/EncryptionandDecryption.html)[Security Transforms Programming Guide](https://developer.apple.com/library/mac/documentation/Security/)概念/ SecTransformPG /簡介/ Introduction.html)。 – jww 2015-04-16 18:41:30

+0

[SecEncryptTransform](https://developer.apple.com/library/mac/documentation/System/Reference/SecEncryptTransform_header_reference/index.html)「將執行異步和同步加密」 – 2015-08-17 00:15:28

回答

3

看看加密消息語法服務,看看是否可以做你所需要的。

另外,你只是誤解了OpenSSL的一些東西。 OS附帶的OpenSSL庫已棄用。這並不意味着你不能繼續使用OpenSSL。 OpenSSL是開源的,沒有任何東西阻止你下載它並在應用程序中自由使用它。

蘋果棄用只是意味着,如果你使用OpenSSL,你需要包括OpenSSL庫的你自己副本,以便有責任保持你的OpenSSL庫先進的日期和固定破損說只要你這樣做,就會發生。 :-)

如果不是,OS X中存在iOS非對稱加密和解密函數(SecKeyEncrypt和SecKeyDecrypt),iOS頭甚至表明它們在OS X中可用。我不確定他們爲什麼會這樣不在OS X SDK中。我提交了一個bug,它被標記爲dup。

蘋果可能不會在未打破模擬器的情況下刪除這些功能,但如果您提交給應用商店並且他們給您帶來使用它們的麻煩,這裏是一個大致兼容的SecKeyEncrypt替代品使用安全變換API內置:

// Workaround for SecKeyEncrypt not really being public API in OS X 
OSStatus OSXSecKeyEncrypt (SecKeyRef key, SecPadding padding, const uint8_t *plainText, size_t plainTextLen, uint8_t *cipherText, size_t *cipherTextLen) 
{ 
    CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(
                    kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, 
                    &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeAES); 
    CFErrorRef error = NULL; 
    SecTransformRef encrypt = SecEncryptTransformCreate(key, &error); 

    if (error) { 
     AFNSLog(@"Encryption failed: %@\n", (__bridge NSError *)error); 
     return (OSStatus)[(__bridge NSError *)error code]; 
    } 

    SecTransformSetAttribute(
          encrypt, 
          kSecPaddingKey, 
          NULL, // kSecPaddingPKCS1Key (rdar://13661366 : NULL means kSecPaddingPKCS1Key and 
                      // kSecPaddingPKCS1Key fails horribly) 
          &error); 

    CFDataRef sourceData = CFDataCreate(kCFAllocatorDefault, plainText, plainTextLen); 
    SecTransformSetAttribute(encrypt, kSecTransformInputAttributeName, 
          sourceData, &error); 

    CFDataRef encryptedData = SecTransformExecute(encrypt, &error); 
    if (error) { 
     AFNSLog(@"Encryption failed: %@\n", (__bridge NSError *)error); 
     return (OSStatus)[(__bridge NSError *)error code]; 
    } 

    if ((unsigned long)CFDataGetLength(encryptedData) > *cipherTextLen) { 
     return errSecBufferTooSmall; 
    } 
    *cipherTextLen = CFDataGetLength(encryptedData); 
    CFDataGetBytes(encryptedData, CFRangeMake(0, *cipherTextLen), cipherText); 

    return noErr; 
} 

你應該能夠很容易適應用於解密的代碼;我不需要它用於我的目的,所以我沒有寫這個函數。

相關問題