Apagada docs

Aprendiendo a programar el pasado

Herramientas de usuario

Herramientas del sitio


es:cutressembler:codif

Codifica.com

Codifica un archivo, usando otro archivo como clave (esto era un buen sistema en tiempos de los 286, que tenían poca potencia de cálculo, pero no es un buen método criptográfico hoy en día). Toma dos parámetros, que son los archivos:

Codifica archivo_en_texto_claro archivo_clave

o

Codifica archivo_en_clave archivo_clave

Devuelve un archivo llamado Codout que está en texto plano o en clave (si la clave es incorrecta, el archivo estará “doblemente codificado”).

Este es un programa para CSEMBL, lo que quiere decir que se usan etiquetas en la forma “:etiqueta” y referencias en la forma “%referencia%”.

:INI
;En cs:5d y cs:6d se meten los dos primeros
;argumentos syss pueden ser archivos.
;asumimos es=cs
pushf
sti
mov si,5d
mov di,%nombarch1%
mov cx,8
:bucl1
    lodsb
    cmp al,20
    STOSB
LOOPNZ %bucl1%
CMP AL,20
JNZ %bucl1fin%
dec di
:bucl1fin
mov by [di],2e
inc di
mov cx,3
mov si,5d+8
:bucl2
    lodsb
    cmp al,20
    STOSB
LOOPNZ %bucl2%
cmp al,20
jnz %bucl2fin%
dec di
:bucl2fin
mov by [di],0
;Aqu¡ no hace falta aumentar DI
mov si,6d
mov di,%nombarch2%
mov cx,8
:bucl3
    lodsb
    cmp al,20
    STOSB
LOOPNZ %bucl3%
cmp al,20
jnz %bucl3fin%
dec di
:bucl3fin
mov by [di],2e
inc di
mov cx,3
mov si,6d+8
:bucl4
    lodsb
    cmp al,20
    STOSB
LOOPNZ %bucl4%
cmp al,20
jnz %bucl4fin%
dec di
:bucl4fin
mov by [di],0
;Aqu¡ no hace falta aumentar DI
POPF
XOR CX,CX
MOV DX,%nombarch1%
MOV AX,100
CALL %OPFIL%
cmp ax,FFFF
jnz %NOERROR_1%
;Error al abrir 1=error al leer 1
JMP %ERROR_L2%
;int 20
:NOERROR_1
MOV DX,%nombarch2%
MOV AX,200
CALL %OPFIL%
cmp ax,FFFF
jnz %NOERROR_2%
;int 20
;Error al abrir 2=error al leer 2
JMP %ERROR_L2%
:NOERROR_2
; Todav¡a no s‚ c¢mo averiguar‚ el tercer
;nombre
MOV DX,%nombarch3%
;Este archivo se abre para escritura
MOV AX,301
CALL %OPFIL%
cmp ax,FFFF
jnz %NOERROR_3%
;Error al abrir 3=error al leer 3
JMP %ERROR_L3%
;int 20
:NOERROR_3
;---------Leer 3c00 bytes del archivo base
:Leer_1
MOV AX,100
MOV CX,3c00
MOV DX,%buffer1%
CALL %RFIL%
;---------Almacenar el valor de salida,
;         a menos que sea -1
CMP AX,FFFF
JNZ %NOERROR_4%
JMP %ERROR_L1%
:NOERROR_4
MOV [%bytes_arch1%],ax
;---------Leer 3c00 bytes del archivo clave
MOV DX,%buffer2%
MOV CX,3c00
:leyendo_2
push cx
MOV AX,200
CALL %RFIL%
add dx,ax
pop cx
CMP AX,FFFF
JNZ %NOERROR_5%
JMP %ERROR_L2%
:NOERROR_5
sub cx,ax
;--------Si se acaba archivo-clave, vuelve
;        a leerlo.
jz %yaleido_2%
;LSEEK #2 to 0:
push cx
push dx
xor bh,bh
mov bl,[2+%handle%]
xor dx,dx
xor cx,cx
mov ax,4200
int 21
pop dx
pop cx
jmp %leyendo_2%
:yaleido_2
; No incluir la siguiente l¡nea podr¡a
; hacer imposible el desciframiento
; de archivos cortos, porque parte de la
; clave podr¡a ser ilegible. 
mov cx,[%bytes_arch1%]
MOV BX,0
:codificar
MOV AX,[BX+%buffer1%]
XOR AX,[BX+%buffer2%]
MOV [BX+%buffer3%],AX
inc bx
loop %codificar%
;-------Escribir salida
MOV CX,[%bytes_arch1%]
:leyendo_3
MOV AX,301
MOV DX,%buffer3%
CALL %RFIL%
CMP AX,FFFF
JNZ %NOERROR_6%
JMP %ERROR_L3%
:NOERROR_6
cmp wo [%bytes_arch1%],3c00
jnz %fin%
JMP %Leer_1%
:FIN
mov ah,9
mov dx,%msg_fin%
int 21
int 20
:ERROR_L1
mov dx,%msg_errl1%
jmp %sherrmsg%
:ERROR_L2
mov dx,%msg_errl2%
jmp %sherrmsg%
:ERROR_L3
mov dx,%msg_errl3%
jmp %sherrmsg%
:sherrmsg
mov al,9
int 21
mov dx,%msg_uso%
mov al,9
int 21
int 20

