2012-11-24 34 views
0

嗯,我想我沒有得到創建它後寫入文件的過程。我是這個初學者,所以幫助完成這項任務對我來說非常重要。大會32位寫入文件後創建一個

描述(對稱加密): 1.編碼a。要求用戶輸入一些文字b。要求用戶在此範圍內鍵入一個私鑰[1-255]。執行範圍 有效性檢查。 C。使用提供的 專用密鑰對輸入文本進行加密,將密文置於用戶指定的文件中。 2.解碼a。要求用戶指定要解碼的文件。灣從該文件加載密文並嘗試在不使用 的情況下對其進行解密,假定私鑰與編碼中使用的私鑰是相同的 。 C。把所有的試驗結果放在由用戶命名的分離文件中。 d。找出最合理的結果(或原始明文)是什麼。

INCLUDE Irvine32.inc 
BUFMAX = 128     ; maximum buffer size 
KEYMAX = 128     ; maximum buffer size 
BUFFER_SIZE = 5000 

.data 
sPrompt BYTE  "Enter some text message:  ", 0 
keyPrompt BYTE  "Enter a private key [1-255]:  ", 0 
cFile BYTE  "Enter a filename for cypher text: ", 0 
sEncrypt BYTE  "Cypher text     ", 0 
sDecrypt BYTE  "Decrypted:     ", 0 
error BYTE  "The key must be within 1 - 255! ", 0 
buffer BYTE   BUFMAX + 1 DUP(0) 
bufSize DWORD ? 
keyStr BYTE   KEYMAX + 1 DUP(0) 
keySize DWORD ? 
key  DWORD ? 
filename BYTE  "newfile.txt     ", 0 
fileHdl DWORD ? 
bufFile BYTE  BUFFER_SIZE DUP (?) 
textMsg DWORD ? 

.code main PROC 
call InputTheString    ; input the plain text 
call InputTheKey    ; input the security key 
call CypherFile    ; input a cypher filename 
;call TranslateBuffer   ; encrypt the buffer 
;mov edx, OFFSET sEncrypt   ; display encrypted message 
;call DisplayMessage 
;call TranslateBuffer   ; decrypt the buffer 
;mov edx, OFFSET sDecrypt   ; display decrypted message 
;call DisplayMessage 
exit 

main ENDP 

InputTheKey PROC 
pushad      ; save 32-bit registers 

LK: mov edx, OFFSET keyPrompt ; display a prompt call WriteString ; Enter a private key [1-255] call Crlf ; start a new line call ReadInt ; read int into system mov key, eax ; store int into keyStr cmp eax, 255 ; compare newly read int ja LC ; jump if above 255 to LC cmp eax, 1 ; compare newly read int jb LC ; jump if below 1 to LC jmp LR ; if between range jump to LR LC: mov edx, OFFSET error ; The key must be within 1 - 255! call WriteString ; Display the error call Crlf ; start a new line loop LK ; loop back to enter the security key LR: popad ; restore the registers ret InputTheKey ENDP 

CypherFile PROC pushad mov edx, OFFSET cFile ; "Enter a filename for cypher text call WriteString ; Enter a name for encrypted file call Crlf ; Start a new line mov edx, OFFSET bufFile mov ecx, BUFMAX call ReadString ; Store the filename in eax mov edx, OFFSET bufFile call CreateOutputFile ;pop eax mov eax, fileHdl mov edx, OFFSET textMsg ;mov ecx, BUFFER_SIZE call WriteToFile popad call CloseFile ret 
;mov filename, eax 
;mov edx, OFFSET filename 
;push eax 
;mov eax, fileHdl 
;mov edx, OFFSET bufFile 
;mov ecx, BUFFER_SIZE 
;mov edx, "C:\outputtext.txt" 

;mov edx, OFFSET filename 
;mov ecx, SIZEOF filename 
;push eax 
;mov eax, bufSize 
;call WriteToFile 

CypherFile ENDP 

InputTheString PROC 
pushad      ; save 32-bit registers 
mov edx, OFFSET sPrompt   ; display a prompt 
call WriteString    ; "Enter some text message" 
call Crlf      ; start a new line 
mov ecx, BUFMAX    ; maximum character count 
mov edx, OFFSET buffer   ; point to the buffer 
call ReadString    ; input the string 
mov textMsg, eax 
mov bufSize, eax    ; save the length 
popad 
ret 

InputTheString ENDP 

DisplayMessage PROC 
pushad 
call WriteString 
mov edx, OFFSET buffer   ; display the buffer 
call WriteString 
call Crlf 
call Crlf 
popad 
ret 

DisplayMessage ENDP 

TranslateBuffer PROC 
pushad 
mov ecx, bufSize    ; loop counter 
mov esi, 0     ; index 0 in buffer 
mov edi, 0     ; index 0 in the key 

L1: mov al, keyStr[edi] ; get a character from encryption key xor buffer[esi], al ; translate a byte inc esi ; point to next byte inc edi ; go to next position in key cmp edi, keySize ; compare if equal to size of the key jb L2 mov edi, 0 ; reset to beginning of the key L2: loop L1 popad ret TranslateBuffer ENDP 

END main 
+0

忘記穿上該庫文件都設在這裏:http://www.kipirvine.com/asm/examples/index.htm – user1848703

+1

問題是什麼?你必須告訴我們你期望會發生什麼,而不是預期的輸出。 – Gunner

+0

我期望它將文本寫入創建的輸出文件。它沒有做的是將文本寫入文件,即使在創建文件之後。 – user1848703

回答

0

看起來你是盲目地只是把東西放在一起。

