Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2020, 20:09   #1
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию Метод частотного анализа текста на C++ в Visual Studio 2019 Community: распознавание иероглифов

Добрый вечер! Ранее я зашифровал текст алгоритмом на C# при ключах 12 и 111111.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace FinalProject
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
        }
 
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        private void clearToolStripMenuItem_Click(object sender, EventArgs e)
        {
            txtIn.Text = string.Empty;
            txtOut.Text = string.Empty;
            txtKey.Text = "12";
        }
 
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show(
                "Автор: Владимир Бузин, \nДата релиза: Ноябрь 2020 г",
                "Enigma v1.0",
                MessageBoxButtons.OK,
                MessageBoxIcon.Information
                );
        }
 
        private void btnAction_Click(object sender, EventArgs e)
        {
            int key = Convert.ToInt32(txtKey.Text);
 
            txtOut.Text = Encryption(txtIn.Text, key);
        }
 
        private string Encryption(string v1, int v2)
        {
            string temp = String.Empty;
            foreach (char c in v1)
            {
                temp = temp + Convert.ToString((char)(((int)(c) ^ v2)));
            }
            return temp;
        }
    }
}
Исходный текст (in.TXT):
Код:
Для понимания процесса усложняющегося упорядочения связей во взаимодействиях и саморазвития материи важнейшее значение имеет раскрытие феномена активности материи. "В отечественной философской литературе самодвижение материи почти не исследуется. Еще меньше внимания уделяется вопросу об активности, хотя она не менее реальна, чем самодвижение" [5]. Механизм активность материи пытался объяснить В. И. Кремянский возникновением в объектах неких "внутренних напряжений": "... для того, чтобы возникла простая форма активности, необходимо и достаточно, чтобы образовалась какая-то система, имеющая внутренние напряжения... Именно с внутренних напряжений и начинается возникновение активности" .
Шифрование ключом 12 (example.TXT):
Код:
Изу,гвбдамбду,гьвъйээм,яэзвкбутхйпвэу,ягвьуивыйбду,эоулйе,ов,олмдавийеэюодущ,д,эмавьмлодюду,амюйьдд,омкбйефйй,лбмыйбдй,даййю,ьмэжьчюдй,шйбвайбм,мжюдобвэюд,амюйьдд",.О,вюйыйэюойббве,шдзвэвшэжве,здюйьмюяьй,эмавиодкйбдй,амюйьдд,гвыюд,бй,дээзйияйюэу",Йхй,айбрфй,обдамбду,яийзуйюэу,овгьвэя,вн,мжюдобвэюд ,щвюу,вбм,бй,айбйй,ьймзрбм ,ыйа,эмавиодкйбдй.,W9Q",Айщмбдла,мжюдобвэюр,амюйьдд,гчюмзэу,внцуэбдюр,О",Д",Жьйаубэжде,овлбджбвойбдйа,о,внцйжюмщ,бйждщ,.обяюьйббдщ,бмгьукйбде.6,.""",изу,ювпв ,ыювнч,овлбджзм,гьвэюму,швьам,мжюдобвэюд ,бйвнщвидав,д,ивэюмювыбв ,ыювнч,вньмлвомзмэр,жмжму!юв,эдэюйам ,дайтхму,обяюьйббдй,бмгьукйбду""",Дайббв,э,обяюьйббдщ,бмгьукйбде,д,бмыдбмйюэу,овлбджбвойбдй,мжюдобвэюд.,"
Шифрование ключом 111111 (cryptOfText.TXT):
Код:
똓똼뙈눧똸똹똺똿똻똷똺똿뙈눧똸뙇똹뙁똲뙆뙆똷눧뙄뙆똼똹똱똺뙈뙉뙎똲똴똹뙆뙈눧뙄똸똹뙇뙈똳똹뙀똲똺똿뙈눧뙆똵뙈똰똲똾눧똵똹눧똵똰똷똿똻똹똳똲똾뙆뙅똵똿뙈뙂눧똿눧뙆똷똻똹뙇똷똰똵똿뙅똿뙈눧똻똷뙅똲뙇똿똿눧똵똷똱똺똲똾뙏똲똲눧똰똺똷뙀똲똺똿똲눧똿똻똲똲뙅눧뙇똷뙆똽뙇뙌뙅똿똲눧뙃똲똺똹똻똲똺똷눧똷똽뙅똿똵똺똹뙆뙅똿눧똻똷뙅똲뙇똿똿눩눧눥똕눧똹뙅똲뙀똲뙆뙅똵똲똺똺똹똾눧뙃똿똼똹뙆똹뙃뙆똽똹똾눧똼똿뙅똲뙇똷뙅뙄뙇똲눧뙆똷똻똹똳똵똿똱똲똺똿똲눧똻똷뙅똲뙇똿똿눧똸똹뙀뙅똿눧똺똲눧똿뙆뙆똼똲똳뙄똲뙅뙆뙈눩눧똒뙎똲눧똻똲똺뙋뙏똲눧똵똺똿똻똷똺똿뙈눧뙄똳똲똼뙈똲뙅뙆뙈눧똵똹똸뙇똹뙆뙄눧똹똶눧똷똽뙅똿똵똺똹뙆뙅똿눫눧뙂똹뙅뙈눧똹똺똷눧똺똲눧똻똲똺똲똲눧뙇똲똷똼뙋똺똷눫눧뙀똲똻눧뙆똷똻똹똳똵똿똱똲똺똿똲눥눧뉜눲뉚눩눧똛똲뙂똷똺똿똰똻눧똷똽뙅똿똵똺똹뙆뙅뙋눧똻똷뙅똲뙇똿똿눧똸뙌뙅똷똼뙆뙈눧똹똶뙍뙈뙆똺똿뙅뙋눧똕눩눧똟눩눧똝뙇똲똻뙈똺뙆똽똿똾눧똵똹똰똺똿똽똺똹똵똲똺똿똲똻눧똵눧똹똶뙍똲똽뙅똷뙂눧똺똲똽똿뙂눧눥똵똺뙄뙅뙇똲똺똺똿뙂눧똺똷똸뙇뙈똱똲똺똿똾눥눽눧눥눩눩눩눧똳똼뙈눧뙅똹똴똹눫눧뙀뙅똹똶뙌눧똵똹똰똺똿똽똼똷눧똸뙇똹뙆뙅똷뙈눧뙃똹뙇똻똷눧똷똽뙅똿똵똺똹뙆뙅똿눫눧똺똲똹똶뙂똹똳똿똻똹눧똿눧똳똹뙆뙅똷뙅똹뙀똺똹눫눧뙀뙅똹똶뙌눧똹똶뙇똷똰똹똵똷똼똷뙆뙋눧똽똷똽똷뙈눪뙅똹눧뙆똿뙆뙅똲똻똷눫눧똿똻똲뙉뙎똷뙈눧똵똺뙄뙅뙇똲똺똺똿똲눧똺똷똸뙇뙈똱똲똺똿뙈눩눩눩눧똟똻똲똺똺똹눧뙆눧똵똺뙄뙅뙇똲똺똺똿뙂눧똺똷똸뙇뙈똱똲똺똿똾눧똿눧똺똷뙀똿똺똷똲뙅뙆뙈눧똵똹똰똺똿똽똺똹똵똲똺똿똲눧똷똽뙅똿똵똺똹뙆뙅똿눥눧눩
Изображения
Тип файла: jpg для-исходного-текста.jpg (65.3 Кб, 0 просмотров)
Тип файла: jpg для-ключа-12.jpg (68.1 Кб, 0 просмотров)
Тип файла: jpg для-ключа-111111.jpg (116.9 Кб, 0 просмотров)
Тип файла: jpg ключ-12.jpg (98.4 Кб, 0 просмотров)
Тип файла: jpg программа-шифрования.jpg (103.3 Кб, 1 просмотров)
Вложения
Тип файла: txt cryptOfText.TXT (2.0 Кб, 0 просмотров)
Тип файла: txt example.TXT (692 байт, 0 просмотров)
Тип файла: txt in.TXT (692 байт, 0 просмотров)
VolodyaBuzin вне форума Ответить с цитированием
Старый 29.12.2020, 20:09   #2
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 56
По умолчанию

Потом написал алгоритм частотного анализа на C++.
Код:
// PercentSymbol.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
 
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <locale.h>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
    string s;
    int dlina;//длина строки из файла
    cout << "Текст из файла cryptOfText.TXT: ";
    setlocale(LC_ALL, "Russian");//Чтение файла
    ifstream in("cryptOfText.TXT");
    getline(in, s);
    cout << endl << s;
    dlina = s.length();
    in.close();
 
    unsigned char simvol;//запоминаем символ если нашли
    int chastota[256];//частота символа
 
    for (int i = 0; i < 256; i++)
    {
        chastota[i] = 0;
    }
 
    //сначало пробелы (' ')
    for (int i = 0; i < dlina; i++)
    {
        if (s[i] == ' ')
        {
            chastota[0]++;
        }
    }
    if (chastota[0] != 0)
    {
        cout << "\n\nСимвол - пробел" << ", частота его появления= " << chastota[0] << endl;
    }
    chastota[0] = 0;
    //а теперь всё остальное
    for (int i = 0; i < dlina; i++)
    {
        if (s[i] != ' ')
        {
            chastota[int('я') - int(s[i])]++;
            //chastota[abs(int(s[i]))]++;
        }
    }
    for (int i = 255; i != -1; i--)
    {
        if (chastota[i] != 0)
        {
            cout << "Символ " << char(int('я') - i) << ", частота его появления= " << chastota[i] << endl << "частота= " << (float)chastota[i] / (float)dlina * 100 << endl << endl;
        }
    }
    cout << endl;
    system("pause");
    return 0;
 
}
 
// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
// Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
 
// Советы по началу работы 
//   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
//   2. В окне Team Explorer можно подключиться к системе управления версиями.
//   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
//   4. В окне "Список ошибок" можно просматривать ошибки.
//   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
//   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Исходный текст и текст с ключом 12 распознались без ошибок, но остались вопросы для ключа 111111. В какой кодировке нужно сохранять текстовый файл с иероглифами? Какие коды нужно прописать в SetConsoleCP() и SetConsoleOutputCP() для китайских, корейских и японских иероглифов? Почему у массива chastota размерность 256, и какая размерность будет для китайского, корейского и японского алфавитов? Она нужна для циклов:

Код:
int chastota[256];//частота символа
    int chastota[256];//частота символа
 
    for (int i = 0; i < 256; i++)
    {
        chastota[i] = 0;
    }
 
    for (int i = 255; i != -1; i--)
    {
        if (chastota[i] != 0)
        {
            cout << "Символ " << char(int('я') - i) << ", частота его появления= " << chastota[i] << endl << "частота= " << (float)chastota[i] / (float)dlina * 100 << endl << endl;
        }
    }
Какой последний символ в китайском, корейском и японском алфавитах? Нужно здесь:

Код:
    for (int i = 0; i < dlina; i++)
    {
        if (s[i] != ' ')
        {
            chastota[int('я') - int(s[i])]++;
            //chastota[abs(int(s[i]))]++;
        }
    }
    for (int i = 255; i != -1; i--)
    {
        if (chastota[i] != 0)
        {
            cout << "Символ " << char(int('я') - i) << ", частота его появления= " << chastota[i] << endl << "частота= " << (float)chastota[i] / (float)dlina * 100 << endl << endl;
        }
    }
И как на основе массива chastota и текстовой строки s написать алгоритм по поиску ключа? Закиньте, пожалуйста, примеры алгоритмов для поиска ключа по массиву частот символов.
VolodyaBuzin вне форума Ответить с цитированием
Старый 30.12.2020, 08:22   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

VolodyaBuzin, если вместо массива использовать std::map или std::set, то отпадут вопросы про сортировку, поиск и размер контейнера

а если сортировка и не нужна (но шустрый поиск нужен), то std::unordered_set/std::unordered_map
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод частотного анализа текста на Python 3.7 в Visual Studio 2019 Community VolodyaBuzin Python 1 27.11.2020 14:48
Начало работы с программой visual studio 2019 Анатолий Семакин C# (си шарп) 0 15.12.2019 17:23
Visual Studio 2019 - C# где он vinniepooh C# (си шарп) 3 15.10.2019 09:03
Поддержка Visual Studio 2019 в PVS-Studio PVS-Studio C# (си шарп) 0 06.06.2019 15:01
Взломать шифр Виженера методом частотного анализа C# Nseries Помощь студентам 1 05.10.2015 20:48