Частотный анализ букв в тексте

31 января 2016, воскресение | просмотров: 5572

Здравствуйте! Предлагаю вашему вниманию исходный текст программы на Delphi, которая анализирует текст и выдает частоту повторения каждого его символа. Вы спросите, а для чего это нужно? Отвечу: например, для расшифровки сообщения, зашифрованного методом подстановки.

Шифр подстановки — это метод шифрования, в котором элементы исходного открытого текста заменяются зашифрованным текстом в соответствии с некоторым правилом. Элементами текста могут быть отдельные символы (самый распространённый случай), пары букв, тройки букв, комбинирование этих случаев и так далее.



Частотный анализ букв в тексте



Чтобы расшифровать такой шифр необходимо знать ключ - алфавит соответствия. Однако такой алгоритм имеет недостаток: частота букв в шифрованном тексте равна частоте букв исходного сообщения! Значит если знать частоту букв и посчитать его в шифрованном тексте можно найти ключ и расшифровать сообщение!

В открытых источниках можно найти информацию о повторении букв алфавита того или иного языка.

Частотность букв русского языка (%)

о - 10,983
е - 8,483
а - 7,998
и - 7,367
н - 6,7
т - 6,318
с - 5,473
р - 4,746
в - 4,533
л - 4,343
к - 3,486
м - 3,203
д - 2,977
п - 2,804
у - 2,615
я - 2,001
ы - 1,898
ь - 1,735
г - 1,687
з - 1,641
б - 1,592
ч - 1,45
й - 1,208
х - 0,966
ж - 0,94
ш - 0,718
ю - 0,639
ц - 0,486
щ - 0,361
э - 0,331
ф - 0,267
ъ - 0,037
ё - 0,013

Источник: https://ru.wikipedia.org/wiki/Частотность

Частотность букв английского языка (%)

a - 11.602
b - 4.702
c - 3.511
d - 2.670
e - 2.007
f - 3.779
g - 1.950
h - 7.232
i - 6.286
j - 0.597
k - 0.590
l - 2.705
m - 4.383
n - 2.365
o - 6.264
p - 2.545
q - 0.173
r - 1.653
s - 7.755
t - 16.67
u - 1.487
v - 0.649
w - 6.753
x - 0.017
y - 1.620
z - 0.034

Источник: https://en.wikipedia.org/wiki/Letter_frequency

Теперь привожу текст программы, который анализирует частоту повторения букв в тексте.

unit main; {$R *.dfm}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TMainForm = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
ProgressBar1: TProgressBar;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
procedure Button1Click(Sender: TObject);
end;
var
MainForm: TMainForm;
Stream: TFileStream;
S: set of Byte;
B1, b2: Byte;
K1, K2: Int64;
L1, L2: DWord;
L3: DWord;
SS: String;
implementation
procedure TMainForm.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
Memo1.Clear;
Edit1.Text:=OpenDialog1.FileName;
Stream:=TFileStream.Create(Edit1.Text, fmOpenRead);
ProgressBar1.Position:=00;
ProgressBar1.Max:=Stream.Size;
ProgressBar1.Visible:=True;
S:=[];
K1:=00;
Memo1.Lines.Add('Байт'#9#9'Символ'#9#9'Кол-во в шт.'#9#9'Кол-во в %'#13#10);
for L1:=00 to Stream.Size - 01 do begin
ProgressBar1.Position:=L1;
Stream.Seek(L1, soFromBeginning);
Stream.ReadBuffer(B1, 01);
if (Chr(B1) in ['A'..'Z', 'a'..'z']) then begin
if (CheckBox1.Checked = False) then Continue;
end
else begin
if (Chr(B1) in ['А'..'Я', 'а'..'я']) then begin
if (CheckBox2.Checked = False) then Continue;
end
else begin
if (CheckBox3.Checked = False) then Continue;
end;
end;
if not (B1 in S) then begin
K1:=K1 + 01;
S:=S + [B1];
K2:=00;
for L2:=00 to Stream.Size - 01 do begin
Stream.Seek(L2, soFromBeginning);
Stream.ReadBuffer(B2, 01);
if B1 = B2 then K2:=K2 + 01;
end;
Memo1.Lines.Add(Format('%d'#09#09'%s'#09#09'%d'#09#09#09'%f%', [B1, Chr(B1), K2, K2 / Stream.Size * 100]));
end;
end;
Memo1.Lines.Add(#13#10'Количество знаков: ' + IntToStr(Stream.Size));
Memo1.Lines.Add('Количество уникальных знаков: ' + IntToStr(K1));
Memo1.Lines.SaveToFile('result.txt');
Stream.Free;
ProgressBar1.Visible:=False;
end;
end;
end.


Так выглядит главное окно программы:


Частотный анализ букв в тексте




После загрузки некоторого шифрованного текста в программу, мы увидим статистику повторения букв.


Частотный анализ букв в тексте



Теперь остается только соотнести исходный и шифрованный текст по частоте повторения букв!

При расшифровке могут возникнуть трудности, например, если текст слишком короткий или если текст написан заведомо с ошибками.

Скачать программу для анализа текста можно по ссылке ниже.




Скачать


Понравилась публикация? Поддержи сайт, поделись записью внизу страницы !


Комментариев нет.




Только подтвержденные пользователи могут оставлять комментарии.

Поделиться страницей в социальных сетях



Поделиться ВКонтакте Поделиться Facebook Поделиться Одноклассники Поделиться Twitter Поделиться Google+

Личный кабинет




Регистрация

Знаете ли вы...


Когда человек рождается, он имеет 300 костей, но к 25-летию их остается только 206 (срастаются)


Просмотр изображения