Irvine包括他所有功能的來源,它們包括對他們採取什麼參數的評論。 WriteToFile需要3個參數 - eax ==文件句柄寫入 edx ==指針緩衝包含數據寫入文件 ecx數據的==長度寫入文件。

CreateOutputFile已經返回eax文件句柄,但你與mov eax, fileHdl 您正確設置edx,現在數據的大小來寫,ReadString返回這eax 你也有popad在錯誤的地方overwitting它。

call ReadString ; Store the filename in eax 
push eax     ; save string length 

mov  edx, OFFSET bufFile 
call CreateOutputFile 
mov  hFile, eax   ; save file handle 
pop  ecx     ; restore string length into ecx 
mov  edx, OFFSET textMsg 
call WriteToFile 

mov  eax, hFile   ; move hfile into ecx 
call CloseFile 
popad 
ret 

看到區別?

您還有其他問題。你的密碼不起作用。

+0

盲目地在那裏是正確的關鍵字!我不太瞭解彙編語言,但試圖學習它。昨天是第一次在網上尋求幫助,每個人都非常有幫助。我不知道edx可以存儲textMsg來寫入文件。我認爲eax可以解決這個問題。 – user1848703

+0

我明白你的意思是密碼不工作。它加密文件名而不是textMsg。 – user1848703

+0

那麼,加密的消息如何在文件中結束? – user1848703

0

猜你沒有得到它的工作?那麼,我很無聊,所以清理了你的代碼,並修復了一些東西。儘管我並沒有輕易讓你掉隊,但我在代碼中添加了一個小錯誤,所以你不能提交正確的代碼/輸出文件。

Kip,爲初學者寫了一本好書。儘管如此,他並沒有使用MASM的全部功能。對於初學者來說,關於MASM的偉大之處在於它的invoke宏。它檢查被調用的proc參數並捕獲許多錯誤。

在你的其他文章中,你缺少一個呼叫權的參數?那麼,如果你使用WriteToFile來調用,那麼MASM就會發現並告訴你。但我猜他沒有表現出來?

Anywhoo,試試這個:

INCLUDE d:\irvine32\Irvine32.inc 
includelib d:\irvine32\irvine32.lib 
includelib d:\irvine32\kernel32.lib 
includelib d:\irvine32\user32.lib 
BUFMAX = 128        ; maximum buffer size 
BUFFER_SIZE = 5000 

.data 
sPrompt  BYTE "Enter some text message: ", 0 
keyPrompt BYTE "Enter a private key [1-255]: ", 0 
cFile  BYTE "Enter a filename for cypher text: ", 0 
sEncrypt BYTE "Cypher text: ", 0 
sDecrypt BYTE "Decrypted: ", 0 
error  BYTE "The key must be within 1 - 255!", 0 

.data? 
bufSize  DWORD ? 
key   DWORD ? 
bufFile  BYTE BUFFER_SIZE DUP (?) 
buffer  BYTE BUFMAX + 1 DUP (?) 

.code 
main PROC 
    call InputTheString     ; input the plain text 
    call InputTheKey      ; input the security key 

    call TranslateBuffer     ; encrypt the buffer 

    mov  edx, offset sEncrypt 
    call WriteString 

    mov  edx, OFFSET buffer    ; display encrypted message 
    call WriteString 
    call Crlf 

    call CypherFile 

    call TranslateBuffer     ; decrypt the buffer 

    mov  edx, offset sDecrypt 
    call WriteString 

    mov  edx, OFFSET buffer    ; display encrypted message 
    call WriteString 
    call Crlf 

    call WaitMsg 
    exit 

main ENDP 

InputTheString PROC 
    mov  edx, OFFSET sPrompt    ; display a prompt 
    call WriteString      ; "Enter some text message" 

    mov  ecx, BUFMAX      ; maximum character count 
    mov  edx, OFFSET buffer    ; point to the buffer 
    call ReadString      ; input the string 

    push offset buffer 
    call Str_length 
    mov  bufSize, eax     ; save the length 
    ret 
InputTheString ENDP 

InputTheKey PROC 

PromptForKey: 
    mov  edx, OFFSET keyPrompt   ; display a prompt 
    call WriteString      ; Enter a private key [1-255] 
    call ReadInt       ; read int into system 
    test eax, eax 
    jz  BadKey 
    cmp  eax, 255 
    jg  BadKey 

    mov  key, eax 
    ret 

BadKey: 
    mov  edx, OFFSET error    ; The key must be within 1 - 255! 
    call WriteString 
    call Crlf 
    jmp  PromptForKey 
InputTheKey ENDP 

CypherFile PROC 
    mov  edx, OFFSET cFile    ; "Enter a filename for cypher text 
    call WriteString      ; Enter a name for encrypted file 

    mov  edx, OFFSET bufFile 
    mov  ecx, BUFMAX 
    call ReadString      ; Store the filename in eax 

    mov  edx, OFFSET bufFile 
    call CreateOutputFile 
    push eax        ; save file handle 

    mov  ecx, bufSize  
    sub  ecx, 5   
    mov  edx, OFFSET buffer 
    call WriteToFile 

    pop  eax        ; restore file handle 
    call CloseFile 
    ret 
CypherFile ENDP 

TranslateBuffer PROC 
    mov  ecx, bufSize 
    mov  eax, key 
    xor  esi, esi 
XorByte: 
    xor  buffer[esi], al 
    inc  esi 
    cmp  esi, ecx 
    jne  XorByte 
    ret 
TranslateBuffer ENDP 

DisplayMessage PROC 

    mov  edx, OFFSET buffer   ; display the buffer 
    call WriteString 
    call Crlf 
    call Crlf 
    ret 

DisplayMessage ENDP 
END main 
相關問題