OSX 10.7以降の非対称暗号化/復号化をOpenSSLなしで実行する方法
-
13-12-2019 - |
質問
OpenSSLはOSX 10.7以降で推奨されていますので、OpenSSLから内部OSXキーチェーンと暗号機能に切り替えたいです。
しかし今、私は非対称の暗号化/復号化に座っています。
非対称(RSA)キーを使用して、ランダムに生成された対称キーの暗号化/復号化を行うことができます。OpenSSLでは非常に簡単です。
Apple Dev Docs 、彼らはCommonCryptoが非対称暗号化をサポートしていると言っていますが、ヘッダーをチェックしながら、私は対称的なもののサポートしか見えません。任意のヒント?
解決
暗号化メッセージ構文サービスを見て、それが必要なものをすることができるかどうかを確認してください。
また、あなたはオペンズのものを少し誤読しています。 OSに出荷するOpenSSLライブラリは非推奨です。それはあなたがOpenSSLを使うことができないという意味ではありません。 OpenSSLはオープンソースであり、ダウンロードしてアプリケーションで自由に使用するのを停止していません。
Appleの償却は、OpenSSLを使用する場合は、OpenSSLライブラリの コピーを含める必要があります。 がOpenSSLライブラリを維持する責任があるあなたがそうするたびに発生する破損を最新の状態に修正するため。 : - )
とそうでない場合、OS XにはiOS非対称暗号化と復号化関数(SeckeyEncryptとSecKeyDecrypt)が存在し、iOSヘッダーはOS Xで利用可能であることを示しています。 OS X SDK。私はバグを提出し、それはDUPとしてマークされました。
シミュレータを破ることなく、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;
}
.
復号化のためのコードを簡単に適応させることができるはずです。私は私の目的のためにそれを必要としなかったので、その機能を書きませんでした。