회원가입 ID/PW 찾기
AA

작성일 : 2005년 11월 어느날

작성자 : 김대영(아크마)

목적 : This program encrypts and decrypts a message string, using modular arithmetic (한글로 하려니 참 말이 어색해서)

 

 

; MP2 - Encryption and Decryption
;
; 김대영
; 11월 어느날
;
; This program encrypts and decrypts a message string, using
; modular arithmetic

        BITS    16

;====== SECTION 1: Define constants =======================================

        CR      EQU     0Dh
        LF      EQU     0Ah
        BS      EQU     08h
        ESC     EQU     1Bh             ; ESC key
        SPACE   EQU     20h
        MAXLen  EQU     60              ; MAXimum length of input string

; You may define additional constants here

;====== SECTION 2: Declare external procedures ============================

EXTERN  kbdin, dspout, dspmsg, mp2xit, ascbin
EXTERN  libGetStr, libKeys, libEncryp, libDecryp
GLOBAL  k1, k2, mik1, prompt, invmsg, inpstr, modulo, CRLFString
GLOBAL  GetStr, Keys, Encryp, Decryp

;====== SECTION 3: Define stack segment ===================================

SEGMENT stkseg STACK                    ; *** STACK SEGMENT ***
        RESB      64*8
stacktop:
        RESB    0                       ; NASM bug workaround

;====== SECTION 4: Define code segment ====================================

SEGMENT code                            ; *** CODE SEGMENT ***

;====== SECTION 5: Declare variables for main procedure ===================

prompt  DB      CR,LF,LF,'?','$'
invmsg  DB      CR,LF,'Invalid command','$'
inpstr  RESB    MAXLen                  ; Input string
crlfmsg DB   CR,LF, '$'
k1      DW      1                       ; Encryption/decryption keys
k2      DW      0
mik1    DW      1                       ; Multiplicative inverse of k1 mod 37

;You may declare additional variables here
modulo DW 37  ;t
invkeymsg  DB      CR,LF,'Invalid Keys','$'
s      DW      0                     
b      DW      0

;====== SECTION 6: Program initialization =================================

..start:
        MOV     AX, CS                  ; Initialize Default Segment register
        MOV     DS, AX
        MOV     AX, stkseg              ; Initialize Stack Segment register
        MOV     SS, AX
        MOV     SP, stacktop            ; Initialize Stack Pointer register

;====== SECTION 7: Main procedure =========================================

main:
.mainloop:
        MOV     BX, inpstr
        CALL    GetStr
        CMP     BYTE [BX], 'K'          ; K for Keys function
        JE      .doKeys
        CMP     BYTE [BX], 'E'          ; E for Encryption function
        JE      .doEncryp
        CMP     BYTE [BX], 'D'          ; D for Decryption function
        JE      .doDecryp
        CMP     BYTE [BX], 'Q'          ; Q for Quit function
        JE      .done
        MOV     DX, invmsg              ; Otherwise invalid command
        CALL    dspmsg
        JMP     .mainloop
       
.doKeys:
        INC     BX                      ; Go past command character
        CALL    Keys
        JMP     .mainloop

.doEncryp:
        INC     BX                      ; Go past command character
        CALL    Encryp
        JMP     .mainloop

.doDecryp:
        INC     BX                      ; Go past command character
        CALL    Decryp
        JMP     .mainloop
       
.done:
        CALL    mp2xit
     
GetStr:
     ;CALL    libGetStr
       
      pusha
       
        mov dx, prompt
        call dspmsg
        mov ax,0
        mov cx, bx;  //첫번째 위치값을 저장함
       
  .GetStrBegin 
   call    kbdin   ; Wait for a key to be pressed
   cmp   al, 13   ; if return
   je   .GetStrDone
    
   cmp   al, 8   ; if bakspace
   jne  .NoBackspace
   
   cmp  cx, bx ; 백스페이스로 지울때 ? 여기 이전까지만 지우도록
   je  .GetStrBegin
   
   dec  bx  ; 백스페이스 누르면 입력스트링의 가르키는 오프셋을 감소
   
  
    
   mov  dx, 8 
   call  dspout
   
   mov  dx, ''
   call  dspout
   
   mov  dx, 8 
   call  dspout
   
   jmp  .GetStrBegin
   
   .NoBackspace 
   mov  byte[bx], al  ; patter[i] = al
   
   mov  dx, ax
   call  dspout
   inc  bx
  jmp .GetStrBegin
   
  .GetStrDone 
  mov byte[bx], '$'
 
    mov dx, crlfmsg
     call dspmsg
       
  popa
        RET
