ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.06.2021
Просмотров: 3554
Скачиваний: 3
Стандарт
шифрования
данных
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
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, " ")
Стандарт
шифрования
данных
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
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$
Стандарт
шифрования
данных
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