/Enigma

Primary LanguagePython


데모 영상

default.mp4

소프트웨어 설계

설계도

사용되는 메시지

  • <모든 메시지는 문자열 형태이며, 복수의 정보가 필요할때는 ‘/’로 구분한다.>

  • 모드 선택 메시지

    • 클라이언트 -> 서버: (0,1,2) 중 하나를 전송
    • 서버에서는 메시지에 따라서 쓰레드 실행
  • 업로드(1번)

    • 클라이언트 -> 서버: 암호화를 원하는 문장 전송(대문자 알파벳 한정)
    • 서버 -> 클라이언트: 암호화 완료 후 결과물을 “암호/키” 형식으로 전송
  • 다운로드(2번)

    • 서버 -> 클라이언트: DB에 파일이 있는 날짜들을 조회하여 “날짜/날짜/.../날짜“형식으로 전송
    • 클라이언트 -> 서버: 다운로드를 원하는 날짜를 ”날짜“형식으로 전송
    • 서버 -> 클라이언트: 해당 날짜 파일의 암호의 개수를 ”개수“형식으로 전송
    • 클라이언트 -> 서버: 원하는 암호의 번호를 ”번호“형식으로 전송
    • 서버 -> 클라이언트: 해당 날짜 파일의 번호를 ”암호/키“형식으로 전송
  • 종료(0번) - 추가 메시지 없음

구현 방법

  • TCP 서버로 구현 (포드 9150, HOST 임의 지정)
  • 소켓
    • 파이썬의 select 모듈을 사용 (블록킹되어 있다가 이벤트 발생 시 작동)
    • well-known address가 바인딩된 소켓, 클라이언트와 연결된 소켓을 select에 등록
    • 소켓에서 이벤트 발생 시 각 소켓에 맞는 기능 활성화
  • 기능
    • 업로드, 다운로드 모드 – 해당 모드 쓰레드를 실행
    • 종료 모드 – select에서 해당 소켓 제거 후 클라이언트 소켓 닫기
    • 만약 서버에 연결된 모든 소켓이 제거될 경우, 서버 소켓도 닫힘

소스코드 설명

서버

  • upload(클라이언트 소켓, 유저 id)
    • 입력받은 문장을 암호화시켜 업로드
  • download(클라이언트 소켓, 유저 id)
    • 원하는 파일의 원하는 암호를 다운로드
  • run(클라이언트 소켓)
    • 클라이언트로부터 모드를 받고, 해당 쓰레드 실행
  • serv(서버 소켓)
    • 접속 요청을 수락하고, select에 등록
  • main()
    • 서버 소켓을 생성하고, select로 이벤트 신호 대기

클라이언트

  • Upload()
    • 평문을 입력받아 서버에 전송 후, 암호를 받음
  • Download(파일 제목 데이터)
    • 원하는 날짜와 번호를 전송 후, 해당 암호를 받음
  • main()
    • 소켓으로 서버에 접속 후, 모드에 맞게 함수 실행

Database 모듈

  • fileReader()
    • Database폴더의 암호 파일들을 읽어서 딕셔너리 형태로 저장
  • fileWriter(암호 데이터)
    • 서버에서 새로 추가된 암호들을 당일 날짜의 파일로 저장

Encoder 모듈

  • Encoding(문장,[key])
    • 입력받은 문장을 애니그마 암호화 방식에 맞춰 암호화 후, 사용한 세팅을 key로 만들고, “암호/키"방식으로 리턴
    • Key도 같이 입력할 경우, 암호가 복호화된다.