#################################################################################
# #
# Issue 1 "FDS Journal" 2003' #
# ___________________________ #
# #
# =====@ Crypto + src #
# #
#################################################################################
# #
# ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ #
# ▓▓***-*-*-*-*-*::::::::..................................................▓▓ #
# ▓▓*** Crypt0 *::::::::::.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$▓▓ #
# ▓▓***-*-*-*-*-*::::::::::::..............................................▓▓ #
# ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ #
# #
# [by Scorpio 'n' b3$t_m0w1] #
# #
# Так как данная статья была создана силами двоих людей, всё повествование для #
# удобства будет идти от "Я". #
# Вы когда-нибудь задавали себе вопрос - почему в сети существует так много кр #
# иптоалгоритмов, специальных шифров, целые протоколы, построенные на этом? Я, #
# к примеру, себя спрашивал :) и думал - а какого чёрта по новостям постоянно #
# передают о том как хакнули какой-либо банк или же где-то в Европе произошла #
# какая-то утёчка и поэтому какого-нибудь хаксора закинули в каталажку? Так во #
# т все эти слова как*-* и все эти вопросы приводят в недоумение! Если ты дире #
# ктор банка/фирмы/етс, то какого чёрта ты лезешь в паблик нетворки? Я понимаю #
# сети х.25 - виртуальный канал - один и другой конец, через пад дальше верхне #
# го уровня не влезешь - поставь только грамотный пароль и всё. #
# Но только потом я понимаю, что вся эта индустрия зародилась давным-давном, в #
# сё совершенствовалось - от простого к сложному. Некоторые корпорации вкладыв #
# али бабки миллиардами в разработку различных криптосистем и кроптоалгоритмов #
# . И поэтому никто ни от чего никогда не откажется, так как ему будет очень о #
# бидно за попусту потраченные бабки. #
# Так суть-то в чём? Ну, вообщем мы тут подумали, что всё-таки наш журнал пише #
# тся для большинства, а именно некоторая часть большинства и понятия не имеет #
# о криптографии вообще... Мы, начиная с данной статьи, будем описывать различ #
# ные криптоалгоритмы. Начнём, конечно с самых простейших и постепенно будем н #
# акручивать обороты по мере своих знаний. И чтобы всё было чисто и гладко мы #
# с вами будем их (криптоалгоритмы) здесь же программировать ;). Какой язык вы #
# берем? Assembler и JScript. Первый в силу своей большой значимости сейчас, а #
# второй в силу практического применения [ сегодня столько мини-эксплойтов на #
# скриптах, что диву даёшься ]. Итак поехали. В этом выпуске мы рассмотрим tre #
# несложных алгоритма и приведём на них исходники. #
# #
# 1. Метод простой подстановки. #
# 2. Транспозиция с фиксированным периодом. #
# 3. Реализация шифра Вижинера. #
# #
# 1. Итак для простоты возьмём латинский алфавит. Задача заключается в следующ #
# ем - нужно перемешать все буквы в алфавите и соотвественные буквы в плэин те #
# ксте заменить на них, то есть: #
# #
# [ a b c d e f g h i j k l m n o p q r s t u v w x y z ] меняем на: #
# #
# [ q w e r t y u i o p a s d f g h j k l z x c v b n m ]. В итоге если у нас #
# #
# имеется сообщение вида: #
# #
# secret , то получим при замене "левыми" буквами "левого" алфавита: ltektz #
# ###### ###### #
# #
# Данный алгоритм, конечно, не из стойких и легко "ломается", но для первого з #
# накомства этого вполне достаточно. Да, и ещё следует сказать, что можно брат #
# ь за место алфавита всё что угодно и заменять их чем-угодно (смотря какие в #
# сообщении будут символы). #
# #
# Ок'ей: #
# #
#################################################################################
:: Реализация метода простой подстановки ::
Ок'ей! а ниже следует ассемблерный код Scorpio:
encrypt.asm
masm
model small
.data
msg1 db 0Dh,0Ah,"Enter your phrase, $"
msg2 db 0Dh,0Ah,"Your Encryption text is $"
str1 db "abcdefghijklmnopqrstuvwxyz "
str2 db "qwertyuiopasdfgh klzxcvbnmj"
ptext db 50 dup (0)
etext db 50 dup (0)
.stack 256
.code
main:
mov ax,@data
mov ds,ax
mov dx,offset msg1
mov ah,9h
int 21h
mov cx,50
xor dx,dx
lea si,ptext
ent_sym:
mov ah,1h
int 21h
cmp al,0Dh
jz next
mov [si],al
inc si
inc dl
loop ent_sym
next:
mov cx,dx
xor si,si
next_sym:
mov di,0FFFFh
mov al,ptext[si]
next_ch:
inc di
cmp al,str1[di]
jnz next_ch
mov al,str2[di]
mov etext[si],al
inc si
loop next_sym
mov al,'$'
mov etext[si],al
mov dx,offset msg2
mov ah,9h
int 21h
mov dx,offset etext
int 21h
mov ax,4C00h
int 21h
end main
decrypt.asm
masm
model small
.data
msg1 db 0Dh,0Ah,"Enter your encryption text, $"
msg2 db 0Dh,0Ah,"Your decryption text is $"
str1 db "qwertyuiopasdfgh klzxcvbnmj"
str2 db "abcdefghijklmnopqrstuvwxyz "
ptext db 50 dup (0)
etext db 50 dup (0)
.stack 256
.code
main:
mov ax,@data
mov ds,ax
mov dx,offset msg1
mov ah,9h
int 21h
mov cx,50
xor dx,dx
lea si,ptext
ent_sym:
mov ah,1h
int 21h
cmp al,0Dh
jz next
mov [si],al
inc si
inc dl
loop ent_sym
next:
mov cx,dx
xor si,si
next_sym:
mov di,0FFFFh
mov al,ptext[si]
next_ch:
inc di
cmp al,str1[di]
jnz next_ch
mov al,str2[di]
mov etext[si],al
inc si
loop next_sym
mov al,'$'
mov etext[si],al
mov dx,offset msg2
mov ah,9h
int 21h
mov dx,offset etext
int 21h
mov ax,4C00h
int 21h
end main
#################################################################################
# #
# 2. Едем дальше. Транспозиция с фиксированным периодом. #
# Если реально оценить, то можно увидеть, что данный алгоритм не намного защи #
# щённее своего предыдущего коллеги. Но для того времени, когда был создан да #
# нный алгоритм это была неплохая идея. #
# Итак есть сообщение вида (сразу разобьём его на фиксированные периоды - пуск #
# ай он будет равен пяти): #
# #
# a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] a[11] a[12] ... ... ... #
# ^ ^ ^ ^ ^ ^ #
# | | | | | | #
# |______________________| |_______________________| |_____________________| #
# #
# 1-ый кусок 2-ой кусок 3-ий неполный кусок #
# #
# Всё, на периоды разбили, теперь идея заключается в смешивании символов наших #
# кусков. В третьем куске у нас не хватает 3-х символов :( - ну это нестрашно. #
# Кто сказал, что за эти недостающие символы нельзя взять к примеру пробелы ил #
# и какие-либо левые символы, то есть мусор. #
# Вы думаете, что дешифровка не попрёт? Ошибаетесь ;) - пробелы это нестрашно, #
# а мусор можно будет удалить путём сравнения длины входной и выходной строк. #
# Попробуем с пробелами! А в результате перемешивания получится нечто вроде: #
# #
# a[3] a[2] a[1] a[5] a[4] a[8] a[7] a[6] a[10] a[9] a[12] a[11] ... ... ... #
# ^ ^ ^ ^ ^ ^ #
# | | | | | | #
# |______________________| |_______________________| |_____________________| #
# #
# То есть, если плэин текст: [ top_secret ] #
# Получаем на выходе строку: [ pots_rcete ] #
# #
# Думаю, что основную идею вы поняли! Лет'c гоу то срц: #
# #
#################################################################################
Scorpio's code:
encrypt.asm
masm
model small
.stack 30h
.data
mes1 db 'Enter your text',0Dh,0Ah,'$'
mes2 db 0Dh,0Ah,'Encryption text',0Dh,0Ah,'$'
line1 db 50 dup (0)
line2 db 50 dup (0)
.code
start:
mov ax,@data
mov ds,ax
mov ah,09h
lea dx,mes1
int 21h
mov cx,50
xor si,si
ent_text:
mov ah,01h
int 21h
cmp al,0Dh
jz next
mov line1[si],al
inc si
loop ent_text
next:
mov ax,si
mov dl,5h
div dl
cmp ah,0
jz crypto
sub dl,ah
mov cl,dl
cycl: mov byte ptr line1[si],20h
inc si
loop cycl
crypto: mov cl,al
inc cl
xor si,si
lea di,line2
cycl2: mov al,line1[si]
mov [di+2],al
inc si
mov al,line1[si]
mov [di],al
inc si
mov al,line1[si]
mov [di+4],al
inc si
mov al,line1[si]
mov [di+1],al
inc si
mov al,line1[si]
mov [di+3],al
inc si
add di,05h
loop cycl2
mov byte ptr line2[si],'$'
mov ah,09h
lea dx,mes2
int 21h
mov ah,09h
lea dx,line2
int 21h
mov ax,4c00h
int 21h
end start
end
decrypt.asm
masm
model small
.stack 30h
.data
mes1 db 'Enter your text',0Dh,0Ah,'$'
mes2 db 0Dh,0Ah,'Encryption text',0Dh,0Ah,'$'
line1 db 50 dup (0)
line2 db 50 dup (0)
.code
start:
mov ax,@data
mov ds,ax
mov ah,09h
lea dx,mes1
int 21h
mov cx,50
xor si,si
ent_text:
mov ah,01h
int 21h
cmp al,0Dh
jz next
mov line1[si],al
inc si
loop ent_text
next:
mov ax,si
mov dl,5h
div dl
cmp ah,0
jz crypto
sub dl,ah
mov cl,dl
cycl: mov byte ptr line1[si],20h
inc si
loop cycl
crypto: mov cl,al
inc cl
xor si,si
lea di,line2
cycl2: mov al,line1[si]
mov [di+1],al
inc si
mov al,line1[si]
mov [di+3],al
inc si
mov al,line1[si]
mov [di],al
inc si
mov al,line1[si]
mov [di+4],al
inc si
mov al,line1[si]
mov [di+2],al
inc si
add di,05h
loop cycl2
mov byte ptr line2[si],'$'
mov ah,09h
lea dx,mes2
int 21h
mov ah,09h
lea dx,line2
int 21h
mov ax,4c00h
int 21h
end start
end
:: Транспозиция с фиксированным периодом ::
#################################################################################
# #
# 3. #
# Последний алгоритм, который я рассмотрю, является шифром Вижинера. Данный ш #
# ифр уже более покрепче, чем алгоритмы простой подстановки и транспозиции с #
# фиксированным периодом, но всё равно не слишком ;). #
# Давайте рассмотрим принцип работы? Ок! #
# Итак есть алфавит - латинский к примеру (сразу проиндексируем): #
# #
# ************************************************************* #
# * 0 * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * #
# ************************************************************* #
# * a * b * c * d * e * f * g * h * i * j * k * l * m * n * #
# ************************************************************* #
# #
# ************************************************************* #
# * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * 25 * #
# ************************************************************* #
# * o * p * q * r * s * t * u * v * w * x * y * z * #
# ************************************************************* #
# #
# Допустим имеется открытое сообщение: [ secret ] #
# Теперь давайте зададим какой-либо ключ: [ fds ] #
# #
# Глядя чуть выше, индексируем нашу мессагу и ключ: #
# #
# **************************** ************** #
# * s * e * c * r * e * t * * f * d * s * #
# **************************** ************** #
# * 18 * 4 * 2 * 17 * 4 * 19 * * 5 * 3 * 18 * #
# **************************** ************** #
# #
# Теперь складываем обе строки поиндексно. Но ведь у нас мессага длиннее чем #
# ключ! Как сложим? Нужно продлить ключ до всей длины строки, то есть конкрет #
# ным ключом будет являться: [ fdsfds ]. То есть, так как в плэин тексте 6 си #
# мволов, а в ключе всего лишь 3, то соотвественно два раза прибавляем ключ к #
# ключу. А если бы сообщение было рода: [ yo ], то и ключ бы был: [ fd ]. #
# Значит складываем: #
# #
# s+f=18+5=23 #
# e+d=4+3=7 #
# c+s=20 #
# r+f=22 #
# e+d=7 #
# t+s=37 #
# #
# Теперь по полученным индексам возвращаем наши элементы из латинского алфави #
# та, то есть: #
# #
# 23 == x #
# 7 == h #
# 20 == u #
# 22 == w #
# 7 == h #
# 37 == #
# #
# (37-26, отнимаем 26, так как символа с индексом 37 нету. Такую операцию нуж #
# но производить с каждой большой суммой, полученной в результате сложения ин #
# дексов 2х символов) ==11== l #
# #
# Итог: #
# ключ [fds] #
# плэин [secret] #
# crypt [xhuwhl] #
# #
# Всё, с теоретической частью покончено - теперь можно заняться и практикой: #
# #
#################################################################################
:: Шифр Вижинера ::
Scorpio's code:
encrypt.asm
masm
model small
.stack 10
.data
mes1 db 'Enter your key (max 20)',0Dh,0Ah,'$'
lenkey dw 14h
key db 20 dup (0)
mes2 db 'Enter your phrase (max 80)',0Dh,0Ah,'$'
lenstr dw 50h
string db 80 dup (0)
string1 db 80 dup (0)
mes3 db 0Dh,0Ah,'$'
.code
start:
mov ax,@data
mov ds,ax
mov ah,9
lea dx,mes1
int 21h
xor di,di
mov cx,[lenkey]
mov ah,1
ent: int 21h
cmp al,0dh
jz next
mov key[di],al
inc di
loop ent
next: mov [lenkey],di
mov ah,9
lea dx,mes2
int 21h
mov cx,[lenstr]
xor di,di
mov ah,1
ent1: int 21h
cmp al,0Dh
jz next1
mov string[di],al
inc di
loop ent1
next1: mov [lenstr],di
mov cx,di
xor si,si
xor di,di
next3: mov al,string[si]
mov ah,key[di]
add al,ah
mov string1[si],al
inc di
cmp di,[lenkey]
jnz next2
xor di,di
next2: inc si
loop next3
mov string1[si],'$'
mov ah,9
lea dx,mes3
int 21h
lea dx,string1
int 21h
mov ax,4C00h
int 21h
end start
end
decrypt.asm
masm
model small
.stack 10
.data
mes1 db 'Enter your key (max 20)',0Dh,0Ah,'$'
lenkey dw 14h
key db 20 dup (0)
mes2 db 'Enter your encrypt text (max 80)',0Dh,0Ah,'$'
lenstr dw 50h
string db 80 dup (0)
string1 db 80 dup (0)
mes3 db 0Dh,0Ah,'$'
.code
start:
mov ax,@data
mov ds,ax
mov ah,9
lea dx,mes1
int 21h
xor di,di
mov cx,[lenkey]
mov ah,1
ent: int 21h
cmp al,0dh
jz next
mov key[di],al
inc di
loop ent
next: mov [lenkey],di
mov ah,9
lea dx,mes2
int 21h
mov cx,[lenstr]
xor di,di
mov ah,1
ent1: int 21h
cmp al,0Dh
jz next1
mov string[di],al
inc di
loop ent1
next1: mov [lenstr],di
mov cx,di
xor si,si
xor di,di
next3: mov al,string[si]
mov ah,key[di]
sub al,ah
mov string1[si],al
inc di
cmp di,[lenkey]
jnz next2
xor di,di
next2: inc si
loop next3
mov string1[si],'$'
mov ah,9
lea dx,mes3
int 21h
lea dx,string1
int 21h
mov ax,4C00h
int 21h
end start
end
#################################################################################
# #
# Уфф... Думаем, достаточно для первого раза. Если будет и второй номер нашего #
# журнала, то мы опишем модернизированный шифр Вижинера ака шифр Вижинера с ав #
# тоключом и ещё кое-что бодренькое :) Ок! Постигайте криптографию... #
# #
#################################################################################