C

    Crypto Project : Epilogue

    시작하며 드디어 길고 긴 I_CRYPTO 프로젝트에 대한 블로그 작성이 끝이 났다. 이 프로젝트는 나에게 꽤나 많은 의미가 있는데, 먼저 남들에게 보여줄만한 그럴싸한 프로젝트를 해냈다는 것이다. 사실 C언어, C++, Python을 학교에서 나름 잘 다루는 쪽에 속했으나, 항상 학교 공부만 했던 탓에 프로젝트 경험 같은 것들이 부족했다. 이제 대학원 또는 취직을 준비해야 하는 4학년이 된 시점에 바보같이 너무 학점 따는 것만 중요하게 생각했던 것 같다. 친구들이야 내가 코딩을 어느정도 하는지 잘 알겠지만 이제 취직 또는 대학원을 준비하는 시점에서 너무 안일하게 공부를 해왔다는 것을 이제서야 깨달았다. 포트폴리오가 없다는 것은 큰 불안감으로 다가왔고 코딩만 할 줄 알지 프로젝트 경험이 없는 나로써는 보안 ..

    Crypto Project : 3. OTP 프로그램

    Crypto Project : 3. OTP 프로그램

    시작하며 드디어 I_CRYPTO 프로젝트의 마지막 OTP 프로그램이다. 사실 이 otp도 여러 글로 나눠서 하려다 중요한건 함수 몇개 밖에 안되기 때문에 하나의 글로 끝내려고 한다. OTP는 One Time Password의 약자로 otp기기를 본 사람은 알겠지만 기계를 누르면 6자리 숫자가 30초 정도 단위로 기계에 출력되며, 해당 번호를 은행 사이트(보통 2차 인증 느낌으로)에 입력하면 인증이 완료되는 식이다. 그 조그만 기기가 당연히 인터넷에 연결되어 있을리가 없는데 실시간으로 변하는 번호가 어떻게 은행에서 인증을 할 수 있는 것일까? 답은 간단하다. 은행과 otp 기기 안에는 사전에 공유한 키가 있기 때문이다. 사전에 공유되어 있어 같은 시간대에 시간값을 토대로 랜덤한 번호를 생성한다면, 같은 시..

    Crypto Project : 2-3. TLS방식을 모방한 소켓프로그램

    Crypto Project : 2-3. TLS방식을 모방한 소켓프로그램

    시작하며 지금까지는 이 소켓 프로그램에서 멀티쓰레드, select 함수 등, 실제 소켓 프로그래밍에 대한 지식들에 대해 설명하였고, 이번에는 어떻게 암호화된 통신을 구현하였는지에 대해 다루겠다. 보안은 언제나 중요한 요소로써, 데이터를 주고 받을 때, 암호화하지 않고 보낸다면 네트워크 패킷에 어떤 데이터를 보내는지 그대로 노출돼 기밀성을 보장할 수 없다. 즉 기밀성이 요구되는 데이터라면 반드시 암호화해서 전송하고, 복호화해서 읽어야할 것이다. 이 소켓은 오픈채팅 형식의 채팅 프로그램으로써, 각 클라이언트들은 메시지를 암호화하여 주고받으므로 외부에서는 메시지를 읽을 수 없다. 어떻게 구현하였는지 살펴보자. 1. TLS와 키교환에 대한 이야기 TLS 는 현대 암호화에 엄청난 정수가 담겨있다고 생각한다. 사실..

    Crypto Project : 2-2. 소켓에서 select() 함수를 이용한 recv_all() 함수

    Crypto Project : 2-2. 소켓에서 select() 함수를 이용한 recv_all() 함수

    시작하며 저번 시간에 멀티쓰레드 기반의 소켓 프로그램의 구현 일부분을 살펴보았다. 데이터를 전송할 때 중요한 점은 데이터의 크기를 먼저 보내야 한다는 것이다. 네트워크의 지연, 혼잡 등 여러가지 이유로 만약 송신자가 16바이트의 데이터를 보내도 수신자에게 11바이트, 3바이트, 2바이트 이렇게 끊어져서 데이터가 올 수도 있다. 이런 상황이 벌어졌을 때, 데이터의 크기를 수신자가 알지 못한다면 수신자는 처음 온 11바이트가 전송받은 데이터의 전부인 줄 알고 처리할 것이다. 이는 여러 문제점을 야기할 수 있는데, 이 프로그램에서 가장 큰 문제는 "복호화"이다. 이 프로그램은 16바이트의 배수로 암호화를 진행한다. 부족한 부분은 패딩을 채운다. 만약 상대가 11바이트만 먼저 받았다면, 복호화를 애초에 진행할 ..

    Crypto Project : 2-1. 멀티쓰레드 기반 1대n 소켓 프로그램

    Crypto Project : 2-1. 멀티쓰레드 기반 1대n 소켓 프로그램

    시작하며 지난번까지 직접 만든 크립토 라이브러리에 대한 설명을 작성하였고, 이번에는 이 라이브러리를 이용하여 안전하게 키를 교환하여 통신을 하는 프로그램에 대해 설명하겠다. 암호화와 보안과 관련된 설명은 이번 글에서는 다루지 않고, 이번 글에서는 멀티쓰레드 기반 소켓 프로그램을 어떻게 구현하였는지 먼저 살펴보겠다. 이 소켓프로그램은 다른 통신이 그렇듯, 보낼 메시지의 크기를 먼저보내고, 그 크기에 해당하는 데이터를 보낸다. 크기를 먼저 보내 상대방이 데이터를 다 받았는지 안 받았는지 검증할 수 있다. 또 글을 읽기전에 중요한 점은, 이 프로그램은 하나의 서버에 다수의 클라이언트가 접속하여 서로 오픈채팅방처럼 채팅을 하는 프로그램이라는 것을 알아두자. 1. Server 먼저 소켓을 생성, 초기화 이후 bi..

    Crypto Project : 1-6. crypto library makefile과 테스트

    Crypto Project : 1-6. crypto library makefile과 테스트

    시작하며 원래 이전 글에서 라이브러리의 구현에 대한 모든 설명이 끝났기 때문에, 이를 활용한 소켓 프로그램을 바로 작성하려고 했었다. 그런데 그전에 애초에 샘플코드까지 제작했는데 이를 이용해서 어떤 식으로 암호화가 진행되는지 결과라도 보여주는 것이 좋을 것 같다 간단하게 글을 쓰려고 한다. 또 makefile을 어떻게 활용하고 어떻게 쓰는지도 보여주는게 좋을 것 같아 간단하게 설명을 적어보려 한다. 1. libICrypto.so 위 캡쳐는 i_crypto_library/src 에 들어있는 makefile이다. 이 파일은 같은 디렉토리에 위치하는 i_crypto.c로 libICrypto.so 공유라이브러리를 만든다. 이 때, include에 있는 i_crypto.h 헤더파일을 연결하여 오브젝트 파일을 생성..