发送RSA公钥给iphone并使用它进行加密

我有一个TCP套接字服务器,我想做以下w / o使用SSL:

>在服务器上,使RSA密钥对(我知道如何使用openssl的加密库)
>在服务器上,将公钥发送到iphone并保留私钥.
>在客户端(iphone)上,使用公钥加密消息,使用SecKeyEncrypt.
>在服务器上,解密消息.

该消息足够短,使PKCS1填充结果符合128字节.

我不知道怎么做2〜4.有谁知道?

最佳答案
这应该做你所要求的 – 它使用服务器的公钥加密数据.它不受MITM攻击,除非攻击者拥有您的私人密钥及其密码的副本(通过非SSL进行通信,但仍然是,但是使用服务器的合法公钥加密的数据将几乎无法解密) .

我从苹果公司的文档,本网站,苹果开发者论坛以及其他地方整理了这些内容.所以感谢大家,我已经编写了代码!这段代码假设了几件事情:

>您已经生成了RSA密钥对(我正在使用一个4096位的密钥,它似乎很快),并使用私有密钥创建一个名为“cert.cer”的DER编码证书,您将其放入您的应用程序的资源束(显然,您也可以从服务器下载证书,但是您再次可以对MITM进行攻击).默认情况下,OpenSSL生成一个PEM编码的证书,所以你必须用“openssl x509 -in cert.pem -inform PEM -out cert.cer -outform DER”进行转换. iOS将禁用PEM.我使用证书的原因是它更容易使用,并在iOS中支持.只使用公钥不是(尽管可以做到).
>您已将Security.framework添加到您的项目,并且#import< Security / Security.h&gt ;.
/ *
     返回加密文本的NSData,如果加密失败,则返回nil.
     将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];
}

转载注明原文:发送RSA公钥给iphone并使用它进行加密 - 代码日志