OpenSSL이없는 OSX 10.7+에서 비대칭 암호화 / 암호 해독을 수행하는 방법은 무엇입니까?
-
13-12-2019 - |
문제
OSX 10.7+에서 OpenSSL이 사용되지 않으므로 OpenSSL에서 내부 OSX 키 체인 및 Crypto 기능으로 전환하고 싶습니다.
그러나 이제는 비대칭 암호화 / 암호 해독에 갇혀 있습니다.
비대칭 (RSA) 키로 무작위로 생성 된 대칭 키의 암호화 / 복호화를 어떻게 수행 할 수 있습니까?OpenSSL을 사용하면 매우 쉽습니다.
Apple Dev Docs 그들은 CommonCrypto가 비대칭 암호화를 지원하지만 헤더를 확인하는 동안 나는 대칭 물건에 대한 지원만을 볼 수 있습니다.모든 힌트?
해결책
암호화 메시지 구문 서비스를 살펴보고 필요한 것을 수행 할 수 있는지 확인하십시오.
또한 OpenSSL 일을 조금 오르게합니다. OS와 함께 제공되는 OpenSSL 라이브러리는 더 이상 사용되지 않습니다. 이는 OpenSSL을 계속 사용할 수 없다는 의미는 아닙니다. OpenSSL은 오픈 소스이며 다운로드를 중지하고 응용 프로그램에서 자유롭게 사용하는 것을 멈추는 것이 없습니다.
Apple의 Deprecation은 OpenSSL을 사용하는 경우 이 OpenSSL 라이브러리를 위로 유지할 책임이 있도록 OpenSSL 라이브러리의 > 사본을 포함시켜야합니다. 지금까지 발생할 때마다 발생하는 파손을 해결하기위한 것입니다. : -)
그리고 그렇지 않은 경우, iOS 비대칭 암호화 및 암호 해독 기능 (seckeyencrypt 및 seckeydecrypt)은 OS X에 존재하며, iOS 헤더는 OS X에서 사용할 수 있음을 보여줍니다. OS X SDK. 나는 버그를 제출했고, 그것은 dup으로 표시되었다.
Apple은 시뮬레이터를 깨뜨리지 않고 미래에 이러한 기능을 제거 할 수 없을 것입니다. 그러나 앱 스토어에 제출하면 슬픔을 제공합니다. 여기에 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;
}
.
해독을 쉽게 해독하기위한 코드를 적용 할 수 있어야합니다. 나는 목적을 위해 그것을 필요로하지 않았기 때문에 그 기능을 쓸 수 없었습니다.