Первый файл ____________________________________ _____________________________________ _____________________________________ ______________________________________ Открыть-закрыть файл name cripto title --- пример чтения из файла и записи в файл дискриптор ;чтение производится из файла FILEOLD.TXT который ;должен быть в том же каталоге где cripto.exe ; RECSIZE EQU 1024 ; Размер записи в файле CODE SEGMENT ASSUME CS:CODE, DS:DATA1 ;позволяет в дальнейшем не указывать префикс MAIN : MOV AX,DATA1 ;сделаем наш сегмент данных MOV DS,AX ;адресуемым ... MOV AH,3DH ; открыть файл MOV AL,0 ;только для чтения MOV DX, OFFSET F1 ; имя входного файла INT 21H ; переход в MS-DOS JC ERROR ; если ошибка MOV HANDLE1,AX ; сохранить дискриптор файла MOV AH, 3CH ; открыть выходной MOV CX,0 ; обычный MOV DX, OFFSET F2 ; имя выходного файла INT 21H ; переход в MS-DOS JC ERROR ; если ошибка MOV HANDLE2,AX ; сохранить дискриптор файла NEXT: MOV AH,3FH ; ввод в буфер (см программу ввода с клавиатуры) MOV BX,HANDLE1 ; устройство откуда приходят данные MOV CX,RECSIZE ; сколько данных MOV DX,OFFSET BUFFER ; адрес буфера, куда помещаются данные INT 21H ; JC ERROR ; если ошибка OR AX,AX ; обнулить флаги JZ FILE_END ; если достигнут конец файла MOV AH,40H ;вывод на устройство (см программу вывода на экран) MOV BX,HANDLE2 ; номер устройства для вывода MOV CX,RECSIZE ; сколько данных выводить MOV DX,OFFSET BUFFER ; адрес буфера , откуда брать данные INT 21H JC ERROR ; если ошибка CMP AX,RECSIZE ; размер считанного совпадает с записью ? JMP NEXT ; FILE_END: MOV AH,3EH ; закроем входной файл MOV BX,HANDLE1 ; INT 21H ; MOV AH,3EH ; закроем выходной файл MOV BX,HANDLE2 ; INT 21H ; JMP FINISH ; ERROR: ; ;здесь обрабатываются ошибки ; FINISH: MOV AX,4C00H ; означает, что код завершения =0 INT 21H ; переход в MS-DOS CODE ENDS DATA1 SEGMENT F1 DB 'FILEOLD.TXT',0 F2 DB 'FILENEW.TXT',0 HANDLE1 DW 0 HANDLE2 DW 0 BUFFER DB RECSIZE DUP (?) ;буфер для работы DATA1 ENDS END MAIN ;точка входа в программу метка MAIN Второй : алгоритм шифрования TEA ___________________________________ ____________________________________ _________________________________________ ___________________________________ ; FOR MS WINDOWS ; ; ; ;---; ; BUFFER TO ENCRYPT -> EDX ; ; KEY TO ENCRYPT -> EAX ; ; SIZE OF BUFFER (div 4 = 0) -> ECX ; ;---; total_encrypt: pusha ; Сохраняем всё в стеке mov esi,eax ; Кладём в esi - eax mov edi,edx ; Кладём в edi - edx work__: pusha ; Сохраняем всё в стеке call Encrypt ; Шифруем первые 64 бита данных popa ; Восстанавливаем из стека add edi,8 ; Добавляем к edi - 8 sub ecx,7 ; Отнимаем от ecx - 7 loop work__ ; Продолжаем шифровать popa ; Восстанавливаем из стека ret ; Возврат из подпрограммы ;---; ; BUFFER TO DECRYPT -> EDX ; ; KEY TO DECRYPT -> EAX ; ; SIZE OF BUFFER (div 4 = 0) -> ECX ; ;---; total_decrypt: pusha ; Сохраняем всё в стеке mov esi,eax ; Кладём в esi - eax mov edi,edx ; Кладём в edi - edx work2__: pusha ; Сохраняем всё в стеке call decrypt ; Шифруем первые 64 бита данных popa ; Восстанавливаем из стека add edi,8 ; Добавляем к edi - 8 sub ecx,7 ; Отнимаем от ecx - 7 loop work2__ ; Продолжаем шифровать popa ; Восстанавливаем из стека ret ; Возврат из подпрограммы ;---; Encrypt: push edi ; Сохраняем edi в стэке mov ebx,v0 ; Кладём в ebx первые 32 бита данных mov ecx,v1 ; В ecx кладём вторые 32 бита данных xor eax,eax ; Обнуляем eax mov edx,9e3779b9h ; В edx -> sqr(5)-1 * 2^31 mov edi,32 ; Кладём в edi - 32 ELoopR: add eax,edx ; Добавляем к eax - edx mov ebp,ecx ; Кладём в ebp - ecx shl ebp,4 ; Сдвиг ebp на 4 бита влево add ebx,ebp ; Добавляем к ebx - ebp mov ebp,k0 ; Кладём в ebx первые 32 бита ключа xor ebp,ecx ; XOR'им их вторыми 32 битами данных add ebx,ebp ; Добавляем к 1-и 32 битам данных р-т mov ebp,ecx ; Кладём в ebp - ecx shr ebp,5 ; Делим ebp на 32 xor ebp,eax ; XOR'им ebp - eax'ом add ebx,ebp ; Добавляем к ebx - ebp add ebx,k1 ; Добавляем к ebx - 2-е 32 бита ключа ; mov ebp,ebx ; Кладём в ebp - ebx shl ebp,4 ; Сдвиг ebp на 4 бита влево add ecx,ebp ; Добавляем к ecx - ebp mov ebp,k2 ; Кладём в ebp 3-и 32 бита ключа xor ebp,ebx ; XOR'им ebp - ebx'ом add ecx,ebp ; Добавляем к ecx - ebp mov ebp,ebx ; Кладём в ebp - ebx shr ebp,5 ; Сдвиг ebp вправо на 5 бит xor ebp,eax ; XOR'им ebp - eax'ом add ecx,ebp ; Добавляем к ecx - ebp add ecx,k3 ; Добавляем к ecx - 4-е 32 бита ключа dec edi ; Уменьшаем edi на единицу jnz ELoopR ; Шифруем дальше pop edi ; Вынимаем из стека edi mov v0,ebx ; Кладём результаты шифрования mov v1,ecx ; В отведённое для них место ret ; Возврат из подпрограммы ;---; Decrypt: push edi ; Сохраняем edi в стэке mov ebx,v0 ; Кладём в ebx первые 32 бита данных mov ecx,v1 ; В ecx кладём вторые 32 бита данных mov edx,9e3779b9h ; В edx -> sqr(5)-1 * 2^31 mov eax,edx ; Кладём в eax - edx shl eax,5 ; Сдвиг eax в лево на 5 бит mov edi,32 ; Кладём в edi - 32 DLoopR: mov ebp,ebx ; Кладём в ebp - ebx shl ebp,4 ; Сдвиг ebp на 4 бита влево sub ecx,ebp ; Отнимаем от ecx - ebp mov ebp,k2 ; Кладём в ebp 3-и 32 бита ключа xor ebp,ebx ; XOR'им ebp - ebx'ом sub ecx,ebp ; Отнимаем от ecx - ebp mov ebp,ebx ; Кладём в ebp - ebx shr ebp,5 ; Сдвиг ebp вправо на 5 бит xor ebp,eax ; XOR'им ebp - eax'ом sub ecx,ebp ; Отнимаем от ecx - ebp sub ecx,k3 ; Отнимаем от ecx - 4-е 32 бита ключа ; mov ebp,ecx ; Кладём в ebp - ecx shl ebp,4 ; Сдвиг ebp на 4 бита влево sub ebx,ebp ; Отнимаем от ebx - ebp mov ebp,k0 ; Кладём в ebx первые 32 бита ключа xor ebp,ecx ; XOR'им ebp - eсx'ом sub ebx,ebp ; Отнимаем от ebx - ebp mov ebp,ecx ; Кладём в ebp - ecx shr ebp,5 ; Сдвиг ebp вправо на 5 бит xor ebp,eax ; XOR'им ebp - eax'ом sub ebx,ebp ; Отнимаем от ebx - ebp sub ebx,k1 ; Отнимаем от ebx - 2-е 32 бита ключа sub eax,edx ; Отнимаем от eax - edx dec edi ; Уменьшаем edi на единицу jnz DLoopR ; Дешифруем дальше pop edi ; Вынимаем из стека edi mov v0,ebx ; Кладём результаты шифрования mov v1,ecx ; В отведённое для них место ret ; Возврат из подпрограммы ;---; v0 equ dword ptr [edi] v1 equ dword ptr [edi+4] k0 equ dword ptr [esi] k1 equ dword ptr [esi+4] k2 equ dword ptr [esi+8] k3 equ dword ptr [esi+12] ;-8<---[tea_128.asm]---8<-;