본문 바로가기

Mac&iOS

iOS에서 RSA암호화(4)

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




1. ASN.1 



그다음로 설명할게 ASN.1 이다.



참고자료


A Layman's Guide to a Subset of ASN.1, BER, and DER




2017/09/19 - [Mac/iOS] - iOS에서 RSA암호화(1) 에서 설명을 위해 생성한 공개키는 ASN.1 포맷으로 되어 있다.


이중에 우리가 암호화에 필요한 N(Modulus)와 e(public exponent)를 구하려면 ASN.1 구조를 알아야 한다.


파서를 이용하거나, 서버에서 각각의 값을 가져올 수도 있겠지만, 여기서는 공개키에서 직접 Modulus와 public exponent 값을 추출해서 넣는 방법을 쓰도록 한다. 




2. 파싱하기 


자세한 구조를 살펴보려면 조금전의 참고자료를 보면 되지만, 시간 관계상 Online에서 이걸 파싱하는 사이트를 이용해서 분석하면 다음과 같다.



ASN.1 JavaScript decoder



대신 위의 사이트에서 파싱을 하려면 Base64로 인코딩된 문자열이 필요하다.


Objective-C에서 구하려면



    NSData* dataTemp = [self dataFromHexString:@"30820121300d06092a864886f70d01010105000382010e00308201090282010079794

aae2052a6842a8703445d7be83a6fac2c3a85ed1a9606f930f389c3a6440ad938578132cb407159595f3a6430ceba24f6b74960192d98

fa584fc52e9c8fb5f1f609e1a29a872ee52740107fcfe23abcfdfb13ea4e75bbeb27efa24521429e073368c23005053931e8c161166efad15a

c68ea0d5a513f063d54877e08941c29e333c4463690caf0b7457c987b649d088cc576c3725eb8ca55971557d7badc2a8cd1944dc5213f

190d24a9635ebbe82e5552e27747a22447e6843844a62977ec8967c3745606656a3ff8465a5fc9e4fee82259c6ad7b09e24b62d2cbd1

687b6cff69a5d31e13f800a59048bd6a5409907c75d1bf76ac2b1f3144bc5646ffd0203010001"];

    NSString* str =  [dataTemp base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

    NSLog(@"str = %@", str);



위와 같이 해서 값을 확인한다.


 str = MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB5eUquIFKmhCqHA0Rde+g6b6wsOoXtGpYG+TDzicOmRArZOFeBMstAcVlZ

XzpkMM66JPa3SWAZLZj6WE/FLpyPtfH2CeGimocu5SdAEH/P4jq8/fsT6k51u+sn76JFIUKeBzNowjAFBTkx6MFhFm760VrGjqDVpRPwY9VI

d+CJQcKeMzxEY2kMrwt0V8mHtknQiMxXbDcl64ylWXFVfXutwqjNGUTcUhPxkNJKljXrvoLlVS4ndHoiRH5oQ4RKYpd+yJZ8N0VgZlaj/4Rlp

fyeT+6CJZxq17CeJLYtLL0Wh7bP9ppdMeE/gApZBIvWpUCZB8ddG/dqwrHzFEvFZG/9AgMBAAE=



이 값을 디코더에 넣고 분석한다.


여기서 중요한 것은 이부분.




맨 마지막의 2047 bit에 해당하는 부분이 N (Modulus), 65537 값을 가지고 있는 부분이 e(public exponent)다.


보통 public exponent 값은 0x01, 0x00, 0x01 의 hex값을 갖는다.


Modulus에 해당하는 hex값이 어디서 부터 어디까진지 확인한다.




우측의 hex dump에서 검은색 부분만 참고하면 된다. Modulus는 0x79, 0x79 로 시작하는 부분 부터 0x6F, 0xFD까지다.

exponent는 0x01, 0x00, 0x01 부분이다.


Modulus = 79794aae2052a6842a8703445d7be83a6fac2c3a85ed1a9606f930f389c3a6440ad938578132cb407159595f3a6430ceba24f6b74960192d98fa584fc52e9c8fb5f1f609e1a29a872ee52740107fcfe23abcfdfb13ea4e75bbeb27efa24521429e073368c23005053931e8c161166efad15ac68ea0d5a513f063d54877e08941c29e333c4463690caf0b7457c987b649d088cc576c3725eb8ca55971557d7badc2a8cd1944dc5213f190d24a9635ebbe82e5552e27747a22447e6843844a62977ec8967c3745606656a3ff8465a5fc9e4fee82259c6ad7b09e24b62d2cbd1687b6cff69a5d31e13f800a59048bd6a5409907c75d1bf76ac2b1f3144bc5646ffd


exponent = 010001



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