Keys:

 PUSHA
 
    CALL ascbin
    CMP DL, 0  ; ascbin 호출 이후에 DL 값으로 변환성공여부
    jne .invalidKeys
 
    CMP AX, 1       
    JL .invalidKeys     
    CMP AX, 36
    JG .invalidKeys
   
    MOV word[s], AX 
       
    CALL ascbin
    CMP DL, 0
    jne .invalidKeys
   
    CMP AX, 1       
    JL .invalidKeys        
    CMP AX, 36
    JG .invalidKeys
   
    MOV word[b], AX 

    MOV CX, 1

  .multInvLoop:
  ; if(((s * i) % t) == 1)
  ; 
   MOV AX, WORD [s]
   MOV BX, WORD [modulo]
   MUL CX
   CALL XmodY

  
   CMP AX, 1   ;  hasInv = true;
   JZ .hasInv
  ;
 
  CMP CX, WORD [modulo]
  JZ .invalidKeys  ; i = t
 
  INC CX
  JMP .multInvLoop

;  }

  .hasInv:
   MOV WORD [mik1], CX
   MOV AX, word[s]
   MOV WORD[k1], AX
   MOV AX, word[b]
   MOV WORD[k2], AX
 
   JMP .endKeys
 
 .invalidKeys:
  MOV DX, invkeymsg
  CALL dspmsg
   
 .endKeys:
  POPA
  RET
  

; inputs:  AX = X
;    BX = Y
; Outputs: AX = remainder
XmodY:
 DIV BX
 MOV AX, DX
 RET
     
