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을 선별적으로 사용할 수 있다. 다양한 확장성 :기본 원리가 매우 단순하고 파일 암호화 및 스트림 통신 등의 모든 방식으로의 응용 및 확장 개발이 용이하다.
SEA 구성도 Subkey Spare Module OTP 암호화 OTP 복호화 SHA1 가상 OTP 생성기 = mainkey + indexkey … TEA SEED RJINDAEL SHA256 Spare Module … SHA1 Protocol 정의 가상 OTP 생성기 OTP 생성을 위한 삽입 모듈은 용도에 적합하게 선별적으로 이용가능 XOR OTP 암호화 Cipher text Plain text OTP XOR연산기 :암호화 모듈과 복호화 모듈이 동일하다. 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]; ….나머지 생략…. Exor 모듈 기능요약 가상의 OTP생성용 해쉬생성기를 초기화 2. 입력받은 서브키(일회용 암호키)를 이용하여 특정 폭(이 경우 20바이트)의 해시코드를 생성합니다. 3. 암호화할 원문과 생성된 OTP를 XOR연산하여 암호문으로 변환 합니다. 참고: OTP(One Time Password 또는 Pads) SEA(Simple Encryption Algorithm)의 실제 암호화 변환을 위한 연산은 한 줄에 불가하다. (옆 코드에서 Blue 색상) 본 기법에서 실제로 핵심을 이루는 부분은 어떻게 main키 하나로 다수의 가상 일회용 키를 생성하게 할 것 인지와 관련한 protocol 정의이다.
Protocol 정의 Sub키 정의 (subkey = mainkey+time+random_seed ) 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 비교 (Remobot의경우) 34 => 정지 명령 []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모드 keydate: 45cbc402(1170981890) keyindex: c2be6058 Begin v-[0xbfffdddb] 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.......... 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.. 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로 암호화되었다. 매번 다른 값으로 암호화 되므로 분석할수 없다.
nesC components 구성도