Это должно делать то, что вы просите - оно шифрует данные с помощью открытого ключа сервера. Он не подлежит атакам MITM, если у злоумышленника нет копии вашего закрытого ключа и его пароля (однако, по-прежнему осуществляется связь через не-SSL, но данные, которые вы шифруете с помощью открытого открытого ключа сервера, почти невозможно расшифровать) ,
Я собрал это вместе из документов Apple, этого сайта, форумов разработчиков Apple и, возможно, в другом месте. Так спасибо всем, что я скрепил код от! Этот код предполагает несколько вещей:
Мы уже сформировали свои пары ключей RSA (я использую 4096-битный ключ и, кажется, достаточно быстрый) и, используя секретный ключ, созданный DER-кодированный сертификат под названием «cert.cer», который вы вложили в свой ресурс вашего приложения (очевидно, вы также можете загрузить сертификат со своего сервера, но затем снова открыты атаки MITM). По умолчанию OpenSSL генерирует сертификат, закодированный PEM, поэтому вы должны преобразовать его с помощью «openssl x509 -in cert.pem -inform PEM -out cert.cer -outform DER». iOS будет зависеть от PEM. Причина, по которой я использую сертификат, на самом деле проще работать, и поддерживается в iOS. Использование только открытого ключа не является (хотя это можно сделать).
Вы добавили Security.framework в свой проект, и вы #import <Security/Security.h>.
/* Возвращает NSData зашифрованного текста, или ноль, если шифрование не увенчалась успехом.
принимает сертификат X.509 как NSData (от dataWithContentsOfFile :, например) */
+(NSData *)encryptString:(NSString *)plainText withX509Certificate:(NSData *)certificate {
SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificate);
SecPolicyRef policy = SecPolicyCreateBasicX509();
SecTrustRef trust;
OSStatus status = SecTrustCreateWithCertificates(cert, policy, &trust);
SecTrustResultType trustResult;
if (status == noErr) {
status = SecTrustEvaluate(trust, &trustResult);
}
SecKeyRef publicKey = SecTrustCopyPublicKey(trust);
const char *plain_text = [plainText UTF8String];
size_t blockSize = SecKeyGetBlockSize(publicKey);
NSMutableData *collectedCipherData = [NSMutableData data];
BOOL success = YES;
size_t cipherBufferSize = blockSize;
uint8_t *cipherBuffer = malloc(blockSize);
int i;
for (i = 0; i < strlen(plain_text); i += blockSize-11) {
int j;
for (j = 0; j < blockSize-11 && plain_text[i+j] != '\0'; ++j) {
cipherBuffer[j] = plain_text[i+j];
}
int result;
if ((result = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, cipherBuffer, j, cipherBuffer, &cipherBufferSize)) == errSecSuccess) {
[collectedCipherData appendBytes:cipherBuffer length:cipherBufferSize];
} else {
success = NO;
break;
}
}
/* Free the Security Framework Five! */
CFRelease(cert);
CFRelease(policy);
CFRelease(trust);
CFRelease(publicKey);
free(cipherBuffer);
if (!success) {
return nil;
}
return [NSData dataWithData:collectedCipherData];
}
Не вопрос, насколько я могу видеть. –
Извините, Грег. Я только что добавил вопрос. –
Это не будет безопасно без SSL; он будет подвергнут [человеку в средней атаке] (http://en.wikipedia.org/wiki/Man_in_the_middle_attack). – cobbal