130 likes | 297 Views
Secure RemoBot Control. SEA 암호모듈을 이용한 보안형 원격 이동체 제어. 이동은 emapas@empas.com. 2007 Feb 23. Remobot 보안 통신 구현 개요. 유 / 무선통신 기술의 발전으로 수많은 정보 소통이 이뤄지고 있지만 많은 경우 보안에 대한 고려가 전혀 없거나 취약한 보안으로 구성된 경우가 많다 .
E N D
Secure RemoBot Control SEA 암호모듈을 이용한 보안형 원격 이동체 제어 이동은 emapas@empas.com 2007 Feb 23
Remobot 보안 통신 구현 개요 • 유/무선통신 기술의 발전으로 수많은 정보 소통이 이뤄지고 있지만 많은 경우 보안에 대한 고려가 전혀 없거나 취약한 보안으로 구성된 경우가 많다. • 유비쿼터스시대로의 진입에 있어 보안은 선택이 아닌 필수 요건이 되어야 한다. 점차 개인화 다중화 되는 정보 교류에 있어서 보안이 없다면 편리함 보다 그 위험성이 더욱 크다 할 수 있다. • 본 장에서는 데이터 보안 통신을 Remobot 원격제어에 응용한 사례에대해 소개하고자 한다. • SEA (Simple Encryption Algorithm)에 대한 간단한 소개와 TinyOS에서의 실제 구현모듈인 Exor모듈의 구성과 작동에 대해 소개하고자 한다.
센서노드와 보안 • 노드간의 전달 정보는 RF전송되므로 스케닝 후 해석 및 재 가공하여 발신 가능 • 권한이 없는 사람이 임의의 명령을 호출할 수 있다. (가령 출입구 open명령을 스캐닝 후 재발송하여 무단 침입 가능) • 보안기능이 필수적으로 요구됨.
Cryptography • 암호화 기능의 구현은 어렵다? :일반적으로 암호기법의 이해와 관련 API의 이용은 난해한 편이다. • 암호키의 길이나 메시지 크기의 제약이있다. • 세부적인 알고리즘 원리가 기밀사항인 경우가 많다(back door key 존재 가능성)
TinyOS 와 보안 • 보통 보안모듈은 많은 계산을 요구하게되는데 센서노드의 경우 매우 제한적인 자원만을 이용해야하는 제약을 갖고있다. • TinyOS에도 TinySec 등의 보안관련 모듈을 제공한다. • TinySec의 기본 암호모듈의 예 - SkipJack ; 80bit key/ 64bit data length 알고리즘은 미 정부의 기밀 사항.
SEA(Simple Encryption Algorithm) • 키 길이의 제한이 없다 :가변 키길이 및 가변 메시지 폭. 키길이를 가변적으로 조절할 수 있으므로 암호화 강도 및 계산비용을 필요에따라 조정할 수 있다. • 암호화 및 복호화 연산이 동일 • 하나의 메인키로부터 파생된 서브키를 이용하여 유사 OTP를 생성하여 암호화에 이용 (암호방식은 OTP와 동일하다.) • 알고리즘 선택형( 특정 알고리즘에 의존하지 않음) :유사 OTP생성을 위해 SHA1-160 같은 Secure Hash Algorithm이나 Cipher Algorithm을 선별적으로 사용할 수 있다. • 다양한 확장성 :기본 원리가 매우 단순하고 파일 암호화 및 스트림 통신 등의 모든 방식으로의 응용 및 확장 개발이 용이하다.
가상 OTP 생성기 Spare Module Protocol 정의 SHA1 RJINDAEL SEED TEA SHA256 … XOR XOR SEA 구성도 Subkey = mainkey + indexkey … OTP 생성을 위한 삽입 모듈은 용도에 적합하게 선별적으로 이용가능 OTP 암호화 Cipher text Plain text OTP XOR연산기 :암호화 모듈과 복호화 모듈이 동일하다. OTP 복호화 Plain text Cipher text
SEA 의 nesC 구현모듈을 위한 interface • /** • * Exor.nc ; 본 파일은 ExorM 모듈이 제공하는 인터페이스 정의입니다. • * 참고로, SEA의 nesC 구현 모듈의 이름은 ExorM입니다. • * • **/ • interface Exor • { • /** • * sha1 method ; OTP생성을위해 SHA1 Hashsum을 이용. • 다른 hashier나 cipher의 이용도 가능합니다. • */ • command result_t sha_hash(uint8_t *data, uint32_t *hash); • command result_t sha_init(uint32_t *hash); • // 이하 Exor Method • /** • * Encryption plaintext ( len <= 20 ) • */ • command result_t encrypt( uint8_t *src, uint8_t *key, uint8_t len); • command result_t exor( uint8_t *src, uint8_t *key, uint8_t len); //encrypt와 동일 • /** • * Decryption Ciphertext ( len <= 20 ) • */ • command result_t decrypt( uint8_t *src, uint8_t *key, uint8_t len); //encrypt와 동일 • command result_t dxor( uint8_t *src, uint8_t *key, uint8_t len); //encrypt와 동일 • /* Terminology • * • * 1)OTP (One Time Password / Pads) • * • * • **/ • }
ExorM.nc SEA의 nesC구현 모듈 예 • // ExorM.nc 모듈의 command 일부 • command result_t Exor.sha_init(uint32_t *hash) { • hash[A]=Ai; • hash[B]=Bi; • hash[C]=Ci; • hash[D]=Di; • hash[E]=Ei; • return SUCCESS; • } • command result_t Exor.encrypt( uint8_t *src, uint8_t *key, uint8_t len) • { • uint8_t i; • // 주어진 key로 OTP 생성 • call Exor.sha_init( hashval ); • call Exor.sha_hash( key , hashval ); • // len 만큼 src와 xor 연산한다. • for(i=0; i<len; i++) src[i] ^= exor_otp[i]; • return SUCCESS; • } • ….나머지 생략…. • Exor 모듈 기능요약 • 가상의 OTP생성용 해쉬생성기를 초기화 • 2. 입력받은 서브키(일회용 암호키)를 이용하여 특정 폭(이 경우 20바이트)의 해시코드를 생성합니다. • 3. 암호화할 원문과 생성된 OTP를 XOR연산하여 암호문으로 변환 합니다. • 참고: OTP(One Time Password 또는 Pads) SEA(Simple Encryption Algorithm)의 실제 암호화 변환을 위한 연산은 한 줄에 불가하다. (옆 코드에서 Blue 색상) 본 기법에서 실제로 핵심을 이루는 부분은 어떻게 main키 하나로 다수의 가상 일회용 키를 생성하게 할 것 인지와 관련한 protocol 정의이다.
Protocol 정의 • SEA의 암호화 기법은 XOR연산에 불가하고 구현자의 필요에 따라 가상의 OTP키 생성을 위한 sub키 정의와 변형여부 파악을 위한 헤더 , crc ,hashsum 체크 방법들을 어떻게 정의(Protocol)하는가에 그 핵심이 있다. • Sub키 정의(subkey = mainkey+time+random_seed ) • OTP폭 정의(20bytes, 5bytes, n bytes) • 암호문 구조체 정의 • 암호문 변형여부판별을위한 header/crc/hashsum 정의
SEA 지원 Msg 구조 정의의 예 • /** • * ;RemobotMsg.h • * • * ;Remobot 제어명령 구조체 등 정의 • * • **/ • enum { • AM_REMOBOTMSG = 0xE5, • CRYPT_EXOR = 0xE4, // 암호화 방식 MODE • HASH_SHA1 = 0xA0 // EXOR에서 사용되는 HASH type • }; • typedef struct RemobotMsg { • uint16_t action; // test 위해 암호화 되지 않은 data 값 기록. • // EXOR Msg 시작 • //msg header • uint8_t mode; // 0xE4 == CRYPT_EXOR ; encrypt type • uint8_t opt1; // 0xA0 == HASH_SHA1 ; hashcode type • uint8_t opt2; // ?? ; exor_header len; • uint8_t opt3; // ?? ; exor_data len; • uint16_t src_moteid; // message from • uint32_t keydate; // element of subkey • uint32_t keyindex; // element of subkey • // encrypted data ; 암호문은 기본형의 경우 20Bytes까지 가능. • uint8_t EXOR_header[10]; // 암호문 해독검증정보; code/CRC/hashsum etc. • uint8_t EXOR_data[10]; // 이곳이 data공간 • //EXOR Msg 끝 • }__attribute((packed)) RemobotMsg;
평문/암호문 Data 비교 • []plain AM모드 • receive '4' • sizeof time_t: 4 • keydate: 45cbc524(1170982180) keyindex: 2b9b0a60 • cmd: 4 • Begin v-[0xbfffebcb] • Address 0 1 2 3 4 5 6 7 8 9 a b c d e f ASCII Code • 0xbfffebc0 0A BB BB 24 C5 CB 45 60 0A 9B 2B 65 58 4F 52 2D ...$..E`..+eXOR- • 0xbfffebd0 45 58 4F 72 00 [34] 00 00 00 00 00 00 00 00 00 FF EXOr.4.......... • [STOS Msg] • 7e 41 00 24 00 00 00 00 00 15 00 e5 00 99 99 e4 a0 0a 0a bb bb 24 c5 cb 45 60 • 0a 9b 2b 65 58 4f 52 2d 45 58 4f 72 00 [34] 00 00 00 00 00 00 00 00 00 da 26 7e • []encrpyt AM모드 • receive '4' • sizeof time_t: 4 • keydate: 45cbc402(1170981890) keyindex: c2be6058 • cmd: 4 • Begin v-[0xbfffdddb] • Address 0 1 2 3 4 5 6 7 8 9 a b c d e f ASCII Code • 0xbfffddd0 0A BB BB 02 C4 CB 45 58 60 BE C2 65 58 4F 52 2D ......EX`..eXOR- • 0xbfffdde0 45 58 4F 72 00 [34] 00 00 00 00 00 00 00 00 00 FF EXOr.4.......... • Begin v-[0xbfffdddb] • Address 0 1 2 3 4 5 6 7 8 9 a b c d e f ASCII Code • 0xbfffddd0 0A BB BB 02 C4 CB 45 58 60 BE C2 FA 2F A4 21 41 ......EX`.../.!A • 0xbfffdde0 B2 68 3B EF 76 [0E] CD 68 DE 73 A2 FE D3 48 8F FF .h;.v..h.s...H.. • [STOS Msg] • 7e 41 00 24 00 00 00 00 00 15 00 e5 00 99 99 e4 a0 0a 0a bb bb 02 c4 cb 45 58 • 60 be c2 fa 2f a4 21 41 b2 68 3b ef 76 [0e] cd 68 de 73 a2 fe d3 48 8f d5 43 7e (Remobot의경우) 34 => 정지 명령 항상 같은위치에 같은정보가 있다. 쉽게 분석되고 공격받을 수 있음. 인증을 위한 메시지 헤더값 가령 “eXOR-EXOr” 복호화한 뒤 헤더값 일치 여부로 변형여부를 판별한다. 34 => 0E로 암호화되었다. 매번 다른 값으로 암호화 되므로 분석할수 없다.