INCLUDE Irvine32.inc
;KEY = 239     		;암호 키. 원본 소스에 있던 것. 문제풀이에서는 사용하지 않음
BUFMAX = 128     	;버퍼의 최대 사이즈. 어떤 버퍼인가?

.data
sPrompt  BYTE  "Enter the plain text: ",0
sEncrypt BYTE  "Cipher text:          ",0
sDecrypt BYTE  "Decrypted:            ",0

buffer   BYTE   BUFMAX+1 DUP(0)				;문자열의 총 갯수 + 널종료 문자의 갯수
bufSize  DWORD  ?

sUserKey	BYTE "Enter the user key: ",0
userkey		BYTE BUFMAX+1 DUP(0)
userkeysize	DWORD ?
tempKEY	BYTE	?	;키값의 임시저장공간

bufferindex	DWORD ?	;버퍼 인덱스용 변수
keyindex		DWORD ?	;키값 인덱스용 변수

.code
main PROC
	call	Clrscr			;화면 정리
	mov	edx,OFFSET sUserKey	;화면에 "Enter the user key: " 출력 준비
	call	WriteString		;화면에 "Enter the user key: " 출력
	mov	ecx,BUFMAX		;사용자 정의 키의 최대 길이를 지정하는 듯
	mov	edx,OFFSET userkey	;userkey의 오프셋 저장
	call	ReadString		;사용자 정의 키 값 입력
	mov	userkeysize,eax	;userkeysize에 사용자 정의 키의 길이를 저장시킨다
	;call	;사용자 임의의 암호 문자열을 입력받는다.
	call	InputTheString	;문자열 갯수 저장하는 기능만 보이는데 어느새 문자열을 buffer에 저장했을까?
	call	TranslateBuffer	;TranslateBuffer를 호출하여 문자열과 KEY를 XOR하여 암호화한다
	mov	edx,OFFSET sEncrypt	;"Cipher text: "를 화면에 출력할 준비를 한다.
	call	DisplayMessage	;화면에 암호화된 문자열을 출력한다
	call	TranslateBuffer	;TranslateBuffer를 호출하여 암호화된 문자열과 KEY를 XOR하여 복호화한다
	mov	edx,OFFSET sDecrypt	;"Decrypted: "를 출력할 준비
	call	DisplayMessage	;평문 출력.

	exit
main ENDP

;-----------------------------------------------------
InputTheString PROC
;-----------------------------------------------------
	pushad					;32bit 레지스터 푸시
	mov	edx,OFFSET sPrompt
	call	WriteString		;화면에 "Enter the plain text: "를 출력
	mov	ecx,BUFMAX			;ecx에 BUFMAX(=128)를 대입
	mov	edx,OFFSET buffer	;edx에 buffer의 오프셋값을 대입
	call	ReadString		;문자열 입력
	mov	bufSize,eax			;bufsize에 eax값 저장=입력한 문자수를 bufsize에 저장
	call	Crlf			;한줄 아래로 간다.
	popad					;32bit 레지스터 팝
	ret
InputTheString ENDP

;-----------------------------------------------------
DisplayMessage PROC
;-----------------------------------------------------
	pushad					;32bit 레지스터 푸시
	call	WriteString		;"Cipher text: "를 화면에 출력하거나 "Decrypted: "를 화면에 출력
	mov	edx,OFFSET buffer	;buffer에 들어있는 문자열 출력 준비
	call	WriteString		;buffer에 들어있는 문자열을 출력한다(암호화 되있거나 복호화되어있다)
	call	Crlf			;한줄 내려가
	call	Crlf			;또 내려가
	popad					;32bit 레지스터 팝
	ret
DisplayMessage ENDP

;-----------------------------------------------------
TranslateBuffer PROC
;-----------------------------------------------------
	pushad				;32bit 레지스터 푸시
	mov	ecx,bufSize		;문자열의 갯수로 루프 횟수를 지정한다
	mov	keyindex,0		;사용자 정의 키 인덱스 시작
	mov	bufferindex,0		;버퍼 인덱스 시작
	
L1:
	mov	esi,keyindex		;esi에 키 인덱스 저장
	mov	al,userkey[esi]
	mov	tempKEY,al		;임시 키 저장공간에 해당 인덱스의 키 값 저장
	cmp	esi,userkeysize	;키 인덱스 값과 사용자 정의 키의 위치 비교
	je	initkey			;키 인덱스 초기화로 점프
	jne	continue			;키 인덱스 증가로 점프
	initkey:
	mov	keyindex,0		;키 인덱스 초기화
	jmp	goloop			;루프 계속한다
	continue:
	inc	keyindex			;키 인덱스값 증가시킨다
	goloop:
	
	mov	esi,bufferindex
	xor	buffer[esi],al	;buffer배열의 esi번째 문자를 KEY와 xor한다
	inc	bufferindex				;인덱스값 1증가
	loop	L1			;루프 반복

	popad				;32bit 레지스터 팝
	ret
TranslateBuffer ENDP
END main


완벽하지 않은 풀이.

'노트정리 > 어셈블리 책 스터디 공간' 카테고리의 다른 글

6.9.11 메세지 암호화  (0) 2010.07.26
6.9.10 오버플로까지 피보나치 출력  (0) 2010.07.14
6.9.9가중확률  (0) 2010.07.13
6.9.7 부울계산기(1)  (0) 2010.07.13
6.9.5. 6.9.6 대학등록(1)(2)  (0) 2010.07.12
6.9.4 시험성적계산2 (어셈블리어)  (0) 2010.06.30
6.9.3 시험성적계산  (0) 2010.06.30
6.9.2 루프 구현  (0) 2010.06.30
Posted by 공돌이pooh
,