본문 바로가기

개발자 레니는 지금 -/소프트웨어와 함께

[ Python ] 통신 파일, binary data 암호화 전송



Python

통신 파일, binary data 암호화 전송








 시작 전 테스트환경 살피기

   Time

     2017년 09월 20일 

   OS

     Virtual Box - Linux(Ubuntu 16.04 LTS)

   Language

     Python 2.7


file, binary data를 암호화 해서 전송하는 방법을 2가지로 나누어 봤습니다.


첫째, file의 내용, binary data를 암호화 해서 file로 전송하는 것.

둘째, file의 내용, binary data를 암호화 해서 message로 전송하는 것.



이를 위한 작업으로 먼저해야할 것은 앞서 Posting했기 때문에 해당 url로 대체합니다.


TCP/IP ( 1:1통신 상태 ) + AES128/HMAC을 이용한 file, binary data 암호화를 구현한 코드는 아래 GitHub에 들어가면 전체 코드를 다운받을 수 있다.


1. TCP/IP 통신 구축하기

2. AES128/HMAC 형식으로 암호화 하기




이때 주의 해야할 점이 있다.

1. 해당 코드 내에서는 key 값을 Server와 Client 모두에게 같은 값으로 변수 선언을 해 놓고 사용하지만,

실제로는 초기에 1번 Server에서 Client에게 key값을 부여하는 것이 올바른 방법이다.


2. 해당 코드 내에서는 file의 크기가 크지 않기 때문에 ( 즉, socket buffer size 를 넘지 않기 때문에 ) 문제가 없이 모든 data를 가져 올 수 있지만, 만약 file의 크기가 클 때를 생각한다면


첫째, file의 내용, binary data를 암호화 해서 file로 전송하는 코드는 수정할 필요가 없지만

둘째, file의 내용, binary data를 암호화 해서 message로 전송하는 코드는 초기에 파일의 size를 보내주는 작업이 필요하다.


암호화 되고 난 메시지를 받을 때 Client가 받아야하는 data size의 크기는


[ 평문의 16의 배수화 ( 평문의 size를 16의 배수로 맞춰주는 것을 뜻한다 ) + iv의 크기 ( 16 ) ] * 2 이다.


예를 들어 Server에서 file의 size를 측정했을 때 15가 나온다면 뒤에 문자 ' ' ( 공백 )을 1개 추가해서,

file의 size를 16으로 맞춰준다. 

그 후 iv의 암호화 되기전 size인 16을 더해주고, 더한 값 ( 16 + 16 ) 에 2를 곱해준다.

최종 적으로 Client에게 Server가 암호화 된 file, binary data message를 전송하기 전 "니가 받아야할 길이는 32야" 라고

먼저 알려주어야한다.


2를 곱하는 이유는 암호화가 되면서 길이가 2배로 들어나기 때문이다.

( 이유는 아마 binary hex형태로 바뀌어서 그런 것 같다는 느낌만 들 뿐 정확하게 설명하지 못하겠다. )






 

 GIT HUB 해당 url로 들어가시면 Git-Hub에 전체 code가 올려져 있습니다.


1. 첫번째 경우 - file의 내용, binary data를 암호화 해서 file로 전송

2. 두번째 경우 - file의내용, binary data를 암호화 해서 message로 전송