OpenSSL이없는 OSX 10.7+에서 비대칭 암호화 / 암호 해독을 수행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/11712440

문제

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;
}
.

해독을 쉽게 해독하기위한 코드를 적용 할 수 있어야합니다. 나는 목적을 위해 그것을 필요로하지 않았기 때문에 그 기능을 쓸 수 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top