#################################################################################
#                                                                               #
#                            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

#################################################################################
#                                                                               #
# Уфф... Думаем, достаточно для первого раза. Если будет и второй номер нашего  #
# журнала, то мы опишем модернизированный шифр Вижинера ака шифр Вижинера с ав  #
# тоключом и ещё кое-что бодренькое :) Ок! Постигайте криптографию...           #
#                                                                               #
#################################################################################