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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2016, 16:03   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

байт = 8 бит уже ЕСТЬ БИТОВАЯ(бинарная(!) матрица 8x1 (или 1x8)

8 байт прочитанных в "бинарном" режиме и есть матрица 8{байт} x 8{бит}
немного другое дело когда матрица записана в текстовом формате
8 строк по 8 символов "0" / "1"

но вернемся к нашей байто-битовой матрице.
1. байт текста "умножаем" на каждый байт матрицы, так чтобы получить ОДИН бит.
2. собираем ВМЕСТЕ полученные биты (8 штук) вот и готов один байт шифр-текста.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.10.2016 в 16:07.
evg_m вне форума Ответить с цитированием
Старый 20.10.2016, 22:02   #12
Sergey26
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
байт = 8 бит уже ЕСТЬ БИТОВАЯ(бинарная(!) матрица 8x1 (или 1x8)

8 байт прочитанных в "бинарном" режиме и есть матрица 8{байт} x 8{бит}
немного другое дело когда матрица записана в текстовом формате
8 строк по 8 символов "0" / "1"

но вернемся к нашей байто-битовой матрице.
1. байт текста "умножаем" на каждый байт матрицы, так чтобы получить ОДИН бит.
2. собираем ВМЕСТЕ полученные биты (8 штук) вот и готов один байт шифр-текста.
Если я правильно понял, то надо матрицу написать в текстовом файле. Посл е прочитать файлы с тексом и с матрицей в двоичном режиме и перемножить их побайтно. Результат сохранить в текстовый файл .
Sergey26 вне форума Ответить с цитированием
Старый 20.10.2016, 22:12   #13
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Что вы несете? Зачем вам что-то переводить в текст, а потом обратно?
p51x вне форума Ответить с цитированием
Старый 20.10.2016, 22:34   #14
Sergey26
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что вы несете? Зачем вам что-то переводить в текст, а потом обратно?
Да, согласен ерунду написал. Просто до сих пор, не могу понять, как мне правильно решить задачу. Сколько людей сотолько и мнений. Да и в С++ я не очень.
Sergey26 вне форума Ответить с цитированием
Старый 21.10.2016, 09:20   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

есть байт (один) текста {из файла прочитанного в бинарном режиме}. матрица 1 x 8 (

есть ВОСЕМЬ байт матрицы шифрования {также прочитанных из файла или заданных заранее} матрица 8 x 8

Задача: выполнить некие битовые(поразрядные) операции c данными ДЕВЯТЬЮ (8 байт шифр-матрицы + 1 байт текста) БАЙТАМИ так чтобы получить новый БАЙТ являющийся шифром для данного символа.
Написать переумножение бит-вектора(БАЙТА) на бит-матрицу (8 байтов).
(01101001) {один байт текста} x (10000000; 01000000; 00100000; 00010000; 00001000; 00000100; 00000010; 00000001) {8 байт шифр-матрицы ";" это начало новой строки матрицы и новый БАЙТ }
или же наоборот матрицу умножать на вектор.
Цитата:
У меня с перемножением матриц проблем нет.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.10.2016 в 09:33.
evg_m вне форума Ответить с цитированием
Старый 24.10.2016, 08:22   #16
Sergey26
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 15
По умолчанию Проверьте пожалуйста, всё ли верноС++

#include <stdlib.h>
#include<iostream>

int main()
{
int i,j,x,y,d;
int **mat;
setlocale(LC_ALL,"RUSSIAN");
printf("Введите количество строк в матрице -");
scanf("%d",&x);
printf("Введите количество столбцов в матрице -");
scanf("%d",&y);
mat=(int **)malloc(sizeof(int*)*y);
for(i=0; i < x; i++)
mat[i]=(int*)malloc(sizeof(int)*x);

for(i=0; i < x; i++)
{
for(j=0; j < y; j++)
{
printf("Матрица[%d][%d]=", i+1, j+1);
scanf("%d",&mat[i][j]);
}
}

FILE *input = fopen("исходный.txt", "rb+"); // Чтение исходного файла
FILE *output = fopen("результат.txt", "wb+"); //Запись результата кодирования в файл
if ( input != NULL && output != NULL )
{
unsigned char buffer[BUFSIZ];
size_t count, d;
do
{
count = fread(buffer, sizeof *buffer, sizeof buffer, input);
for ( d = 0; d < count; ++d )
{
for (i=0; i < y; i++) //Смещение на один знак в столбце
{
for (j=0;j < x; j++) //Смещение на один знак в строке
buffer[d]=buffer[d]*mat[i][j];
}
}
fwrite(buffer, sizeof *buffer, count, output);
printf("!!!Выполнено успешно!!!\n"); //Просто так!!!
}
while ( count == sizeof buffer );
fclose(input);
fclose(output);

}
return 0;
}
Sergey26 вне форума Ответить с цитированием
Старый 24.10.2016, 08:22   #17
Sergey26
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 15
По умолчанию

Как провильно код вводить?
Sergey26 вне форума Ответить с цитированием
Старый 25.10.2016, 12:23   #18
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

из личной переписки

Цитата:
Сообщение от evg_m
1. Я не пишу на С++

2.Если в mat будет хотя бы один 0 (а он будет там обязательно), то
buffer[d] как произведение ВСЕХ элементов =0.
Цитата:
Сообщение от Sergey26
Да,но теперь я вообще не понимаю. Как можно методом умножения на матрицу, что-то зашифровать.
если в матрице всегда может появиться 0.
умножение восьми БИТ одного символа (как матрицы 1x8) на 64 элемента шифр-матрицы 8x8 для получения новых ВОСЬМИ бит(матрицы 1x8) шифртекста.

каждый бит отдельно умножаем
Код:
00 0
01 0
10 0
11 1   БИТОВАЯ (логическая поразрядная) операция AND
и складываем
Код:
00 0
01 1
10 1
11 0  БИТОВАЯ(логическая поразрядная) операция XOR (исключающее или)
1. пусть a наш байт для ЗАшифрования
Код:
r =а and 0b10000000;  выделение первого бита;  0b01000000 это будет второй бит; 0b00000001 это восьмой бит.
для "сложения" с другим битом его еще надо будет "сдвинуть" так чтобы он занимал "ту же позицию" (обычно это позиция самого правого, т.е. восьмого бита)
Код:
r =( a and 0b10000000)>>7; // выделили первый бит и сдвинули на 7 позиций (8{в восьмую} - 1{от первой} )
2. для получения КАЖДОГО из восьми БИТОВ результата
2.1.надо эти ВОСЕМЬ элементов "умножить"(не забываем что это ЛОГИЧЕСКОЕ поразрядное умножение {AND} ) на НУЖНЫЕ ВОСЕМЬ элементов mat
2.2.затем "сложить" эти произведения (и тоже ЛОГИЧЕСКОЕ поразрядное сложение {XOR} )
2.3. ПОЛУЧЕННЫЕ результатЫ надо СНОВА вернуть на нужную позицию { << }
2.4. и СОБРАТЬ воедино. {OR | XOR | + }

наименования операторов могут отличаться от правильного (см. цитату в начале поста)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.10.2016 в 12:32.
evg_m вне форума Ответить с цитированием
Старый 25.10.2016, 13:44   #19
Sergey26
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 15
По умолчанию

Спасибо!
Вы довольно подробно и понятно все описали.
Я не селен в программировании.
Но задачу в лабораторной работе выполнить надо,
буду пытаться.
Sergey26 вне форума Ответить с цитированием
Старый 27.10.2016, 10:41   #20
Sergey26
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 15
Смущение Помогите написать код С++

PHP код:
#include <stdlib.h>
#include<iostream>
#include <string>
#include <bitset>
using namespace std;
int main()
   {
     
int i,j,x,y,n;
     
int **mat;
     
setlocale(LC_ALL,"RUSSIAN");
     
printf("Введите количество строк в матрице -");
     
scanf("%d",&x);
     
printf("Введите количество столбцов в матрице -");
     
scanf("%d",&y);  
     
mat=(int **)malloc(sizeof(int*)*y);
     for(
i=0xi++)
        
mat[i]=(int*)malloc(sizeof(int)*x);    
        for(
i=0xi++)
        for(
j=0yj++)
        {
         
printf("Матрица[%d][%d]="i+1j+1);
         
scanf("%d",&mat[i][j]);
        }
     
FILE *input  fopen("исходный.txt""rb+"); // Чтение исходного файла
     
FILE *output fopen("результат.txt""wb+"); //Запись результата кодирования в файл
     
if ( input != NULL && output != NULL )
        {
           
unsigned char buffer[BUFSIZ];
           
size_t countd;
           do
           {
             
count fread(buffersizeof *buffersizeof bufferinput);
             for ( 
0count; ++)//Смищение на 1 
             
{        
               
bitset<CHAR_BITbyte(buffer[d]);//опредиление битов из байта"buffer[d]"
               
byte[n];// бит с "n" порядковым номером в байте
                
for(int n=0i<CHAR_BIT; ++n)//Смищение на 1 бит в байте" byte[n]"
                
for (i=0;yi++)//Смещение на один знак в столбце
                
{
                  for (
j=0;xj++)//Смещение на один знак в строке
                
byte[n]+=byte[n]*mat[i][j];
                }
             }
             
fwrite(buffersizeof *buffercountoutput);
             
printf("!!!Выполнено успешно!!!\n"); //Просто так!!!
           
}
          while ( 
count == sizeof buffer );
         
fclose(input);
         
fclose(output);    
       }
      return 
0;
   } 
Цитата:
Я не знаю как мне из байта "buffer[d]" перевести в биты "byte[n]" и выполнить побитовые логические операции.
Все виды логических операций я нашел(Логическая операция И &&, нам уже известная;Логическая операция ИЛИ ||;Логическая операция НЕ ! или логическое отрицание.), и все остальные виды, но как написать это я не знаю.
Помогите пожалуйста!!!

Последний раз редактировалось Sergey26; 27.10.2016 в 10:45.
Sergey26 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование/дешифрование Andryan00 Общие вопросы Delphi 5 04.06.2016 03:48
Шифрование и дешифрование V_I_P Общие вопросы C/C++ 2 05.11.2013 02:06
шифрование и дешифрование Маша1993 Помощь студентам 0 25.09.2012 15:16
Шифрование и дешифрование shananina-katya Фриланс 2 28.03.2012 21:30
шифрование и дешифрование Dima170792 Помощь студентам 6 21.04.2011 22:31