Encryp:
      ;CALL    libEncryp
      ;RET
     
    PUSHA

  ; print 2 spaces
  MOV DL, 20h
  CALL dspout
  CALL dspout

  ;foreach(inputString as char c)
  ;{
  
  .forEachChar:
  CMP BYTE [BX], '$'
  JE .endEnc

  CMP BYTE [BX], 13
  JE .endEnc
   
 
  
 ; if(c > 0x5A || c < 0x41) {
  ;  printf("%c", c)
  
  ; 0 <= c <=9 , A <= c <= Z  not a, z
  
  CMP BYTE [BX], '0' ; 30h
  JL .rawPrintChar
  CMP BYTE [BX], '9'
  JL .encDigit
  CMP BYTE [BX], '@' ;40h
  JL .rawPrintChar 
  CMP BYTE [BX], 'Z'
  JG .rawPrintChar 
  JMP .encChar
  ; } else {
  ;  char z = 0xFF, d;
  
  .encDigit
   MOVZX AX, BYTE [BX]
   SUB AX, 15h
   JMP .encDo
  
  .encChar
   MOVZX AX, BYTE [BX]
   SUB AX, 40h

  
  ;  while(z > 26)
  ;

  .encDo:
  ; e := g( (f(c) * k1 + k2) mod 37 )

  MUL WORD[k1]
  ADD AX, WORD[k2]
  
  PUSH BX    ; save BX
  MOV BX, WORD [modulo]
  CALL XmodY    ; AX now contains (m * z) % K2
  POP BX    ; get BX
  
  ;CMP AX, 36
  ;JA .encWhile
  ;  } 
  
  
  .printChar:
  ;  z += 0x40;
  
  CMP AX, 27
  JL .convChar 
  
  ; 숫자라면 15h만 더해줌
  ADD AX, 15h  
  MOV DX, AX
  JMP .realPrintChar  
   
  .convChar 
  ADD AX, 40h
  MOV DX, AX
  JMP .realPrintChar
    
  .rawPrintChar:
   MOVZX DX, BYTE [BX]
  
  .realPrintChar:
   CALL dspout
   INC BX
   JMP .forEachChar

    
  .endEnc:
   POPA
   ret
 
Decryp:
    ;CALL    libDecryp
    ;RET 
  
    PUSHA

  ; print 2 spaces
  MOV DL, 20h
  CALL dspout
  CALL dspout

  
  .whileEachDecChar:
  CMP BYTE [BX], '$'
  JE .endDec

  CMP BYTE [BX], 13
  JE .endDec
   
 
  ; 0 <= c <=9 , A <= c <= Z  not a, z
  
  CMP BYTE [BX], '0' ; 30h
  JL .rawDecPrint
  CMP BYTE [BX], '9'
  JL .decDigit
  CMP BYTE [BX], '@' ;40h
  JL .rawDecPrint 
  CMP BYTE [BX], 'Z'
  JG .rawDecPrint 
  JMP .decChar

  .decDigit
   MOVZX AX, BYTE [BX]
   SUB AX, 15h
   JMP .decDo
  
  .decChar
   MOVZX AX, BYTE [BX]
   SUB AX, 40h

  .decDo:
  ; d := g( (mik1 * (f(c) + 37 - k2)) mod 37 )

  ADD AX, WORD[modulo]
  SUB AX, WORD[k2]
  MUL WORD[mik1]
 

  PUSH BX    ; save BX
  MOV BX, WORD [modulo]
  CALL XmodY    ; AX now contains (m * z) % K2
  POP BX    ; get BX
  
 
  .printDecChar:

  CMP AX, 27
  JL .convDecChar 
  
  ; 숫자라면 15h만 더해줌
  ADD AX, 15h  
  MOV DX, AX
  JMP .realDecPrintChar  
   
  .convDecChar 
  ADD AX, 40h
  MOV DX, AX
  JMP .realDecPrintChar
    
  .rawDecPrint:
   MOVZX DX, BYTE [BX]
  
  .realDecPrintChar:
   CALL dspout
   INC BX
   JMP .whileEachDecChar

    
  .endDec:
   POPA
   ret

아크마

모르는 것이 무엇인지 스스로 정리하고 질문하는 습관을 가집시다.
무성의/광범위하거나 직접 해보지 않고 올리는 질문은 서로를 피곤하게 합니다.
질문쪽지는 사절이오니 게시판에 글을 남겨주세요. 그래야 다같이 공유할 수 있으니까요.

댓글 4

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
108 마이크로프로세서 HOT저.. 공부하는 방법 때문에 그런데.. 도움 좀 주세요.. ㅠㅠ 울고싶어잉..14 행복하면 1353 2007.09.30
107 마이크로프로세서 HOTAT89S51에서 ISP를 Serial Port로 하는 방법 질문4 임낙 2184 2007.09.30
106 마이크로프로세서 HOT안녕 하세요` ㅋㅋ6 행복하면 1061 2007.09.28
105 마이크로프로세서 HOT8051 공부를 시작할려고 책을 샀는데..9 행복하면 1132 2007.09.28
104 마이크로프로세서 HOT오늘부터 8051에 대해서 공부를 해 볼려고 이렇게 인사를 드립니다..7 행복하면 1063 2007.09.27
103 마이크로프로세서 HOT마이컴 avr mega8535인데요...4 dwl 1386 2007.09.26
102 마이크로프로세서 HOT아무리 생각해도 난 너를 ㅠ_ㅠ;;3 챠리스만 1052 2007.09.21
101 마이크로프로세서 HOT듀비&주기에 관해서 질문합니다.(보너스도 포함-_-;;;)2 챠리스만 1097 2007.09.20
100 마이크로프로세서 HOTADC에 궁금한게 있어 이렇게 질문 드립니다.7 레드리네 1687 2007.09.19
99 마이크로프로세서 HOT8051에 있는 4개의 7세그먼트를 가지고 할 수 있는게 머가 있을까요;;9 Genesis 1598 2007.09.18
98 마이크로프로세서 HOT아크마님 도와주세요 -_-;;1 챠리스만 1112 2007.09.17
97 마이크로프로세서 HOT저의 생각에 조언을 부탁드립니다.8 챠리스만 1306 2007.09.12
96 마이크로프로세서 HOT배터리 충전하는거에 대해서 질문드려요2 sinpk 1638 2007.09.11
95 마이크로프로세서 HOTL297과 SLA7024를 이용한 스텝 모터 방향 제어4 기계사랑 4562 2007.09.11
94 마이크로프로세서 HOT제가짠 모터제어 소스인데 조금 봐주세요ㅜㅜ(안되내)3 mgcjjang 4422 2007.09.10
93 마이크로프로세서 HOTavr studio 쓰는 도중에...7 화언 2273 2007.09.09
92 마이크로프로세서 HOT질문이 있어요 시리얼 인터럽트..4 빠라삐리뽀 1200 2007.09.09
91 마이크로프로세서 HOT엽기 방열판ㅋㅋ6 뺘쑝 2088 2007.08.04
90 마이크로프로세서 HOT아흑 라인트레이서 그디어 조립 완성 ㅎㅎㅎ6 뺘쑝 2243 2007.07.26
89 마이크로프로세서 HOTMB 라인마우스 공개 샷!1 아크마 2126 2007.07.24
  • 인생은 우주의 영광이요, 또한 우주의 모욕이다.
    - 파스칼
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.