Методы и средства защиты информации. Внимание!!! В книге могут встречаться существенные ошибки (в рисунках и формулах). Они не связаны ни со
Скачать 4.86 Mb.
|
Глава 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 431 Продолжение листинга 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 432 Глава 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) + oldplainf$ + 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 433 Продолжение листинга 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 434 Глава 18. Криптографическая защита Продолжение листинга 18.4 last$ = LEFT$(plaintekst$, lf& + 32 - LOF(1)) END IF IF LEN(last$) > 0 THEN PUT$ #2, last$ END IF end if CLOSE LOCATE 11 + rescue%, 32: PRINT "100 % готово ": PRINT IF rescue% THEN PRINT " Попытайтесь другим способом расшифровать этот файл ." ELSE PRINT " Расшифровывание по алгоритму DES завершено ." END IF SYSTEM ' Данные и функции InitialTrl: DATA 58,50,42,34,26,18,10,02,60,52,44,36,28,20,12,04 DATA 62,54,46,38,30,22,14,06,64,56,48,40,32,24,16,08 DATA 57,49,41,33,25,17,09,01,59,51,43,35,27,19,11,03 DATA 61,53,45,37,29,21,13,05,63,55,47,39,31,23,15,07 FinalTrl: DATA 40,08,48,16,56,24,64,32,39,07,47,15,55,23,63,31 DATA 38,06,46,14,54,22,62,30,37,05,45,13,53,21,61,29 DATA 36,04,44,12,52,20,60,28,35,03,43,11,51,19,59,27 DATA 34,02,42,10,50,18,58,26,33,01,41,09,49,17,57,25 swappyl: DATA 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 DATA 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 DATA 01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16 DATA 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 KeyTr1l: DATA 57,49,41,33,25,17,09,01,58,50,42,34,26,18,10,02 DATA 59,51,43,35,27,19,11,03,60,52,44,36 DATA 63,55,47,39,31,23,15,07,62,54,46,38,30,22,14,06 DATA 61,53,45,37,29,21,13,05,28,20,12,04 Стандарт шифрования данных DES 435 Продолжение листинга 18.4 KeyTr2l: DATA 14,17,11,24,01,05,03,28,15,06,21,10,23,19,12,04 DATA 26,08,16,07,27,20,13,02,41,52,31,37,47,55,30,40 DATA 51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32 etrl: DATA 32,01,02,03,04,05,04,05,06,07,08,09,08,09,10,11 DATA 12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21 DATA 22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,01 ptrl: DATA 16,07,20,21,29,12,28,17,01,15,23,26,05,18,31,10 DATA 02,08,24,14,32,27,03,09,19,13,30,06,22,11,04,25 sboxesl: DATA 14,04,13,01,02,15,11,08,03,10,06,12,05,09,00,07 DATA 00,15,07,04,14,02,13,01,10,06,12,11,09,05,03,08 DATA 04,01,14,08,13,06,02,11,15,12,09,07,03,10,05,00 DATA 15,12,08,02,04,09,01,07,05,11,03,14,10,00,06,13 DATA 15,01,08,14,06,11,03,04,09,07,02,13,12,00,05,10 DATA 03,13,04,07,15,02,08,14,12,00,01,10,06,09,11,05 DATA 00,14,07,11,10,04,13,01,05,08,12,06,09,03,02,15 DATA 13,08,10,01,03,15,04,02,11,06,07,12,00,05,14,09 DATA 10,00,09,14,06,03,15,05,01,13,12,07,11,04,02,08 DATA 13,07,00,09,03,04,06,10,02,08,05,14,12,11,15,01 DATA 13,06,04,09,08,15,03,00,11,01,02,12,05,10,14,07 DATA 01,10,13,00,06,09,08,07,04,15,14,03,11,05,02,12 DATA 07,13,14,03,00,06,09,10,01,02,08,05,11,12,04,15 DATA 13,08,11,05,06,15,00,03,04,07,02,12,01,10,14,09 DATA 10,06,09,00,12,11,07,13,15,01,03,14,05,02,08,04 DATA 03,15,00,06,10,01,13,08,09,04,05,11,12,07,02,14 DATA 02,12,04,01,07,10,11,06,08,05,03,15,13,00,14,09 DATA 14,11,02,12,04,07,13,01,05,00,15,10,03,09,08,06 DATA 04,02,01,11,10,13,07,08,15,09,12,05,06,03,00,14 DATA 11,08,12,07,01,14,02,13,06,15,00,09,10,04,05,03 436 Глава 18. Криптографическая защита Продолжение листинга 18.4 DATA 12,01,10,15,09,02,06,08,00,13,03,04,14,07,05,11 DATA 10,15,04,02,07,12,09,05,06,01,13,14,00,11,03,08 DATA 09,14,15,05,02,08,12,03,07,00,04,10,01,13,11,06 DATA 04,03,02,12,09,05,15,10,11,14,01,07,06,00,08,13 DATA 04,11,02,14,15,00,08,13,03,12,09,07,05,10,06,01 DATA 13,00,11,07,04,09,01,10,14,03,05,12,02,15,08,06 DATA 01,04,11,13,12,03,07,14,10,15,06,08,00,05,09,02 DATA 06,11,13,08,01,04,10,07,09,05,00,15,14,02,03,12 DATA 13,02,08,04,06,15,11,01,10,09,03,14,05,00,12,07 DATA 01,15,13,08,10,03,07,04,12,05,06,11,00,14,09,02 DATA 07,11,04,01,09,12,14,02,00,06,10,13,15,03,05,08 DATA 02,01,14,07,04,10,08,13,15,12,09,00,03,05,06,11 rotsl: DATA 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 SUB btos (mbits() AS INTEGER, a$) a$ = "" FOR i% = 1 TO 8 w% = 0 FOR j% = 1 TO 8 w% = w% + ((mbits(((i% - 1) * 8) + j%)) * (2 ^ (8 - j%))) NEXT j% a$ = a$ + CHR$(w%) NEXT i% END SUB FUNCTION desalg$ (a$) temp$ = "": stob a$, ades() transpose ades(), InitialTr(), 64 transpose ades(), swappy(), 64 FOR i% = 16 TO 1 STEP -1 letbe bdes(), ades(), 64 f i%, bdes(), xdes() FOR j% = 1 TO 32 ades(j%) = (bdes(j% + 32) + xdes(j%)) MOD 2 NEXT j% FOR j% = 33 TO 64 ades(j%) = bdes(j% - 32) Стандарт шифрования данных DES 437 Продолжение листинга 18.4 NEXT j% NEXT i% transpose ades(), FinalTr(), 64 btos ades(), temp$ desalg$ = temp$ END FUNCTION SUB f (i%, a() AS INTEGER, x() AS INTEGER) h% = i%: letbe EF(), a(), 64 transpose EF(), etr(), 48 letbe ikeyf(), P2(), 64 transpose ikeyf(), KeyTr2(), 48 FOR j% = 1 TO rots(h%) mrotate P2() NEXT j% FOR j% = 1 TO 48 yf(j%) = (EF(j%) + ikeyf(j%)) MOD 2 NEXT j% FOR k% = 1 TO 8 k6% = 6 * k%: k4% = 4 * k% r% = (32 * yf(k6% - 5)) + (16 * yf(k6%)) + (8 * yf(k6% - 4)) + (4 * yf(k6% - 3)) + (2 * yf(k6% - 2)) + yf(k6% - 1) + 1 x(k4% - 3) = (s(k%, r%) \ 8) MOD 2: x(k4% - 2) = (s(k%, r%) \ 4) MOD 2 x(k4% - 1) = (s(k%, r%) \ 2) MOD 2: x(k4%) = s(k%, r%) MOD 2 NEXT k% transpose x(), ptr(), 32 END SUB SUB init (x() AS INTEGER, n%) FOR i% = 1 TO n% READ x(i%) NEXT i% END SUB SUB letbe (target() AS INTEGER, source() AS INTEGER, last%) FOR il% = 1 TO last% target(il%) = source(il%) NEXT il% END SUB 438 Глава 18. Криптографическая защита Продолжение листинга 18.4 FUNCTION MYBIN$ (n%) STS$ = "" p% = n% FOR i% = 1 TO 8 IF (p% MOD 2) THEN ST$ = "1" + ST$ ELSE ST$ = "0" + ST$ END IF p% = p% \ 2 NEXT i% MYBIN$ = ST$ END FUNCTION SUB mrotate (keyr() AS INTEGER) letbe XR(), keyr(), 56 FOR ir% = 56 TO 2 STEP -1 XR(ir%) = XR(ir% - 1) NEXT ir% XR(1) = keyr(28): XR(29) = keyr(56) letbe keyr(), XR(), 56 END SUB SUB sboxinit (b() AS INTEGER) RESTORE sboxesl FOR i% = 1 TO 8 FOR j% = 1 TO 64 READ b(i%, j%) NEXT j% NEXT i% END SUB SUB stob (a$, mbits() AS INTEGER) FOR i% = 1 TO 8 b$ = MYBIN$(ASC(MID$(a$, i%, 1))) FOR j% = 1 TO 8 mbits(((i% - 1) * 8) + j%) = ASC(MID$(b$, j%, 1)) - 48 NEXT j% NEXT i% END SUB Стандарт шифрования данных DES 439 Продолжение листинга 18.4 SUB transpose (datax() AS INTEGER, T() AS INTEGER, nt%) letbe XT(), datax(), 64 FOR i% = 1 TO nt% datax(i%) = XT(T(i%)) NEXT i% END SUB SUB xtob (a$, mbits() AS INTEGER) LOCAL X$,NIBBLE$ FOR i% = 1 to 16 X$ = MID$(a$,i%,1) SELECT CASE X$ CASE "0" NIBBLE$ = "0000" CASE "1" NIBBLE$ = "0001" CASE "2" NIBBLE$ = "0010" CASE "3" NIBBLE$ = "0011" CASE "4" NIBBLE$ = "0100" CASE "5" NIBBLE$ = "0101" CASE "6" NIBBLE$ = "0110" CASE "7" NIBBLE$ = "0111" CASE "8" NIBBLE$ = "1000" CASE "9" NIBBLE$ = "1001" CASE "A" NIBBLE$ = "1010" CASE "B" NIBBLE$ = "1011" CASE "C" NIBBLE$ = "1100" CASE "D" NIBBLE$ = "1101" CASE "E" 440 Глава 18. Криптографическая защита Окончание листинга 18.4 NIBBLE$ = "1110" CASE "F" NIBBLE$ = "1111" CASE ELSE Print " Не является 16- ричным значением !" SYSTEM END SELECT FOR j% = 1 to 4 mbits(((i% - 1) * 4) + j%) = ASC(MID$(NIBBLE$, j%, 1)) - 48 NEXT j% NEXT i% END SUB Другие режимы использования алгоритма шифрования DES Помимо режима ECB, алгоритм DES может использоваться в режиме сцеп - ления блоков шифртекста ( СВС — С i р h ег В 1 ос k Chaining). Суть этого режима состоит в том , что сообщение разбивается на блоки по 64 бит , и их последова - тельность зашифровывается Перед шифрованием ( в режиме ЕСВ ), блок откры - того текста поразрядно складывается с предыдущим блоком шифртекста Для шифрования первого блока шифртекста требуется так называемый вектор ини - циализации (IV — initialization vector). Последний не является секретным Данный режим не позволяет накапливаться ошибкам при передаче , поскольку ошибка при передаче приведет к потере только двух блоков исходного текста Кроме ECB и CBC, существуют также режимы шифрования с обратной связью ( С F В — С i р h е r F ее db аск ) и шифрования с внешней обратной связью ( О F В — Output F ее db аск ). Стандарт криптографического преобразования данных ГОСТ 28147-89 Стандарт криптографического преобразования данных ГОСТ 28147-89 реко - мендован к использованию для защиты любых данных , представленных в виде двоичного кода Данный стандарт формировался с учетом мирового опыта , и в частности , при его разработке были приняты во внимание недостатки алгоритма DES. Стандарт довольно сложен , поэтому приведем лишь его концептуальное описание Алгоритм криптографического преобразования , установленный ГОСТ 28147- 89 ( далее — ГОСТ ) используется для шифрования данных в двух режимах , а также для выработки имитовставки , которая является средством контроля це - лостности данных и зависит от ключей При шифровании алгоритм ГОСТ сво - дится к шифру гаммирования Блок гаммы представляет собой 64- битовую ком - Стандарт криптографического преобразования данных ГОСТ 28147-89 441 бинацию , состоящую из двух последовательных 32- битовых блоков Исходя из удобства изложения , далее будем называть любой 64- битовый блок комбинаци - ей , а также считать , что блок состоит их двух сцепленных подблоков из 32- х би - тов каждый Гамма накладывается поразрядно по модулю 2. Каждая комбинация гаммы представляет собой результат шифрпреобразования с помощью шифра простой замены на множестве 64- битовых комбинаций Входные комбинации для указан - ного шифра , в общем случае , формируются в зависимости от ключей , псевдо - случайного открытого параметра S ( синхропосылка ), известных констант с 1 , c 2 и предыдущего блока шифртекста Фактически задача каждого из режимов шиф - рования — это формирование 64- битовых комбинаций для входа в основной ре - жим работы ГОСТ , называемый режимом простой замены По сути , ключи не - обходимы для работы ГОСТ именно в этом режиме Комбинация гаммы являет - ся результатом работы алгоритма в режиме простой замены Алгоритм ГОСТ в качестве исходных данных использует три параметра : K , X и Z — 64- битовый блок данных Первый параметр является долговременным , а второй — сеансовым ключом Параметры независимы и имеют размер 512, 256 и 64 бита соответственно K представляет собой отображение множества блоков в себя Это отображение реализует потетрадную замену 32- разрядных блоков в 32- х разрядные и состоит из 8 подключей . Подключ K i ( i = 1, …, 8 ), входящий в K , является таблицей заме - ны для i-той ( слева ) тетрады , т е состоит из 16 тетрад В стандарте ключ K назы - вается блоком подстановки , а подключи K — узлами замены Сеансовый ключ X состоит из восьми 32- разрядных подключей X i , каждый из которых в соответствующий момент используется для суммирования с некото - рым блоком по модулю 2. Режим простой замены алгоритма ГОСТ реализован в виде шифра Файстеля Шифрование блока открытого текста Z алгоритмом ГОСТ производится за 32 цикла На каждом цикле происходит преобразование входной комбинации в вы - ходную Шифртекстом является результат работы ( выход ) тридцать второго цикла , подвергнутый очень простому дополнительному преобразованию Процесс шифрования в режиме простой замены ( рис . , который обозначим через T = ГОСТ(S) можно представить в виде последовательности 34 блоков u = (U –2 , U –1 , U 0 , U 1 , U 2 , …, U 30 , U 31 ) , где U -1 ||U 0 = S и U 31 ||U 30 = T Здесь U -1 ||U 0 — результат работы цикла 0 , U 0 ||U 1 — результат работы цикла 1 и т д до U 31 ||U 30 — результата работы цикла 31 Дополнительное преобразова - ние меняет порядок следования блоков : U 31 ||U 30 = T На цикле i используется подключ X t(i) При шифровании используется сле - дующая последовательность выбора подключей от начального и до последнего цикла : t(i) = {0,1,2,3,4,5,6,7; 0,1,2,3,4,5,6,7; 0,1,2,3,4,5,6,7; 7,6,5,4,3,2,1,0} |