//Шифрование Плэйфера
function Playfair_Crypt( s, key: string ) : string ;
const
//Размер ключевой матрицы:
MaxX = 6 ; //столбцы
MaxY = 5 ; //строки
//Наш алфавит. Размер должен быть MaxY*MaxX.
//Поэтому в нашем случае убраны буквы "ё", "й", "ь".
URusA = 'абвгдежзиклмнопрстуфхцчшщъыэюя' ;
var i, j, t, x1, x2, y1, y2 : integer ;
M : array [ 1 .. MaxY , 1 .. MaxX ] of char ; //ключевая матрица
temp : string ;
//Функция поиска символа "с" в ключевой матрице.
//Возвращает строку "y" и столбец "x".
Procedure SimbolPos( c: char ; var x, y: integer ) ;
var i, j: integer ;
begin
x: = 0 ;
y: = 0 ;
for i : = 1 to MaxY do
for j : = 1 to MaxX do
if c= M[ i, j] then
begin
x: = j;
y: = i;
exit;
end ;
end ;
label M1;
begin
//переводим ключ и исходный текст в нижний регистр.
key: = AnsiLowerCase( key) ;
s: = AnsiLowerCase( s) ;
//удаляем из строки все символы, не входящие в наш алфавит.
temp: = '' ;
for i : = 1 to length( s) do if pos( s[ i] , URusA) <>0 then temp: = temp+ s[ i] ;
s: = temp;
//Создание ключевой матрицы, с использованием ключевого слова "key".
temp: = '' ;
for i: = 1 to length( key) do
if pos( key[ i] , temp) = 0 then temp: = temp+ key[ i] ;
for i: = 1 to length( URusA) do
if pos( URusA[ i] , temp) = 0 then temp: = temp+ URusA[ i] ;
t: = 0 ;
for i: = 1 to 5 do
for j: = 1 to 6 do
begin
inc( t) ;
M[ i, j] : = temp[ t] ;
form1. StringGrid1 . Cells [ j, i] : = temp[ t] ;
end ;
//просмотр строки по парам символов и вставка разделяющего символа
//"ъ" в случае когда в паре попались одинаковые символы.
M1:
for i: = 1 to length( s) div 2 do
begin
if s[ 2 * i- 1 ] = s[ 2 * i] then
begin
insert( 'ъ' , s, 2 * i) ;
goto M1;
end ;
end ;
//Добавляем символ в конец строки, если её длина нечётная.
if length( s) MOD 2 = 1 then if s[ length( s) ] <>'ъ' then s: = s+ 'ъ'
else s: = s+ 'я' ;
temp: = '' ;
for i: = 1 to length( s) div 2 do
begin
SimbolPos( s[ 2 * i- 1 ] , x1, y1) ;
SimbolPos( s[ 2 * i] , x2, y2) ;
//Правило 1
if y1 = y2 then
begin
inc( x1) ; inc( x2) ;
if x1 > MaxX then x1: = x1- MaxX;
if x2 > MaxX then x2: = x2- MaxX;
temp: = temp+ M[ y1, x1] + M[ y2, x2] ;
end ;
//Правило 2
if x1 = x2 then
begin
inc( y1) ; inc( y2) ;
if y1 > MaxY then y1: = y1- MaxY;
if y2 > MaxY then y2: = y2- MaxY;
temp: = temp+ M[ y1, x1] + M[ y2, x2] ;
end ;
//Правило 3
if ( x1<>x2) and ( y1<>y2) then temp: = temp+ M[ y1, x2] + M[ y2, x1] ;
end ;
Playfair_Crypt: = temp;
end ;
//Дешифрование Плэйфера
function Playfair_DeCrypt( s, key: string ) : string ;
const
//Размер ключевой матрицы:
MaxX = 6 ; //столбцы
MaxY = 5 ; //строки
//Наш алфавит. Размер должен быть MaxY*MaxX.
//Поэтому в нашем случае убраны буквы "ё", "й", "ь".
URusA = 'абвгдежзиклмнопрстуфхцчшщъыэюя' ;
var i, j, t, x1, x2, y1, y2 : integer ;
M : array [ 1 .. MaxY , 1 .. MaxX ] of char ; //ключевая матрица
temp : string ;
//Функция поиска символа "с" в ключевой матрице.
//Возвращает строку "y" и столбец "x".
Procedure SimbolPos( c: char ; var x, y: integer ) ;
var i, j: integer ;
begin
x: = 0 ;
y: = 0 ;
for i : = 1 to MaxY do
for j : = 1 to MaxX do
if c= M[ i, j] then
begin
x: = j;
y: = i;
exit;
end ;
end ;
label M1;
begin
//переводим ключ и исходный текст в нижний регистр.
key: = AnsiLowerCase( key) ;
s: = AnsiLowerCase( s) ;
//удаляем из строки все символы, не входящие в наш алфавит.
temp: = '' ;
for i : = 1 to length( s) do
begin
if pos( s[ i] , URusA) <>0 then temp: = temp+ s[ i] ;
end ;
s: = temp;
//Создание ключевой матрицы, с использованием ключевого слова "key".
temp: = '' ;
for i: = 1 to length( key) do
if pos( key[ i] , temp) = 0 then temp: = temp+ key[ i] ;
for i: = 1 to length( URusA) do
if pos( URusA[ i] , temp) = 0 then temp: = temp+ URusA[ i] ;
t: = 0 ;
for i: = 1 to 5 do
for j: = 1 to 6 do
begin
inc( t) ;
M[ i, j] : = temp[ t] ;
end ;
temp: = '' ;
for i: = 1 to length( s) div 2 do
begin
SimbolPos( s[ 2 * i- 1 ] , x1, y1) ;
SimbolPos( s[ 2 * i] , x2, y2) ;
//Правило 1
if y1 = y2 then
begin
dec( x1) ; dec( x2) ;
if x1 <= 0 then x1: = x1+ MaxX;
if x2 <= 0 then x2: = x2+ MaxX;
temp: = temp+ M[ y1, x1] + M[ y2, x2] ;
end ;
//Правило 2
if x1 = x2 then
begin
dec( y1) ; dec( y2) ;
if y1 <= 0 then y1: = y1+ MaxY;
if y2 <= 0 then y2: = y2+ MaxY;
temp: = temp+ M[ y1, x1] + M[ y2, x2] ;
end ;
//Правило 3
if ( x1<>x2) and ( y1<>y2) then temp: = temp+ M[ y1, x2] + M[ y2, x1] ;
end ;
Playfair_DeCrypt: = temp;
end ;
Ly/QqNC40YTRgNC+0LLQsNC90LjQtSDQn9C70Y3QudGE0LXRgNCwCmZ1bmN0aW9uIFBsYXlmYWlyX0NyeXB0KHMsa2V5OnN0cmluZyk6c3RyaW5nOwpjb25zdAogIC8v0KDQsNC30LzQtdGAINC60LvRjtGH0LXQstC+0Lkg0LzQsNGC0YDQuNGG0Ys6CiAgTWF4WCA9IDY7Ly/RgdGC0L7Qu9Cx0YbRiwogIE1heFkgPSA1Oy8v0YHRgtGA0L7QutC4CiAgLy/QndCw0Ygg0LDQu9GE0LDQstC40YIuINCg0LDQt9C80LXRgCDQtNC+0LvQttC10L0g0LHRi9GC0YwgTWF4WSpNYXhYLgogIC8v0J/QvtGN0YLQvtC80YMg0LIg0L3QsNGI0LXQvCDRgdC70YPRh9Cw0LUg0YPQsdGA0LDQvdGLINCx0YPQutCy0YsgItGRIiwgItC5IiwgItGMIi4KICBVUnVzQSA9ICfQsNCx0LLQs9C00LXQttC30LjQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjdGO0Y8nOwoKdmFyIGksaix0LHgxLHgyLHkxLHkyIDppbnRlZ2VyOwogICAgTSA6IGFycmF5WzEuLk1heFksMS4uTWF4WF1vZiBjaGFyOyAvL9C60LvRjtGH0LXQstCw0Y8g0LzQsNGC0YDQuNGG0LAKICAgIHRlbXAgOnN0cmluZzsKICAgIAogIC8v0KTRg9C90LrRhtC40Y8g0L/QvtC40YHQutCwINGB0LjQvNCy0L7Qu9CwICLRgSIg0LIg0LrQu9GO0YfQtdCy0L7QuSDQvNCw0YLRgNC40YbQtS4KICAvL9CS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YLRgNC+0LrRgyAieSIg0Lgg0YHRgtC+0LvQsdC10YYgIngiLgogIFByb2NlZHVyZSBTaW1ib2xQb3MoYzpjaGFyO3ZhciB4LHk6aW50ZWdlcik7CiAgdmFyIGksajppbnRlZ2VyOwogIGJlZ2luCiAgeDo9MDsKICB5Oj0wOwogIGZvciBpIDo9IDEgdG8gTWF4WSBkbwogICAgZm9yIGogOj0gMSB0byBNYXhYIGRvCiAgICAgIGlmIGM9TVtpLGpdIHRoZW4KICAgICAgICBiZWdpbgogICAgICAgIHg6PWo7CiAgICAgICAgeTo9aTsKICAgICAgICBleGl0OwogICAgICAgIGVuZDsKICBlbmQ7CgpsYWJlbCBNMTsKYmVnaW4KLy/Qv9C10YDQtdCy0L7QtNC40Lwg0LrQu9GO0Ycg0Lgg0LjRgdGF0L7QtNC90YvQuSDRgtC10LrRgdGCINCyINC90LjQttC90LjQuSDRgNC10LPQuNGB0YLRgC4Ka2V5Oj1BbnNpTG93ZXJDYXNlKGtleSk7CnM6PUFuc2lMb3dlckNhc2Uocyk7Ci8v0YPQtNCw0LvRj9C10Lwg0LjQtyDRgdGC0YDQvtC60Lgg0LLRgdC1INGB0LjQvNCy0L7Qu9GLLCDQvdC1INCy0YXQvtC00Y/RidC40LUg0LIg0L3QsNGIINCw0LvRhNCw0LLQuNGCLgp0ZW1wOj0nJzsKZm9yIGkgOj0gMSB0byBsZW5ndGgocykgZG8gaWYgcG9zKHNbaV0sVVJ1c0EpPD4wIHRoZW4gdGVtcDo9dGVtcCtzW2ldOwpzOj10ZW1wOwovL9Ch0L7Qt9C00LDQvdC40LUg0LrQu9GO0YfQtdCy0L7QuSDQvNCw0YLRgNC40YbRiywg0YEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCDQutC70Y7Rh9C10LLQvtCz0L4g0YHQu9C+0LLQsCAia2V5Ii4KdGVtcDo9Jyc7CmZvciBpOj0xIHRvIGxlbmd0aChrZXkpIGRvCiBpZiBwb3Moa2V5W2ldLHRlbXApPTAgdGhlbiB0ZW1wOj10ZW1wK2tleVtpXTsKZm9yIGk6PTEgdG8gbGVuZ3RoKFVSdXNBKSBkbwogaWYgcG9zKFVSdXNBW2ldLHRlbXApPTAgdGhlbiB0ZW1wOj10ZW1wK1VSdXNBW2ldOwp0Oj0wOwpmb3IgaTo9MSB0byA1IGRvCiBmb3Igajo9MSB0byA2IGRvCiBiZWdpbgogaW5jKHQpOwogTVtpLGpdOj10ZW1wW3RdOwogZm9ybTEuU3RyaW5nR3JpZDEuQ2VsbHNbaixpXTo9dGVtcFt0XTsKIGVuZDsKCgovL9C/0YDQvtGB0LzQvtGC0YAg0YHRgtGA0L7QutC4INC/0L4g0L/QsNGA0LDQvCDRgdC40LzQstC+0LvQvtCyINC4INCy0YHRgtCw0LLQutCwINGA0LDQt9C00LXQu9GP0Y7RidC10LPQviDRgdC40LzQstC+0LvQsAovLyLRiiIg0LIg0YHQu9GD0YfQsNC1INC60L7Qs9C00LAg0LIg0L/QsNGA0LUg0L/QvtC/0LDQu9C40YHRjCDQvtC00LjQvdCw0LrQvtCy0YvQtSDRgdC40LzQstC+0LvRiy4KTTE6CmZvciBpOj0xIHRvIGxlbmd0aChzKWRpdiAyIGRvCiAgYmVnaW4KICBpZiBzWzIqaS0xXT1zWzIqaV0gdGhlbgogICAgYmVnaW4KICAgIGluc2VydCgn0YonLHMsMippKTsKICAgIGdvdG8gTTE7CiAgICBlbmQ7CiAgZW5kOwovL9CU0L7QsdCw0LLQu9GP0LXQvCDRgdC40LzQstC+0Lsg0LIg0LrQvtC90LXRhiDRgdGC0YDQvtC60LgsINC10YHQu9C4INC10ZEg0LTQu9C40L3QsCDQvdC10YfRkdGC0L3QsNGPLgppZiBsZW5ndGgocykgTU9EIDIgPSAxIHRoZW4gaWYgc1tsZW5ndGgocyldPD4n0YonIHRoZW4gczo9cysn0YonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHM6PXMrJ9GPJzsKdGVtcDo9Jyc7CmZvciBpOj0xIHRvIGxlbmd0aChzKWRpdiAyIGRvCiAgYmVnaW4KICBTaW1ib2xQb3Moc1syKmktMV0seDEseTEpOwogIFNpbWJvbFBvcyhzWzIqaV0seDIseTIpOwogIC8v0J/RgNCw0LLQuNC70L4gMQogIGlmIHkxID0geTIgdGhlbgogICAgYmVnaW4KICAgIGluYyh4MSk7IGluYyh4Mik7CiAgICBpZiB4MSA+IE1heFggdGhlbiB4MTo9eDEtTWF4WDsKICAgIGlmIHgyID4gTWF4WCB0aGVuIHgyOj14Mi1NYXhYOwogICAgdGVtcDo9dGVtcCtNW3kxLHgxXStNW3kyLHgyXTsKICAgIGVuZDsKICAvL9Cf0YDQsNCy0LjQu9C+IDIKICBpZiB4MSA9IHgyIHRoZW4KICAgIGJlZ2luCiAgICBpbmMoeTEpOyBpbmMoeTIpOwogICAgaWYgeTEgPiBNYXhZIHRoZW4geTE6PXkxLU1heFk7CiAgICBpZiB5MiA+IE1heFkgdGhlbiB5Mjo9eTItTWF4WTsKICAgIHRlbXA6PXRlbXArTVt5MSx4MV0rTVt5Mix4Ml07CiAgICBlbmQ7CiAgLy/Qn9GA0LDQstC40LvQviAzCiAgaWYgKHgxPD54MikgYW5kICh5MTw+eTIpIHRoZW4gdGVtcDo9dGVtcCtNW3kxLHgyXStNW3kyLHgxXTsKICBlbmQ7ClBsYXlmYWlyX0NyeXB0Oj10ZW1wOwplbmQ7CgovL9CU0LXRiNC40YTRgNC+0LLQsNC90LjQtSDQn9C70Y3QudGE0LXRgNCwCmZ1bmN0aW9uIFBsYXlmYWlyX0RlQ3J5cHQocyxrZXk6c3RyaW5nKTpzdHJpbmc7CmNvbnN0CiAgLy/QoNCw0LfQvNC10YAg0LrQu9GO0YfQtdCy0L7QuSDQvNCw0YLRgNC40YbRizoKICBNYXhYID0gNjsvL9GB0YLQvtC70LHRhtGLCiAgTWF4WSA9IDU7Ly/RgdGC0YDQvtC60LgKICAvL9Cd0LDRiCDQsNC70YTQsNCy0LjRgi4g0KDQsNC30LzQtdGAINC00L7Qu9C20LXQvSDQsdGL0YLRjCBNYXhZKk1heFguCiAgLy/Qn9C+0Y3RgtC+0LzRgyDQsiDQvdCw0YjQtdC8INGB0LvRg9GH0LDQtSDRg9Cx0YDQsNC90Ysg0LHRg9C60LLRiyAi0ZEiLCAi0LkiLCAi0YwiLgogIFVSdXNBID0gJ9Cw0LHQstCz0LTQtdC20LfQuNC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GN0Y7Rjyc7Cgp2YXIgaSxqLHQseDEseDIseTEseTIgOmludGVnZXI7CiAgICBNIDogYXJyYXlbMS4uTWF4WSwxLi5NYXhYXW9mIGNoYXI7IC8v0LrQu9GO0YfQtdCy0LDRjyDQvNCw0YLRgNC40YbQsAogICAgdGVtcCA6c3RyaW5nOwoKICAvL9Ck0YPQvdC60YbQuNGPINC/0L7QuNGB0LrQsCDRgdC40LzQstC+0LvQsCAi0YEiINCyINC60LvRjtGH0LXQstC+0Lkg0LzQsNGC0YDQuNGG0LUuCiAgLy/QktC+0LfQstGA0LDRidCw0LXRgiDRgdGC0YDQvtC60YMgInkiINC4INGB0YLQvtC70LHQtdGGICJ4Ii4KICBQcm9jZWR1cmUgU2ltYm9sUG9zKGM6Y2hhcjt2YXIgeCx5OmludGVnZXIpOwogIHZhciBpLGo6aW50ZWdlcjsKICBiZWdpbgogIHg6PTA7CiAgeTo9MDsKICBmb3IgaSA6PSAxIHRvIE1heFkgZG8KICAgIGZvciBqIDo9IDEgdG8gTWF4WCBkbwogICAgICBpZiBjPU1baSxqXSB0aGVuCiAgICAgICAgYmVnaW4KICAgICAgICB4Oj1qOwogICAgICAgIHk6PWk7CiAgICAgICAgZXhpdDsKICAgICAgICBlbmQ7CiAgZW5kOwoKbGFiZWwgTTE7CmJlZ2luCi8v0L/QtdGA0LXQstC+0LTQuNC8INC60LvRjtGHINC4INC40YHRhdC+0LTQvdGL0Lkg0YLQtdC60YHRgiDQsiDQvdC40LbQvdC40Lkg0YDQtdCz0LjRgdGC0YAuCmtleTo9QW5zaUxvd2VyQ2FzZShrZXkpOwpzOj1BbnNpTG93ZXJDYXNlKHMpOwovL9GD0LTQsNC70Y/QtdC8INC40Lcg0YHRgtGA0L7QutC4INCy0YHQtSDRgdC40LzQstC+0LvRiywg0L3QtSDQstGF0L7QtNGP0YnQuNC1INCyINC90LDRiCDQsNC70YTQsNCy0LjRgi4KdGVtcDo9Jyc7CmZvciBpIDo9IDEgdG8gbGVuZ3RoKHMpIGRvCiAgYmVnaW4KICBpZiBwb3Moc1tpXSxVUnVzQSk8PjAgdGhlbiB0ZW1wOj10ZW1wK3NbaV07CiAgZW5kOwpzOj10ZW1wOwovL9Ch0L7Qt9C00LDQvdC40LUg0LrQu9GO0YfQtdCy0L7QuSDQvNCw0YLRgNC40YbRiywg0YEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCDQutC70Y7Rh9C10LLQvtCz0L4g0YHQu9C+0LLQsCAia2V5Ii4KdGVtcDo9Jyc7CmZvciBpOj0xIHRvIGxlbmd0aChrZXkpIGRvCiBpZiBwb3Moa2V5W2ldLHRlbXApPTAgdGhlbiB0ZW1wOj10ZW1wK2tleVtpXTsKZm9yIGk6PTEgdG8gbGVuZ3RoKFVSdXNBKSBkbwogaWYgcG9zKFVSdXNBW2ldLHRlbXApPTAgdGhlbiB0ZW1wOj10ZW1wK1VSdXNBW2ldOwp0Oj0wOwpmb3IgaTo9MSB0byA1IGRvCiBmb3Igajo9MSB0byA2IGRvCiBiZWdpbgogaW5jKHQpOwogTVtpLGpdOj10ZW1wW3RdOwogZW5kOwoKdGVtcDo9Jyc7CmZvciBpOj0xIHRvIGxlbmd0aChzKWRpdiAyIGRvCiAgYmVnaW4KICBTaW1ib2xQb3Moc1syKmktMV0seDEseTEpOwogIFNpbWJvbFBvcyhzWzIqaV0seDIseTIpOwogIC8v0J/RgNCw0LLQuNC70L4gMQogIGlmIHkxID0geTIgdGhlbgogICAgYmVnaW4KICAgIGRlYyh4MSk7IGRlYyh4Mik7CiAgICBpZiB4MSA8PSAwIHRoZW4geDE6PXgxK01heFg7CiAgICBpZiB4MiA8PSAwIHRoZW4geDI6PXgyK01heFg7CiAgICB0ZW1wOj10ZW1wK01beTEseDFdK01beTIseDJdOwogICAgZW5kOwogIC8v0J/RgNCw0LLQuNC70L4gMgogIGlmIHgxID0geDIgdGhlbgogICAgYmVnaW4KICAgIGRlYyh5MSk7IGRlYyh5Mik7CiAgICBpZiB5MSA8PSAwIHRoZW4geTE6PXkxK01heFk7CiAgICBpZiB5MiA8PSAwIHRoZW4geTI6PXkyK01heFk7CiAgICB0ZW1wOj10ZW1wK01beTEseDFdK01beTIseDJdOwogICAgZW5kOwogIC8v0J/RgNCw0LLQuNC70L4gMwogIGlmICh4MTw+eDIpIGFuZCAoeTE8PnkyKSB0aGVuIHRlbXA6PXRlbXArTVt5MSx4Ml0rTVt5Mix4MV07CiAgZW5kOwpQbGF5ZmFpcl9EZUNyeXB0Oj10ZW1wOwplbmQ7CgoKCgo=