4

使用该程序一段时间后,它在创建输出文件后一直停止。我正在使用 Visual Basic 2010 并且仍然是这方面的初学者。作业问题是这样的:

说明(对称加密):

  1. 编码

    • 要求用户输入一些文本
    • 要求用户键入此范围 [1-255] 内的私钥。执行范围有效性检查。
    • 使用提供的私钥加密输入文本,将密文放在用户命名的文件中。
  2. 解码

    • 要求用户指定要解码的文件。
    • 从该文件加载密文并尝试对其进行解密,而不假设私钥与编码中使用的密钥相同。
    • 将所有试验结果放在一个由用户命名的单独文件中。
    • d。找出最合理的结果(或原始明文)是什么。

我可以弄清楚如何加密文本,但无法使用位于此教科书地址的库创建输出文件: http ://www.kipirvine.com/asm/examples/index.htm

我将在下面包含我的代码,并通过注释材料显示我对此进行了多少次尝试。这本书没有很好地向我解释,所以如果我能看到它想说什么,那将非常有帮助!

提前致谢!

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 (?)

.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
    call ReadString             ; Store the filename in eax
    ;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"
    call CreateOutputFile
    ;mov edx, OFFSET filename
    ;mov ecx, SIZEOF filename
    ;push eax
    ;mov eax, bufSize
    call WriteToFile
    pop eax
    ;call CloseFile
    ret
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 bufSize, eax                ; save the length
    popad
    ret
InputTheString ENDP
    COMMENT !
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
4

1 回答 1

2

从哪里开始?

您不是缺少一些 ReadString 的参数吗?也许是指向存储输入文件名的位置的指针?接收文件名的缓冲区大小?

CypherFile您将所有寄存器推入堆栈,pushad但最后,您只有pop eax. 大问题,应该是popad

就目前而言,它不会向输出文件写入任何内容,因为 WriteToFile 的参数已被注释掉。

编辑 - 违背我的“只是给出代码”你需要告诉 ReadString 在哪里保存输入的文件名和缓冲区的大小。然后将其传递给 CreateOutputFile - 在 CyperFile proc 中 -

mov     edx, offset buffer      ; you are missing a buffer for filename
mov     ecx, BUFMAX             ; buffer size
call    ReadString              

mov     edx, offset buffer      ; Pass this to CreateOutputFile
call    CreateOutputFile

现在阅读源代码CreateOutputFile,它说它在成功时返回一个文件句柄,将它保存在某个地方。CloseFile当您完成对文件的写入时,您可以使用它。如果没有成功创建文件,会返回INVALID_HANDLE_VALUE

于 2012-11-24T00:46:20.343 回答