Шифр Бофора (Onsj >kskjg)
Шифр Бофорта — полиалфавитный подстановочный шифр, созданный сэром Фрэнсисом Бофортом. Шифр похож на шифр Виженера, со слегка измененным механизмом шифрования и использованием tabula recta (также известная как таблица Виженера). Применялся в роторной шифровальной машине M-209.
Описание
[править | править код]Ключ
[править | править код]Длина ключа (K) должна быть равной длине исходного текста. Для этого циклически записывают ключевое слово до тех пор, пока его длина не будет соответствовать длине исходного текста.
Шифрование
[править | править код]Для того чтобы зашифровать открытый текст (M) с использованием ключа (K) нужно:
- Взять n-ый символ открытого текста (mn, где 0≤n<количество символов ключа);
- Найти столбец ( j ) где символ в первой строке равен mn (s1 j = mn);
- Найти строку ( i ) где символ в j-ом столбце равен kn (si j = kn, где kn - n-ый символ ключа);
- Добавить к шифротексту ( C ) символ 1-го столбца i-ой строки (сn = si 1).
Дешифрирование
[править | править код]Для того чтобы дешифрировать шифротекст (C) с использованием ключа (K) нужно:
- Взять n-ый символ шифротекста (cn, где 0≤n<количество символов C);
- Найти строку ( i ) где символ в 1-м столбце равен cn (si 1 = cn);
- Найти столбец ( j ) где символ в i-ой строке равен kn (si j = kn, где kn - n-ый символ ключа);
- Добавить к расшифрованному тексту ( M ) символ 1-й строки j-го столбца (mn = s1 j).
Пример
[править | править код]Пусть дан исходный текст: C = "HELLOWORLD"
и ключ: K = "KEY"
Ключ
[править | править код]Длина клера - 10 символов, значит и длина ключа также должна равнятся 10 символам.
K = "KEYKEYKEYK"
Шифрование
[править | править код]- m1 = "H".
- j = 8
- i = 4
- c1 = s4 1 = "D"
C += "D" (C = "D") - m2 = "E"
- j = 5
- i = 1
- c2 = s1 1 = "A"
C += "A" (C = "DA")
. . . . . . . . .
- m10 = "D"
- j = 4
- i = 8
- c10 = s8 1 = "H"
C += "H" (C = "DANZQCWNNH")
Шифротекст (C) - "DANZQCWNNH"
Дешифрирование
[править | править код]- c1 = "D".
- i = 4
- j = 8
- m1 = s1 8 = "H"
M += "D" (M = "H") - c2 = "A"
- i = 1
- j = 5
- m2 = s1 5 = "E"
M += "E" (M = "HE")
. . . . . . . . .
- c10 = "H"
- i = 8
- j= 4
- c10 = s1 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