2

opensslはosx10.7+で非推奨になっているため、opensslから内部osxキーチェーンと暗号化機能に切り替えたいと思います。

しかし今、私は非対称暗号化/復号化に固執しています。

ランダムに生成された対称鍵を非対称(RSA)鍵で暗号化/復号化するにはどうすればよいですか?opensslを使用すると、非常に簡単です。

Apple dev docsで、彼らはCommonCryptoが非対称暗号化をサポートしていると言っていますが、ヘッダーをチェックしている間、私は対称的なもののサポートしか見ることができません。

ヒントはありますか?

4

1 に答える 1

3

暗号化メッセージ構文サービスを見て、それが必要なことを実行できるかどうかを確認してください。

また、OpenSSLのことを少し誤解しています。OSに同梱されているOpenSSLライブラリは非推奨になりました。これは、OpenSSLを継続して使用できないという意味ではありません。OpenSSLはオープンソースであり、ダウンロードしてアプリケーションで自由に使用することを妨げるものは何もありません。

Appleの非推奨は、OpenSSLを使用する場合、OpenSSLライブラリを最新の状態に保ち、そのたびに発生する破損を修正する責任があるように、OpenSSLライブラリの独自のコピーを含める必要があることを意味します。:-)

そうでない場合は、iOSの非対称暗号化および復号化機能(SecKeyEncryptおよびSecKeyDecrypt)がOS Xに存在し、iOSヘッダーはそれらがOSXで使用可能であることを示しています。OSXにない理由はわかりません。 SDK。バグを報告したところ、重複としてマークされていました。

将来、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;
}

復号化のためにコードをかなり簡単に適応させることができるはずです。私は自分の目的のためにそれを必要としなかったので、私はその関数を書きませんでした。

于 2012-08-17T23:16:38.230 に答える