서론
이번 글이 채팅 프로그램 프로젝트 기능 정리의 마지막 글이 될 것같다. (이 후 추가 기능으로 있을 지 모르겠지만) 이번 글에서의 중점 포인트는 제목에 써놓았듯 AES암 복호화를 이용하여 호스트와 클라이언트간의 채팅 송 수신하는 방법이다. 나는 AES-256 암호화로 암 복호화 작업을 진행하였다.
우선 설명하기 앞서 AES의 개념에 대해 어느정도 짚고 넘어가야 하는데,
해당 내용은 이전 글을 한번 읽어보면 아래 소스를 이해하는데 크게 어려움이 없을 것이라 생각한다.
사용한 AES 256의 KEY와 IV
KEY : "1234567890123456" -> 이후 byte[]로 Convert 진행
IV : new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
[송 수신 진행 과정]
서버 연결 (클라이언트)
1. 클라이언트에서의 서버 연결 [클라이언트]
위의 내용은 서버 연결을 한 후 Json 형식으로 서버에게 사용자의 id를 담고 서버에게 요청하는 부분이다. 해당 내용이 무슨 말인지 모르겠다면 이전 게시글인 #02에서의 필자가 정리한 type의 종류와 value의 의미를 확인하면 될 것 같다.
다시 본론으로 돌아와 내용을 살펴보면 json형식으로 가공한 녀석을
String으로 직렬화를 하여 make_data에 담은 다음
send_text에서 암호화 작업을 한다.
암호화를 했을 경우 어떻게 들어오는지 아래에서 확인하자.
2. 클라에언트에서의 서버 연결 (AES 암호화) [클라이언트]
위의 내용은 다른 클래스에서 구현해 놓은 AESEncrypt256 함수를 이용하여 암호화 작업을 한 결과를 보여주는 부분이다.
{"type":"init","text":"jeongkyun"}를 암호화했을 경우 위에 보이는 것과 같이
base64형식으로 암호화 되어 출력되는 것을 확인할 수 있다.
3. AES 암호화 함수 [클라이언트와 서버 동일]
이제 위의 부분이 AES 암호화를 하는 부분이다.
보내고 싶은 내용(String)을 RijndaelManaged 클래스의 내장 함수인 CreateEncryptor를 이용하여 aes암호화 변수를 만든 후 CryptoSteram을 이용하여 byte[] 배열로 파싱해주었다.
byte[]로 파싱을 하는 과정에서 나는 한글로 주고받는 경우가 많기에 클라이언트, 서버 모두 UTF8로 인코딩을 해주었고 마지막으로 ToBase64String 함수를 이용하여 byte를 Base64로 파싱해주는 과정을 친 후 암호화 된 String을 return해주는 방식으로 구현했다.
서버 연결 수신부 (서버)
4. 서버 연결 요청 수신부 [서버]
이제 위의 내용부터는 서버의 내용이며 클라이언트에서 암호화하여 보낸 byte[]를 string으로 파싱한 결과이다. 당연한 말이겠지만 클라이언트에서 암호환 내용 그대로 서버에서 수신하였다. 이제 해당 값을 AES복호화 작업을 거쳐 보자.
5. 서버 연결 요청 수신부 (AES 복호화) [서버]
crypto 클래스에 구현해 놓은 AESDecrypt256()를 이용하여 암호호된 내용을 복호화 한 부분이다. 클라이언트에서 암호화 작업 전 내용을 서버에서 복호화하여 클라이언트 송신 내용을 서버에서 잘 수신한 것을 확인할 수 있다.
6. AES 복호화 [서버와 클라이언트 동일]
위의 내용이 이제 AES로 암호화 되어있는 부분을 복호화 하는 부분이다. 다시 한번 말하지만 대칭키인 AES 특성 상 암호화 KEY값은 개발자들 간의 공유가 서로 이뤄져야되며 해당 Key를 잘 관리하여야만 한다. 해당 Key를 외부에서 알게되면 보안성에서는 끝이라고 보면된다.
무튼 계속해서, 해당 함수를 간략히 설명하면 암호화와 동일하게 RijndaelManaged 클래스의 내장 함수인 CreateDecryptor()를 이용하여 ase복호화 변수를 생성한 후 CryptoStream을 이용하여 String -> byte[]로 변환한다. 여기서는 암호화를 했던 부분과 달리 FromBase64String을 이용하여 base64로 되어있던 부분을 원래의 byte배열로 디코딩하는 과정을 거친다.
그리고 마지막으로 utf8로 인코딩을 한 후 String형으로 변환하여 return값으로 해당 값을 얻어올 수 있게끔 구현했다.
마치며..
이전 글에서 정리했듯 요즘 사회에서 개인 정보는 엄청 민감한 문제이다. 이러한 문제를 해결하기 위해 시스템 개발자들은 민감 정보의 데이터들을 암호화시키는 기능들을 제공한다.
현재 나는 여러 암호화에 관련하여 업무를 경험해보진 못했지만 이번에 aes, sha암호화 과정을 거치는 프로그램을 접할 기회가 생겨 이번에 채팅 프로그램을 만들며 앞으로 연동에 필요한 필수(?) 기능들을 접목시켜 만들어봤다.
해당 프로그램은 앞으로 외부 프로그램의 연동을 구현하는데 있어 참고하면서 하기에 좋을 것 같다. 다음 글은 이제 프로그램 작동 영상으로 마무리하고 해당 프로젝트를 끝내보도록 하겠다.
'Project History > 다중 기능을 포함한 채팅 프로그램' 카테고리의 다른 글
[C# 채팅 프로그램 #05] 채팅 프로그램 프로젝트 최종 시연 영상 및 설명 (0) | 2022.02.24 |
---|---|
[C# 채팅 프로그램 #03] TCP/IP통신에서 특정 클라이언트에게만 메세지 보내기 (0) | 2022.02.10 |
[C# 채팅 프로그램 #02] IOCP - EAP 패턴을 이용한 비동기 TCP/IP 클라이언트 구현 (SocketAsyncEventArgs) (0) | 2022.02.10 |
[C# 채팅 프로그램 #01] IOCP - EAP 패턴을 이용한 비동기 TCP/IP 서버 구현 (SocketAsyncEventArgs) (0) | 2022.02.10 |
[C# 채팅 프로그램 #00] 작업 환경 / 기능 구현 리스트 / UI 제작 (0) | 2022.02.10 |
댓글