:msg_fin
db "Archivo codificado" 0a 0d 24
:msg_errl1
db "Error leyendo archivo 1" 0a 0d 24
:msg_errl2
db "Error leyendo archivo 2" 0a 0d 24
:msg_errl3
db "Error escribiendo archivo 3" 0a 0d 24
:msg_uso
db "Uso: CODIFICA arch_ori arch_clave" 0a 0d 0a 0d
db "Crea un archivo que contiene el archivo original codificado" 0a 0d 24
:nombarch1
db "01234567.123" 0 0
:nombarch2
db "01234567.123" 0 0
:nombarch3
db "codout__.$$$" 0 0
:bytes_arch1
dw 0 0

;BIBLIOTECA DE EJECUCIàN CUTRESSEMBLER
;CUTRESSEMBLER RUN-TIME LIBRARY
;
:OPFIL
;PARAMS:
;AH= n£m_archivo
;AL= modo_archivo:
;      0: R.   NO Crear nuevo archivo. 
;      1: W.   Crear si no existe. 
;      2: R/W. Crear si no existe. 
; 
;DS:DX= nombre_archivo (limitado por "00")
 
PUSH BX 
    ;Comprobaci¢n de la validez del primer par metro: N§ Control/Arch. 
    PUSH AX
        ;1: No puede ser "FF". 
        CMP Ah,FF
        JZ %OPF_EEZ0% 
        ;2: No puede ser mayor de 10 (0Ah). 
        CMP Ah,0a
        JG %OPF_EEZ1%
        ;3: No ha de estar en uso. 
        MOV Bx,%HANDLE%
        PUSH AX
            MOV AL,AH
            XOR AH,AH
            ADD BX,AX
        POP AX
        CMP by [BX],ff
        JZ %OPF_EEZ3% 
    POP AX 
    PUSH AX 
        ;Esto evita que C[arry] sea verdad.                
        XOR BX,BX
        MOV AH,3d
        INT 21
        JC %OPF_Err%
        ;Se guarda el HANDLE del DOS en BX: 
        MOV BX,AX
    POP AX
    :OPF_AsNum
    PUSH AX
        ;Se guarda el HANDLE del DOS:
        PUSH BX
            MOV BX,%Handle%
            XOR AL,AL
            XCHG AL,AH
            ADD BX,AX
            ;Recupera n§_arch del DOS en AX
        POP AX
        MOV [BX],AL
    POP AX
POP BX
RET
        :OPF_EEZ0
        MOV AL,8
        JMP %OPF_Errmen5%
        :OPF_EEZ1
        MOV AL,9
        JMP %OPF_Errmen5%
        :OPF_EEZ3
        MOV AL,7
        JMP %OPF_Errmen5% 
        
       :Opf_Err
       CMP AL,5
       JNG %OPF_Errmen5%
       MOV AL,6
       :OPF_Errmen5 
       cmp al,2
       jnz %OPF_ErrNo2%
    pop ax
    push ax
        cmp al,1
        jz %OPF_Crear% 
        cmp al,2
        jz %OPF_Crear% 
        mov al,2 
        :OPF_ErrNo2
        push dx 
            MOV bx,%OPF_DirErr%
            xor ah,ah
            shl al ,1
            add bx,aX
            mov dx,[bx]
            mov ah,9
            int 21
            mov ah,9
            mov dx,%0a0d%
            int 21
        pop dx
    MOV AX,FFFF
    ;Hago POP porque hice un PUSH AX antes, pero no recupero AX.
    ;Al cambiar AX por FFFF indico un error al programa que llama a la
    ;rutina.
    pop BX
pop BX
ret 
        :OPF_Crear
    pop ax
    push ax
        mov ah,3c
        int 21 
        jc %OPF_ErrCre%
        mov ah,3e
        int 21 
    pop ax
pop bx
JMP %OPFIL%
        :OPF_ERRCRE
        MOV AL,a
        JMP %OPF_ERRMen5%
