Шифр Бофора
Шифр Бофорта — полиалфавитный подстановочный шифр, созданный сэром Фрэнсисом Бофортом. Шифр похож на шифр Виженера, со слегка измененным механизмом шифрования и использованием 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