회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
5724 마이크로프로세서 HOT엽기 방열판ㅋㅋ6 뺘쑝 1529 2007.08.04
5723 자유주제 HOT무조건 만들고 본다^^1 닌자케이 13778 2007.08.04
5722 자유주제 HOT^^ 잠온다1 닌자케이 14774 2007.08.04
5721 마이크로프로세서 HOTwav 파일을 부져 또는 스피커 재생시6 빛나는 영혼 3714 2007.08.05
5720 자유주제 HOT주말은 잘 보내셨는지요?3 아크마 14123 2007.08.05
5719 마이크로프로세서 HOT슬립모드 제어?1 대박 922 2007.08.06
5718 자유주제 HOTㅋㅋ 문의문의 ㅋㅋ 궁금증 !!6 빠라삐리뽀 15000 2007.08.06
5717 마이크로프로세서 HOTAT89S52에서 워치독타이머로 파워절약모드 설정은?1 대박 1181 2007.08.07
5716 자유주제 HOT징크스.1 빛나는 영혼 13311 2007.08.07
5715 마이크로프로세서 HOT라인트레이서 제작에 관해서 질문드려요2 sinpk 743 2007.08.07
5714 머신러닝, AI & 알고리즘 HOT순차 프로그램에 대한 간단한 알고리즘과 재귀 알고리즘의 속도 테스트 - by 아크마7 아크마 3062 2007.08.08
펌웨어 & 코딩언어 HOT어셈으로 구현한 암호화 복호화 - by 아크마4 아크마 2748 2007.08.08
5712 마이크로프로세서 HOTLCD 원리좀..3 은하철도9981 957 2007.08.08
5711 자유주제 HOTmistake1 빛나는 영혼 15923 2007.08.09
5710 자유주제 HOT운영자님 서울에서 정모 한번해요11 보해소주 14803 2007.08.09
5709 마이크로프로세서 HOTRC서보모터의 토크에 관해서.1 챠리스만 965 2007.08.09
5708 드론/로봇/라인트레이서 HOT센서부분 질문요5 1025 2007.08.09
5707 자유주제 HOT사랑합시다.7 아크마 13809 2007.08.10
5706 마이크로프로세서 HOT수광센서 질문 드립니다..3 아우슈비츠 2337 2007.08.10
5705 자유주제 HOT인사드립니다.3 happysunny 13821 2007.08.10
Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 295 Next
  • 격렬하게 사랑을 하고 있을 때는 자기 자신에게 사랑을 하고 있는 것인지 상대를 사랑하고 있는지 잘 생각하라.
    - 유태격언
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.