如何在没有openssl的情况下使用OSX 10.7+进行不对称加密/解密?
-
13-12-2019 - |
题
由于OpenSSL在OSX 10.7+中弃用,我想从OpenSSL切换到内部OSX钥匙链和Crypto功能。
但现在我陷入了不对称的加密/解密。
如何使用非对称(RSA)键进行加密/解密随机生成的对称密钥。openssl它很容易。
在 Apple dev文档,他们说commoncrepto支持不对称加密,但在检查标题时,我只能看到对对称的东西的支持。
任何提示?
解决方案
看看加密消息语法服务,看看是否可以执行所需的。
此外,您就误读了OpenSSL的东西。不推荐使用操作系统的OpenSSL库。这并不意味着您无法继续使用OpenSSL。 openssl是开源的,并且没有什么可以阻止您从下载它并在您的应用程序中自由使用它。
Apple的弃用只意味着如果您使用openssl,则需要包含openssl库的自己副本,以便您负责保持您的openssl库 - 迄今为止,用于修复随后发生的任何破损。 : - )
如果不是,则在OS X中存在IOS非对称加密和解密功能(SeckeyEncrypt和SeckeyDecrypt),并且iOS头甚至会显示它们在OS X中可用。我不确定为什么不在OS X SDK。我提出了一个错误,它被标记为杜普。
Apple可能无法在将来删除这些功能,而不会破坏模拟器,但如果您正在向App Store提交,并且他们会给您悲伤的话,这是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;
}
.
您应该能够相当容易地调整解密的代码;我的目的我不需要它,所以我没有写这个功能。
不隶属于 StackOverflow