2012-11-24 31 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 
相关问题