ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.06.2021

Просмотров: 3554

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Стандарт

 

шифрования

 

данных

 DES     

411

 

Продолжение

 

листинга

 18.4

 

DIM InitialTr(1 TO 64) AS shared INTEGER 
init InitialTr(), 64 
 
RESTORE FinalTrl 
DIM FinalTr(1 TO 64) AS shared INTEGER 
init FinalTr(), 64 
 
RESTORE swappyl 
DIM swappy(1 TO 64) AS shared INTEGER 
init swappy(), 64 
 
RESTORE KeyTr1l 
DIM KeyTr1(1 TO 56) AS shared INTEGER 
init KeyTr1(), 56 
 
RESTORE KeyTr2l 
DIM KeyTr2(1 TO 48) AS shared INTEGER 
init KeyTr2(), 48 
 
RESTORE etrl 
DIM etr(1 TO 48) AS shared INTEGER 
init etr(), 48 
 
RESTORE ptrl 
DIM ptr(1 TO 32) AS shared INTEGER 
init ptr(), 32 
 
sboxinit s() 
 
RESTORE rotsl 
DIM rots(1 TO 16) AS shared INTEGER 
init rots(), 16 
 
DIM XR(1 TO 56) AS shared INTEGER 
 
DIM EF(1 TO 64) AS shared INTEGER 
DIM ikeyf(1 TO 64) AS shared INTEGER 
DIM yf(1 TO 64) AS shared INTEGER 
 
DIM ades(1 TO 64) AS shared INTEGER 
DIM bdes(1 TO 64) AS shared INTEGER 


background image

412

     

Глава

 18. 

Криптографическая

 

защита

 

 

Продолжение

 

листинга

 18.4

 

DIM xdes(1 TO 64) AS shared INTEGER 
 
DIM XT(1 TO 64)   AS shared INTEGER 
 
DIM P2(1 TO 64) AS shared INTEGER 
 
main: 
CLS 
parm$ = ltrim$(rtrim$(COMMAND$))+" " 
IF LEN(parm$) > 1 THEN 
 cipherf$ = LTRIM$(RTRIM$(LEFT$(parm$, INSTR(parm$, " ")))) 
 PRINT "

Имя

  

зашифрованного

 

файла

 : "; cipherf$ 

ELSE 
 INPUT "

Имя

 

расшифрованного

 

файла

 : ", cipherf$ 

END IF 
if len(cipherf$)=0 then 
 print : print "

СБОЙ

введите

 

имя

 

файла

!" 

 system 
end if 
OPEN cipherf$ FOR RANDOM AS 1 
lof1& = LOF(1) 
IF lof1& = 0 THEN 
 CLOSE #1 
 KILL cipherf$ 
 PRINT : PRINT "

Файл

 

не

 

найден

!"; 

 SYSTEM 
ELSE 
 CLOSE #1 
 OPEN cipherf$ for binary access read as #1 
END IF 
 
PW$ = "" 
LOCATE 6, 1 
INPUT "                    

Пароль

 : ", PW$ 

 
IF (LEN(PW$) < 8) THEN PW$ = PW$ + STRING$(8 - LEN(PW$), 0) 
 
IF len(pw$) = 16 then 
 
   LOCATE 6, 1: PRINT "                    

Пароль

 : ";  

   STRING$(16, 15); STRING$(10, " ") 


background image

Стандарт

 

шифрования

 

данных

 DES     

413

 

Продолжение

 

листинга

 18.4

 

    PW$ = ucase$(PW$)         
    xtob PW$, P2()            
ELSE 
   LOCATE 6, 1: PRINT "                     

Пароль

 : ";  

   STRING$(8, 15); STRING$(10, " ") 
   PW$ = LEFT$(PW$, 8) 
   stob PW$, P2() 
END IF 
        
PRINT "            

Проверка

 

пароля

 : "; 

transpose P2(), KeyTr1(), 56 
get$ #1,24,cheader$ 
header$ = desalg$(LEFT$(cheader$, 8)) 
IF NOT (LEFT$(header$, 3) = "DES") THEN 
 PRINT "

Неверен

!": PRINT : PRINT "

Неправильный

 

пароль

 

или

 ";  

       cipherf$; " 

не

 

является

 

зашифрованным

 

файлом

!" 

 SYSTEM 
ELSE 
 PRINT "

Верен

!" 

END IF 
 
PRINT "       

Проверка

 

длины

 

файла

 :"; 

header$ = header$ + desalg$(MID$(cheader$, 9, 8)) 
header$ = header$ + desalg$(RIGHT$(cheader$, 8)) 
pl% = INSTR(header$, "#") 
le$ = MID$(header$, pl% + 1, (11 - pl%)) 
lf& = VAL(le$) 
ev& = lf& + 24 
IF (ev& MOD 8) THEN ev& = ev& + 8 - (ev& MOD 8) 
rescue% = 0 
IF (ev& <> lof1&) THEN 
 PRINT "

