본문 바로가기

Mac&iOS

iOS에서 RSA암호화(1)

1. 개요


현재 환경


서버 - Java

모바일 Android - Java

모바일 iOS - Objective-C


위의 환경에서 모바일에서 생성한 데이터를 서버로 암호화 해서 전달해야 했다.


암호화 방법은 RSA를 사용하기로 했고 공개키와 개인키는 서버에서 만든걸 사용하기로 했다.


서버에서 모바일로 공개키를 받아와서 처리할 수도 있지만, 회의결과 처음부터 공개키 정보를 가지고 있기로 했다.



사용할 공개키는 다음과 같다.(설명을 위해  http://travistidwell.com/jsencrypt/demo/ 에서 공개키를 하나 생성 후 Hex String으로 변환)



30820121300d06092a864886f70d01010105000382010e003082010902820100

79794aae2052a6842a8703445d7be83a6fac2c3a85ed1a9606f930f389c3a644

0ad938578132cb407159595f3a6430ceba24f6b74960192d98fa584fc52e9c8f

b5f1f609e1a29a872ee52740107fcfe23abcfdfb13ea4e75bbeb27efa2452142

9e073368c23005053931e8c161166efad15ac68ea0d5a513f063d54877e08941

c29e333c4463690caf0b7457c987b649d088cc576c3725eb8ca55971557d7bad

c2a8cd1944dc5213f190d24a9635ebbe82e5552e27747a22447e6843844a6297

7ec8967c3745606656a3ff8465a5fc9e4fee82259c6ad7b09e24b62d2cbd1687

b6cff69a5d31e13f800a59048bd6a5409907c75d1bf76ac2b1f3144bc5646ffd

0203010001 




2. 안드로이드


안드로이드의 경우 간단하게 구현이 된다.


public static String encrypt(String plainData, PublicKey publicKey) throws Exception {

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");

byte[] input = plainData.getBytes();

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

byte[] cipherText = cipher.doFinal(input);

return byteArrayToHex(cipherText);

}




3. iOS


다른 암호화 방식은 크게 문제가 없었기 때문에 RSA도 큰 문제가 없을 걸로 생각했었다. 하지만...


구글링해본 결과 OSStatus SecKeyEncrypt(SecKeyRef key, SecPadding padding, const uint8_t *plainText, size_t plainTextLen, uint8_t *cipherText, size_t *cipherTextLen) 를 이용하면 될 것 같았지만..


생각처럼 잘 되지 않았다.


한 3일 정도 삽질한 결과 다른 방법을 찾기로 마음 먹었다.




다음글 : 2017/09/19 - [Mac/iOS] - iOS에서 RSA암호화(2)