После одной из недавних тем решил заморочиться над шифрованием по квадрату Полибия, пару дней изобретал велосипед, просьба оценить насколько близко получилось к уже существующему.
Корректно работает только для квадратных матриц, что, как я понял, обусловлено самим способом формирования шифра (в википедии он идёт как метод под номером 2), так как идёт перенос строки y-координат в конец строки x-координат и поэтому часть y-координат становятся х-координатами, что и даёт сбои при не квадратных матрицах.
Также для корректности работы приходится добавлять несколько лишних символов к алфавиту.
В моём примере вводимый текст может содержать только русские буквы, пробел, точку и запятую.
charAt() не использовал, хотя наверное можно было.
<body onload = "createTable()">
<style>
table, td {border: solid 1px; text-align: center; float: left}
textarea {wrap: virtual}
</style>
<table id="etable">
</table>
<div id="myDiv">
<textarea id="text"></textarea>
<input type="button" value="Encode" onclick="encode(text, etext)"><br>
<textarea id="etext"></textarea>
<input type="button" value="Decode" onclick="decode(etext, dtext)"><br>
<textarea id="dtext"></textarea>
</div>
<script>
//алфавит также включает точку, запятую и пробел
var alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ., ";
//параметры таблицы
var rows = 6;
var cols = 6;
//выводит таблицу
function createTable() {
var k = 0;
for (var i = 0; i < rows; i++) {
tr = document.createElement('tr');
etable.appendChild(tr);
for (var j = 0; j < cols; j++) {
td = document.createElement('td');
td.innerHTML = alphabet[j+k];
tr.appendChild(td);
}
k = k + cols;
}
}
//второй вариант вывода таблицы
function createTable2() {
var k = 0;
var str = "";
for (var i = 0; i < rows; i++) {
str = str +'<tr>';
for (var j = 0; j < cols; j++) {
str = str + '<td>' + alphabet[j+k];
}
str = str + '</tr>'
k = k + cols;
}
etable.innerHTML = str;
}
//координаты символа
function pos(symbol) {
var k = alphabet.indexOf(symbol);
var x = k % cols;
var y = parseInt(k/cols);
var xy = [];
xy[0] = x;
xy[1] = y;
return xy;
}
//символ по координатам
function symbol(x, y) {
var n = parseInt(y) * cols + parseInt(x);
return alphabet[n];
}
//шифрует
function encode(source, target) {
var str = source.value.toUpperCase(); //регистронезависимость текста
var allX = "";
var allY = "";
var estr = "";
var mas = [];
var l = str.length;
for (var i = 0; i < l; i++) {
mas = pos(str[i]);
allX = allX + mas[0];
allY = allY + mas[1];
}
var all = allX + allY;
var k = all.length;
for (var i = 0; i < k; i = i + 2) {
estr = estr + symbol( all[i], all[i+1] );
}
target.value = estr;
}
//дешифрует
function decode(source, target) {
var str = source.value.toUpperCase();
var all = "";
var dstr = "";
var mas = [];
var l = str.length;
for (var i = 0; i < l; i++) {
mas = pos(str[i]);
all = all + mas[0] + mas[1] ;
}
var k = all.length/2;
var allX = all.slice (0, k);
var allY = all.slice(k);
for (var i = 0; i < k; i++) {
dstr = dstr + symbol(allX[i], allY[i] );
}
target.value = dstr;
}
</script>