Неверна

!! (

возможна

 

потеря

 

данных

)" 

 PRINT "     

Длина

 

исходного

 

файла

 :"; lf& 

 PRINT "    

Длина

 

указанного

 

файла

 :"; lof1& 

 PRINT "   

Длина

 

файла

 

должна

 

быть

 :"; ev& 

 INPUT ; "

Попытаться

 

восстановить

? (y/n) : ", q$:  

         IF (INSTR(q$, "N") OR (INSTR(q$, "n"))) THEN SYSTEM 
 rescue% = 4: PRINT 
ELSE 
 PRINT lf&; ", 

Верна

!" 

END IF 


background image

414

     

Глава

 18. 

Криптографическая

 

защита

 

 

Продолжение

 

листинга

 18.4

 

pl% = INSTR(12, header$, "#") 
oldplainf$ = RIGHT$(header$, 24 - pl%) 
PRINT "        

Имя

 

исходного

 

файла

 : "; oldplainf$; 

OPEN oldplainf$ FOR RANDOM AS 2 
IF INSTR(oldplainf$, ".") THEN 
 PRINT " ([*.*] "; 
ELSE 
 PRINT " ([*] "; 
END IF 
IF LOF(2) > 0 THEN PRINT "

уже

 

есть

 

в

 

каталоге

"; 

PRINT ")" 
CLOSE #2 
plainf$ = "" 
INPUT "        

Имя

 

выходного

 

файла

 : ", plainf$ 

IF plainf$ = "" THEN plainf$ = oldplainf$ 
plainf$ = RTRIM$(LTRIM$(plainf$)) 
IF INSTR(plainf$, "*.") THEN 
 IF INSTR(oldplainf$, ".") THEN 
  plainf$ = LEFT$(plainf$, INSTR(plainf$, "*.") - 1) + 
LEFT$(oldplainf$, INSTR(oldplainf$, ".")) + RIGHT$(plainf$, 
LEN(plainf$) - INSTR(plainf$, "*.") - 1) 
 ELSE 
  plainf$ = LEFT$(plainf$, INSTR(plainf$, "*.") - 1) + old-
plainf$ + RIGHT$(plainf$, LEN(plainf$) - INSTR(plainf$, "*.")) 
 END IF 
END IF 
IF (RIGHT$(plainf$, 1) = "*") THEN 
 IF plainf$ = "*" THEN 
  plainf$ = oldplainf$ 
 ELSE 
  IF (MID$(plainf$, LEN(plainf$) - 1, 1) = ".") THEN 
   plainf$ = LEFT$(plainf$, INSTR(plainf$, ".") - 1) +  
             RIGHT$(oldplainf$, LEN(oldplainf$) -  
             INSTR(oldplainf$, ".") + 1) 
  ELSE 
   plainf$ = LEFT$(plainf$, LEN(plainf$) - 1) + oldplainf$ 
  END IF 
 END IF 
END IF 
IF RIGHT$(plainf$, 1) = "\" THEN plainf$ = plainf$ + oldplainf$ 
 


background image

Стандарт

 

шифрования

 

данных

 DES     

415

 

Продолжение

 

листинга

 18.4

 

OPEN plainf$ FOR RANDOM AS 2 
IF LOF(2) > 0 THEN 
 CLOSE #2 
 PRINT : PRINT "

Уже

 

есть

 

файл

 

с

 

таким

 

именем

!" 

 SYSTEM 
ELSE 
 CLOSE #2 
 OPEN plainf$ FOR BINARY AS 2 
END IF 
 
plaintekst$ = "" 
blocks& = (LOF(1) \ 8) - 3 
 
LOCATE rescue% + 11, 21: PRINT ; "

Расшифровывание

 :   0 %"; 

 
bigblocks&=(blocks&-1) \ 32 
large$=space$(256) 
FOR m& = 1 TO bigblocks& 
  outblock$="" 
  get$ #1,256,large$ 
  for o%=1 to 256 step 8 
   outblock$=outblock$+desalg$(mid$(large$,o%,8)) 
  next 
  put$ #2,outblock$ 
  LOCATE rescue% + 11, 32: PRINT ; USING "###"; (m& / 
(bigblocks&+1)) * 100; 
next 
 
FOR n& = (bigblocks&*32)+1 TO blocks& - 1 
 GET$ #1,8,ciphertekst$ 
 plaintekst$ = desalg$(ciphertekst$) 
 PUT$ #2, plaintekst$ 
 LOCATE rescue% + 11, 32: PRINT ; USING "###"; (n& / blocks&) * 
100; 
NEXT n& 
get$ #1,8,ciphertekst$ 
if len(ciphertekst$) > 0 then 
   plaintekst$ = desalg$(ciphertekst$) 
   IF rescue% THEN 
     last$ = plaintekst$ 
   ELSE