회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
1072 마이크로프로세서 HOTkeil 컴파일러 에서 왜 이런에라가?2 강원도 630 2014.01.12
1071 Software & IDEs HOTUSB를 사용하는 디바이스 펌웨어 개발 책? 문서?1 베이아터 465 2014.01.09
1070 마이크로프로세서 프로그램 시작 하려 합니다.2 서봉 200 2014.01.05
1069 마이크로프로세서 HOTPADS 자삽 데이터 작성법 좀 알려 주세요.1 SS 838 2013.12.18
1068 마이크로프로세서 HOT인체감지모듈 어셈블리어 질문1 lacoca 577 2013.12.14
1067 마이크로프로세서 HOT8051 mcu를 사용한 압력조절장치 프로그램이 필요합니다. ndk 514 2013.11.13
1066 마이크로프로세서 HOTavr과 근접센서 질문드립니다!2 고냥정권 749 2013.11.01
1065 펌웨어 & 코딩언어 HOT피보나치 수열..2 aNitMotD 539 2013.10.30
1064 마이크로프로세서 layout footprint를 allegro에서 열 수 있나요? 갈아만든공돌이주스 296 2013.10.29
1063 마이크로프로세서 프로그램 다운로드 관련1 청풍근이 305 2013.10.16
1062 마이크로프로세서 내부eeprom에 대한 질문_delay jaemi2010 393 2013.10.08
1061 펌웨어 & 코딩언어 HOT1D FEM coding 문제 ..원하는 답이 안나와요 수치해석미쵸 496 2013.09.29
1060 펌웨어 & 코딩언어 HOTPIC 16F628A와 CCSC 기반의 프로그래밍 질문입니다. 제발 도와주세요ㅠㅠ 신천동주민 467 2013.09.24
1059 마이크로프로세서 Cooper의 일부분을 드러나게 하고 싶습니다.1 곤곤 241 2013.09.24
1058 마이크로프로세서 HOTpickit3 에넣은 hex 추출가능한지?1 야니 657 2013.09.15
1057 Software & IDEs HOT큐블럭 프로그래밍 관련 질문 올립니다.1 행복이아빠 583 2013.08.22
1056 마이크로프로세서 HOTAT90CAN128 통신 관련 질문드립니다 Twinkle 582 2013.07.23
1055 Software & IDEs HOTProteus 7.7 Professional2 Keyshaun 745 2013.07.12
1054 Software & IDEs HOTmsp430f1611을 사용하고 있는데 ADC에서 읽어들인 값하고 직접 테스터기로 찍은 값이 달라요1 김진성짱 800 2013.06.25
1053 마이크로프로세서 HOT상단메뉴에 있는 '계산기'란 카테고리에 대하여... 음악은나의삶 408 2013.06.17
Prev 1 2 3 4 5 6 7 8 9 10 ... 58 Next
  • 지식이란 자기가 그만큼 배웠다는 교만이고, 지혜는 자기가 더 이상 알지 못한다는 겸손이다.
    - 쿠퍼
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.