본문 바로가기

Mac&iOS

iOS에서 RSA암호화(5)

이전글 : 2017/09/19 - [Mac/iOS] - iOS에서 RSA암호화(4)


여기까지를 종합하면 iOS에서 RSA암호화를 할 수 있습니다.


앞에서 언급했다시피 Cheon Brave님 블로그를 참고해서 OpenSSL을 프로젝트에 추가하고 구현하였습니다.




 

//

//  MLRSAEncryptor.m

//  OpenSSLTest

//

//  Created by zamcom on 2017. 9. 19..

//  Copyright © 2017년 zamcom. All rights reserved.

//


#import "MLRSAEncryptor.h"

#include <openssl/bn.h>

#include <openssl/rsa.h>


@implementation MLRSAEncryptor


- (NSString*)encryption:(NSString*)planText

{

    char modulusArr[] = "79794aae2052a6842a8703445d7be83a6fac2c3a85ed1a9606f930f389c3a6440ad938578132cb407159595f3a6430ceba24f6b74960192d98fa584fc52e9c8fb5f1f609e1a29a872ee52740107fcfe23abcfdfb13ea4e75bbeb27efa24521429e073368c23005053931e8c161166efad15ac68ea0d5a513f063d54877e08941c29e333c4463690caf0b7457c987b649d088cc576c3725eb8ca55971557d7badc2a8cd1944dc5213f190d24a9635ebbe82e5552e27747a22447e6843844a62977ec8967c3745606656a3ff8465a5fc9e4fee82259c6ad7b09e24b62d2cbd1687b6cff69a5d31e13f800a59048bd6a5409907c75d1bf76ac2b1f3144bc5646ffd";

    char exponArr[] = "010001";

    

    BIGNUM* modul = BN_new();

    BIGNUM* expon = BN_new();

    BN_hex2bn(&modul, modulusArr);

    BN_hex2bn(&expon, exponArr);

    

    RSA* publicKey = RSA_new();

    publicKey->n = modul;

    publicKey->e = expon;


    int rsaSize = RSA_size(publicKey);

    unsigned char *crip[rsaSize];

    

    const char *plain = [planText UTF8String];

    

    int encryptedSize = RSA_public_encrypt((int)strlen(plain), (const unsigned char *)plain,  (unsigned char *)crip, publicKey, RSA_PKCS1_PADDING);

    if (encryptedSize <= 0) {

     

        if (publicKey) {

            publicKey->n = NULL;

            publicKey->e = NULL;

            RSA_free(publicKey);

        }

        

        if (modul) {

            BN_clear_free(modul);

            modul = NULL;

        }

        

        if (expon) {

            BN_clear_free(expon);

            expon = NULL;

        }

        

        return nil;

    }

    

    if (publicKey) {

        publicKey->n = NULL;

        publicKey->e = NULL;

        RSA_free(publicKey);

    }

    

    if (modul) {

        BN_clear_free(modul);

        modul = NULL;

    }

    

    if (expon) {

        BN_clear_free(expon);

        expon = NULL;

    }

    

    NSMutableString* result = [NSMutableString string];

    for (int i = 0; i < rsaSize; i++)

    {

        [result appendFormat:@"%02x", ((unsigned char*)crip)[i]];

    }

    return [NSString stringWithString:result];

}


@end




참고로 publicKey->n과 publicKey->e 를 NULL 값을 넣지않고 RSA_free(publicKey)를 해주면 crash가 발생하니 주의해야 합니다.




Analyze 결과 : 이상 없음

Profile : Memory Leak 체크 : 이상없음




이상으로 iOS에서 RSA 암호화 하는 방법에 대해서 알아보았습니다.


혹시나 도움이 되신 분들은 추천 부탁 드립니다.