由於openssl在osx 10.7+中已棄用,因此我想從openssl切換到內部的osx鑰匙串和加密函數。如何在沒有openssl的情況下使用OSX 10.7+進行非對稱加密/解密?
但現在我卡在非對稱加密/解密。
如何使用非對稱(RSA)密鑰對隨機生成的對稱密鑰進行加密/解密。用openssl很容易。
在apple dev docs中,他們說CommonCrypto支持非對稱加密,但在檢查標題時,我只能看到對稱對象的支持。
任何提示?
由於openssl在osx 10.7+中已棄用,因此我想從openssl切換到內部的osx鑰匙串和加密函數。如何在沒有openssl的情況下使用OSX 10.7+進行非對稱加密/解密?
但現在我卡在非對稱加密/解密。
如何使用非對稱(RSA)密鑰對隨機生成的對稱密鑰進行加密/解密。用openssl很容易。
在apple dev docs中,他們說CommonCrypto支持非對稱加密,但在檢查標題時,我只能看到對稱對象的支持。
任何提示?
看看加密消息語法服務,看看是否可以做你所需要的。
另外,你只是誤解了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;
}
你應該能夠很容易適應用於解密的代碼;我不需要它用於我的目的,所以我沒有寫這個函數。
相關問題:http://stackoverflow.com/questions/4140664/sample-code-for-public-key-encryption-decryption-on-mac – JWWalker 2012-08-18 00:49:04
另請參閱[加密和解密數據](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
[SecEncryptTransform](https://developer.apple.com/library/mac/documentation/System/Reference/SecEncryptTransform_header_reference/index.html)「將執行異步和同步加密」 – 2015-08-17 00:15:28