DIM ades(1 TO 64) AS shared INTEGER
DIM bdes(1 TO 64) AS shared INTEGER
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
Plainf$ = LTRIM$(RTRIM$(LEFT$(parm$, INSTR(parm$, " "))))
PRINT "Исходный файл: "; Plainf$
ELSE
INPUT "Исходный файл: ", plainf$
END IF
if len(plainf$)=0 then
print: print "СБОЙ: введите имя файла!"
system
end if
OPEN plainf$ FOR RANDOM AS 1
lof1& = LOF(1)
IF lof1& = 0 THEN
CLOSE #1
KILL plainf$
PRINT: PRINT "Файл не найден!";
SYSTEM
ELSE
IF lof1& > 9999999 THEN PRINT: PRINT "Исходный файл слишком велик!": SYSTEM
CLOSE #1
OPEN plainf$ for binary access read as #1
END IF
cipherf$ = ""
sp0% = 0: sp% = 0
DO
sp0% = sp%
sp% = INSTR(sp% + 1, plainf$, "\")
Продолжение листинга 18.3
LOOP WHILE sp% > 0
bplainf$ = RIGHT$(plainf$, LEN(plainf$) - (sp0%))
PRINT "Сохраняемое имя файла: "; bplainf$
pp% = INSTR(sp0% + 1, plainf$, ".")
IF pp% = 0 THEN
dcipherf$ = plainf$ + ".DES"
ELSE
dcipherf$ = LEFT$(plainf$, pp% - 1) + ".DES"
END IF
PRINT " По умолчанию: "; dcipherf$
INPUT "Выходной файл: ", cipherf$
IF cipherf$ = "" THEN cipherf$ = dcipherf$
OPEN cipherf$ FOR RANDOM AS 2
IF LOF(2) > 0 THEN
CLOSE #2
PRINT: PRINT "Выходной файл уже существует!"
SYSTEM
ELSE
CLOSE #2
OPEN cipherf$ FOR binary AS 2
END IF
PW$ = ""
LOCATE 9, 1
INPUT; " Пароль: ", PW$
|
|
IF (LEN(PW$) < 8) THEN PW$ = PW$ + STRING$(8 - LEN(PW$), 0)
IF len(pw$) = 16 then
LOCATE 9, 8: PRINT "Пароль: "; STRING$(16, 15); STRING$(10, " ")
PW$ = ucase$(PW$)
xtob PW$, P2()
ELSE
LOCATE 9, 8: PRINT "Пароль: "; STRING$(8, 15); STRING$(10, " ")
PW$ = LEFT$(PW$, 8)
stob PW$, P2()
end IF
Продолжение листинга 18.3
transpose P2(), KeyTr1(), 56
ciphertekst$ = ""
blocks& = lof1& \ 256
w = RND(-INT(TIMER))
anything$ = ""
FOR i% = 1 TO 12
anything$ = anything$ + CHR$(128 + INT(127 * RND(1)))
NEXT i%
header$ = "#" + LTRIM$(STR$(lof1&))
header$ = "DES" + LEFT$(anything$, 8 - LEN(header$)) + header$
header$ = header$ + RIGHT$(anything$, 12 - LEN(bplainf$)) +
"#" + bplainf$
cheader$=desalg$(left$(header$,8))+desalg$(MID$(header$,9,8))+desalg$(right$(header$,8))
put$ #2, cheader$
LOCATE 10, 8: PRINT; "Шифрование: 0 %";
inblock$=space$(256)
FOR n& = 1 TO blocks&
get$ #1,256,inblock$
outblock$=""
for b%=1 to 256 step 8
outblock$ = outblock$+desalg$(mid$(inblock$,b%,8))
next
Put$ #2, outblock$
LOCATE 10, 19: PRINT; USING "###"; (n& / blocks&) * 100;
NEXT n&
rest1 = lof1& MOD 256
rest2 = lof1& MOD 8
rest = rest1-rest2
IF rest1 > 0 THEN
outblock$=""
get$ #1,rest1,inblock$