패스트터틀

아두이노와 암호화 본문

Cyber Security(undergraduate)/cryptography

아두이노와 암호화

SudekY 2019. 4. 17. 17:27

아두이노(Arduino) IOT ( Anywhere Anytime Anything) 

 

1. 마이크로컨트롤러

 

저전력,저성능,저비용, 전원만 인가되면 프로그래밍된 작업 수행하는것으로

 

아두이노와 같이 하드웨어 교육용부터 산업용 단순 제어 와 대부분의 가전제품이 사용됨 또한 별도의 OS없음

 

비트수가 높아질수록 빨라지지만 전력이 많이소모되지만 요새는 굉장히 가격이 싸졌고 최적화가 잘되어서

 

32비트도 많이 사용함

 

2. Arduino

 

오픈소스 하드웨어로서 스케치(sketch)라는 아두이노를 위한 작성한 프로그램으로 c,cpp 사용됨

 

arduino stduio - Arduino - MCU(MICRO CONTROLLER) - develop board

 

3. Arduino UNO

 

8-bit AVR microcontroller

(AVR = Atmel AVR = Atmel 제조회사의 중앙처리장치와 소용량 플래시메모리의 하나의 IC에 집적된것)

16Mhz(80년대 컴퓨터수준정도 하지만 크기가 엉청나게 소형화)

32KB flash memory

2KB SRAM( 중요 )

1KB EEPROM ( 하드디스크보다 전화기의 OS들어가는 영역? 정도로 알고있으면 됨 )

I/O : Digital : 14 pins , Analog : 6 pins

 

 

아두이노 소프트웨어 다운로드 : (링크)

https://www.arduino.cc/en/Main/Software

불러오는 중입니다...

 

 

0. 설정

 

필자는 Arduino Uno를 사용하므로 툴-보드-Uno 를 선택하겠다.

 

보드선택

 

 

 

왼쪽상단

왼쪽에 'V(체크)' 버튼은 코드를 컴파일

오른쪽 '->' 버튼은 코드를 

 

 

 

 

1. 속도 층정

 

첫번째로는 작동시간을 측정하기위한 함수이다. ( 참고로 : 시계적 기능으로는 사용이 불가능하다 )

void loop(){
    uint32_t elapsed= micros();
    delay(1000);
    elapse = micros() - elapse;
    
    Serial.print("Elapsed: ");
    Serial.print(elapsed);
    Serial.println("us");
}

아두이노에서는 Serial은 class는 컴퓨터와 통신이 가능하게 하는 중요한 부분이다.

Serial은 전세계적으로 사용되고 아두이노 자체적으로 Serial 모니터기능을 제공해주어서

프로그램이 정상작동하는지 모니터로 확인할수 있다.

 

 

 

2. 컴파일 옵션

 

1. Os (Arduino default)

  • 코드 크기 최적화
  • O2에서 사용하는 최적화 기법 중 코드 크기를 증가시키는 기법을 제외하고 최적화

2. O0 (gcc default)

  • ㅈㄷㅈㄷ
  • ㅈㄷ

3. ㅂㅈㄷ

  • ㅂㅈㄷ
  • ㅂㅈㄷ

4.

 

 

3. Hello World!

 

setup 은 초기설정이라고 보면되고

loop 는 해당 코드가 반복되는 부분이라고 생각하면 된다.

void setup() {
  Serial.begin(9600);
  Serial.print("Hello World");
}

void loop() {
  delay(1000);
}

Serial.begin(숫자) => 숫자는 시리얼모니터상 boardrate(보드레이트)와 동일하게 하면된다.

 

아주간단한 프로그램이다. 그냥 출력받고 입력받고 지나간시간 측정하는 코드이다. 

void setup() {
  Serial.begin(9600);
}

void loop() {
  int start = millis();
  Serial.print("hello ");
  delay(1000);
  int elapsed = millis() - start;
  Serial.println(elapsed);
  serialEvent();
}

void serialEvent(){
  while(Serial.available()){
    char in = (char) Serial.read();
    Serial.print(in);
  }
}

delay(숫자) => 숫자는 ms 로 1000 = 1초

serialEvent() => 입력받는함수, 모니터에서 입력을 받아서 출력함

millis() => 시간을 start에 저장하고 현재시간에서 빼면 지나간 시간이 elapsed

 

 

4. 시저암호 아두이노

 

이제는 간단한 시저암호의 암호화와 복호화를 해보자.

 

void encrypt(char* cipher, const char* plain,char key) { 
// c 개발자들은 아웃풋으로 하는애를 먼저쓰고 인풋을 나중에 씀 
//박사님이 그렇다고 하니 일단은 그런식으로 알고있자 
  for (int i = 0; i < strlen(plain); ++i) 
    cipher[i] = (((plain[i] - 'A') + key) % 26) + 'A'; 
} 

void decrypt(char* dec, const char* cipher,char key) { 
  for (int i = 0; i < strlen(cipher); ++i) 
    dec[i] = (((cipher[i] - 'A') - key) % 26) + 'A'; 
} 


void setup() {
  Serial.begin(9600);

  const char* plain = "CEASER"; //암호문  
  char cipher[30] = { 0 }; // 평문 //배열초기화할때는 함수를 사용해서는안됨 그렇기에 우선 큰값으로 넣음 
  char dec[30] = { 0 };  

  encrypt(cipher, plain, 4); 
  Serial.println(cipher); // 6글자인데 %s는 마지막이 0이어야지 끝낸다는특성으로 쓰레기값이 나옴 
  decrypt(dec, cipher, 4); 
  Serial.println(dec); 

  
}

void loop() {
}

void serialEvent(){
  while(Serial.available()){
    char in = (char) Serial.read();
    Serial.print(in);
  }
}

 

printf 같은 부분은 Serial.print 로 바꿨고 나머지는 거의 대부분 그대로이다.

 

아두이노에서 c++,c 를 지원해주기 때문에 코드를 옮기는데에는 많은 힘이 필요하지 않다.

 

나머지 다른 문법들은 어려운부분이 없기 때문에 아두이노에서 문법을 보고 살짝식 고치거나

 

코드를 조금 붙히거나 하면 쉽게 해결된다.

 

5. aes 암호화

 

아두이노에서 aes 알고리즘 코드를 삽입해보자

 

코드는 

 

https://github.com/ilwoong/crypto-primitives

 

ilwoong/crypto-primitives

Contribute to ilwoong/crypto-primitives development by creating an account on GitHub.

github.com

 

 

 

 

보통 암호화를 아두이노같은곳에서 사용하지않는데

 

개인정보가 대두되어있는 현재 암호화가 필요하다고 느껴서 많이들한다

 

하지만 암호화코드가 가벼운것은 아니기에 적절한 암호화코드를 삽입해야되는데

 

이럴때 LEA와 같은 가벼운 암호화를 쓸수도있고 아니면 더 하위 단계를 쓸수도 있고 대체적인 방법을 써야한다.

 

한정된 메모리에서 어떤 암호화 알고리즘을 사용하는것은 개발자가 잘 판단해야하는 부분이라고 생각한다.

 

 

LEA는 AES와 비교하여 속도차이는 별로안나는걸로 기억

 

이런식으로 하다가 끝난걸로 기억함

 

Comments