:OPF_DirErr
DB %OPF_E0%,%OPF_E0%,%OPF_E2%,%OPF_E3%,%OPF_E4%,%OPF_E5%,%OPF_E6%,%OPF_EZ%
DB %OPF_Ez1%,%OPF_Ez1%,%OPF_EC1%
:0a0d
db 0a 0d 24 
:OPF_E0
db "Error 0 o 1$"
:OPF_E2
db "Archivo no encontrado$"
:OPF_E4
db "Rebasado l¡mite de archivos$"
:OPF_E3
db "Ruta no encontrada$"
:OPF_e5 
db "Acceso negado$"
:OPF_e6
db "Error>6$"
;Este es el error 6 del DOS:
;No lo voy a utilizar porque tendr¡a que hacer demasiados cambios en el
;programa.
;:OPF_e6b
;db "N£mero de Arch. del DOS incorrecto$"
:OPF_eZ
db "N£mero de archivo abierto$"
:OPF_ez1 
db "N£mero de archivo incorrecto$" 
:OPF_EC1
db "Error al crear archivo$" 

:Handle
;Espacio para guardar 11 n£meros de archivo.(0-10) 
db 0 0 0 0 0 0 0 0 0 0 0 

:CLFIL
;Cerrar archivo abierto con OPFIL.
;PARAMS:
;AH= n£m_archivo
PUSH BX 
    ;Comprobaci¢n de la validez del primer par metro: N§ Control/Arch. 
    PUSH AX
        ;1: Si es "FF", cierra todos los archivos. 
        CMP Ah,FF
        JZ %CLF_TODOS% 
        ;2: No puede ser mayor de 10 (0Ah). 
        CMP Ah,0a
        JG %CLF_EEZ1%
        ;3: Si est  en uso lo cierra; en caso contrario, sale.
        MOV Bx,%HANDLE%
        PUSH AX
            XCHG AL,AH
            XOR AH,AH
            ADD BX,AX
        POP AX
        CMP by [BX],ff
        JZ %CLF_FIN%
        MOV BL,[BX]
        MOV BH,0
        MOV AH,3E
        INT 21
        :CLF_FIN
    POP AX
POP BX
RET
:CLF_TODOS
MOV AH,0
:CLF_RT
CALL %CLFIL%
INC AH
CMP AH,A
JLE %CLF_RT%
JMP %CLF_FIN%
        :CLF_EEZ1
        ;Utiliza el mensaje de error de OPF.
        ;(hay que ahorrar espacio: s¢lo dispongo de un segmento (64K).
        MOV DX,%OPF_EZ1%
        MOV AH,9
        INT 21
        MOV AX,FFFF
    POP BX
POP BX
RET

:RFIL
;Leer un archivo abierto con OPFIL
;AH= N§ archivo.
;AL=Leer (0)/Escribir (1).
;CX=Longitud.
;DS:DX?/DS:DI?/DOS Data Segment? = Posici¢n de E/S de informaci¢n.
PUSH BX 
    ;Comprobaci¢n de la validez del primer par metro: N§ Control/Arch. 
    PUSH AX
        ;1: No puede ser "FF". 
        CMP Ah,FF
        ;Utilizo las rut. de error de OPF.
        JNZ %RF_NE1%
        JMP %OPF_EEZ0% 
        :RF_NE1
        ;2: No puede ser mayor de 10 (0Ah). 
        CMP Ah,0a
        JLE %RF_NE2%
        JMP %OPF_EEZ1%
        :RF_NE2
        ;3: Ha de estar en uso. 
        MOV Bx,%HANDLE%
        PUSH AX
            XCHG AL,AH
            XOR AH,AH
            ADD BX,AX
        POP AX
        CMP by [BX],ff
        ;Para esto uso un nuevo mensaje de error.
        JZ %RF_EZ3%
        MOV BL,[BX]
        XOR BH,BH
    POP AX
    PUSH AX
        CMP AL,1
        JZ %RF_Escribe%
               MOV AH,3f
        :RF_I21
               ;Evito CY:
                PUSH BX
                    XOR BX,BX
                POP BX
                INT 21
                ;Aprovecho el gestor de errores de OPF para mostrar los
                ;de lectura de archivos.
                JNC %RF_I21_NOE%
                JMP %OPF_Err%
                :RF_I21_NOE
                JMP %RF_FIN%
        :RF_Escribe
            MOV AH,40
            JMP %RF_I21%
        :RF_FIN
    POP BX 
    ;^: Evito "PUSH AX."
POP BX
RET
        :RF_EZ3
        MOV DX,%RFERR%
        MOV AH,9
        INT 21
    MOV AX,FFFF
    POP BX
POP BX
RET
:RFERR
DB "N£mero de archivo no abierto.$"

:buffer1
db 0
#&a (%buffer1% 3c00 +)
:buffer2
db 0
#&a (%buffer2% 3c00 +)
:buffer3
db 0
Este sitio web utiliza cookies. Al utilizar el sitio web, usted acepta almacenar cookies en su computadora. También reconoce que ha leído y entendido nuestra Política de privacidad. Si no está de acuerdo abandone el sitio web.Más información
es/cutressembler/codif.txt · Última modificación: 2014/03/15 10:20 por nepenthes