Interested Article - Шифр Бофора
![](/images/007/670/7670478/1.jpg?rand=532055)
![](https://cdn.wafarin.com/avatars/e138a894a90e463ca0157ab708db5256.gif)
- 2021-04-04
- 1
Шифр Бофорта — полиалфавитный подстановочный шифр , созданный сэром Фрэнсисом Бофортом . Шифр похож на шифр Виженера , со слегка измененным механизмом шифрования и использованием tabula recta (также известная как таблица Виженера). Применялся в роторной шифровальной машине M-209 .
Описание
Ключ
Длина ключа ( K ) должна быть равной длине исходного текста. Для этого циклически записывают ключевое слово до тех пор, пока его длина не будет соответствовать длине исходного текста.
Шифрование
![](/images/007/670/7670478/1.jpg?rand=259730)
Для того чтобы зашифровать открытый текст ( M ) с использованием ключа ( K ) нужно:
- Взять n -ый символ открытого текста ( m n , где 0≤n<количество символов ключа);
- Найти столбец ( j ) где символ в первой строке равен m n ( s 1 j = m n );
- Найти строку ( i ) где символ в j -ом столбце равен k n ( s i j = k n , где k n - n -ый символ ключа);
- Добавить к шифротексту ( C ) символ 1-го столбца i -ой строки ( с n = s i 1 ).
Дешифрирование
Для того чтобы дешифрировать шифротекст ( C ) с использованием ключа ( K ) нужно:
- Взять n -ый символ шифротекста ( c n , где 0≤n<количество символов C );
- Найти строку ( i ) где символ в 1-м столбце равен c n ( s i 1 = c n );
- Найти столбец ( j ) где символ в i -ой строке равен k n ( s i j = k n , где k n - n -ый символ ключа);
- Добавить к расшифрованному тексту ( M ) символ 1-й строки j -го столбца ( m n = s 1 j ).
Пример
Пусть дан исходный текст:
C
= "HELLOWORLD"
и ключ:
K
= "KEY"
Ключ
Длина клера - 10 символов, значит и длина ключа также должна равнятся 10 символам.
K
= "KEYKEYKEYK"
Шифрование
- m 1 = "H".
- j = 8
- i = 4
-
c
1
= s
4 1
= "D"
C += "D" (C = "D") - m 2 = "E"
- j = 5
- i = 1
-
c
2
= s
1 1
= "A"
C += "A" (C = "DA")
. . . . . . . . .
- m 10 = "D"
- j = 4
- i = 8
-
c
10
= s
8 1
= "H"
C += "H" (C = "DANZQCWNNH")
Шифротекст ( C ) - "DANZQCWNNH"
Дешифрирование
- c 1 = "D".
- i = 4
- j = 8
-
m
1
= s
1 8
= "H"
M += "D" (M = "H") - c 2 = "A"
- i = 1
- j = 5
-
m
2
= s
1 5
= "E"
M += "E" (M = "HE")
. . . . . . . . .
- c 10 = "H"
- i = 8
- j= 4
-
c
10
= s
1 4
= "D"
M += "H" (M = "HELLOWORLD")
Дешифрованный текст ( M ) - "HELLOWORLD"
Реализация
Python
m = "HELLOWORLD"
k = "KEY"
k = (k*(len(m))+k)[:len(m)] # подгоняем ключ
c = ''.join([chr(((ord(k[i]) - ord(m[i])) % 26)+ord("A")) for i in xrange(len(m))]) # шифруем
print c # выдаст DANZQCWNNH
e = ''.join([chr(((ord(k[i]) - ord(c[i])) % 26)+ord("A")) for i in xrange(len(c))]) # дешифруем
print e # выдаст HELLOWORLD
JavaScript
var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //задаём строку алфавита
var m = "HELLOWORLD";
var k = "KEY";
for(i=k.length, j=0; i<m.length; i++, j++){k += k[ ( ( i + j ) % k.length ) ]; } // # подгоняем ключ
function encrypt(m,k){
c = '';
for(i=0; i<m.length; i++){ // шифруем
c += a[ ( ( ( a.length + a.indexOf( k[i] ) - a.indexOf( m[i] ) ) % a.length ) ) ]; //посимвольно
}
return c;
}
//Можно скопировать и вставить этот код - в консоль браузера.
console.log('cypher = ', encrypt(m,k)); //# выдаст DANZQCWNNH
console.log('decrypted = ', encrypt(encrypt(m,k),k)); //# выдаст HELLOWORLD
![](https://cdn.wafarin.com/avatars/e138a894a90e463ca0157ab708db5256.gif)
- 2021-04-04
- 1