Szyfrowanie XOR C++

0

Witam, czy jest ktoś w stanie pomóc z takim zadaniem? Dostaliśmy na roku tego typu zadania i nikt nie wie co teraz z tym zrobic.
Zostaliśmy rzuceni na głęboką wodę w dodatku na zajęciach zdalnych. Proszę o pomoc.

screenshot-20210108120133.png

0

Co już masz? W czym konkretnym masz problem?

0

No w sumie to we wszystkim, nie wiem jak się za to zabrać w ogóle. Co do niektórych kwesti mam jakies pomysły ale nie da się z tego nic sensownego złożyć.

1

Zacznij od wczytywania z pliku po 16 bajtów.

1

Rozwiaz to na kartce dla pierwszych kilku bajtow. Potem napisz czego nie wiesz.

0

No nie wiem właśnie od czego zacząć, szyfr ma byz zapisany w pliku ale sama wiadomosc do zaszyrowania jest wprowadzana w programie bezposednio. Wiem że trzeba beędzie ja zapisac w tablicy jednowymiarowej, ale nie wiem jak ma przebiegać sztfrowanie. Porównywąc do siebie bajty jak w bramce XOR?

1

sama wiadomosc do zaszyrowania jest wprowadzana w programie bezposednio

Możesz sobie ignorować wybiórczo różne części zadania? Jest wyraźnie napisane, że zarówno wejście jak i wyjście to pliki.

A od czego zacząć - już napisałem. Wczytuj po 16 bajtów dane do zaszyfrowania i nic z nimi nie rób, albo wypisuj na wyjście standardowe.

0

ej, ale powinniście mu powiedzieć aby zajrzał sobie do techniki cyfrowej i obejrzał tabele prawdy aby zapoznać się z operacjami logicznymi

https://edux.pjwstk.edu.pl/mat/198/lec/main16.html

poza tym fajna treść zadania, mówię całkiem poważnie

0

Pomogę ci trochę w tym zadaniu i przy okazji prowadzącemu możesz wytknąć błąd, bo się pomylił w obliczeniach (no chyba, że to ja się pomyliłem)

Podpowiedź - musisz napisać algorytm do zamiany liczb dziesiętnych lub szesnastkowych na kod binarny, bo całe to XOR odbywa się na liczbach binarnych, a więc do rzeczy

  1. Litera T w kodzie dziesiętnym w tablicy ASCII widnieje jako 84 co na binarny daje nam 10 10 10 00 jak wygląda XOR ? Przy pierwszym podejściu XOR przeprowadzasz na "wektorze inicjalizującym" - ponieważ jak w treści zadania masz napisane "nie było poprzedniego wyniku" jak to wygląda ?

T -> 10 10 10 00 (7 bitów)
0xAA -> 10 10 10 10 (8 bitów)

jako, że 0xAA ma 8 bitów, to aby przeprowadzić poprawne XOR musisz do bitów litery T dopisać jeden bit z przodu czyli ZERO aby ilość bitów była równa

(T) 01 01 01 00
(0xAA) 10 10 10 10
XOR 11 11 11 10 (co daje liczbę 254 dziesiętnie) i to jest już wynik szyfrowania -> żeby wykonać XOR musisz spojrzeć na tabelę prawdy

(o) 01 10 11 11
(0xFE) 11 11 11 10 (to jest liczba potrzeba do wykonania XOR z poprzedniego wyniku - ta zaszyfrowana)
XOR 10 01 00 01 (co daje liczbę 145 dziesiętnie - 0x91 szesnastkowo) i tutaj wykładowca popełnił błąd na wydruku, co konsekwencją jest, że dalsze obliczenia będą inne niż na wydruku

(spacja) 00 10 00 00
(0x91) 10 01 00 01 (to jest liczba potrzeba do wykonania XOR z poprzedniego wyniku - ta zaszyfrowana)
XOR 10 11 00 01 (co daje liczbę 177 dziesiętnie 0xB1 szesnastkowo)

dalej jest analogicznie.

  1. Najważniejsze w tym programie, to musisz napisać rozkład na liczby binarne (wykorzystasz do tego dzielenie modulo) jak to ogarniesz, to resztę robisz według schematu jaki podałem - po prostu przeprowadzasz obliczenia.

Jeżeli gdzieś się pomyliłem, to chciałbym o wskazanie błędu

4

@zkubinski: cała ta podpowiedź jest kompletnie bez sensu.

musisz napisać algorytm do zamiany liczb dziesiętnych lub szesnastkowych na kod binarny, bo całe to XOR odbywa się na liczbach binarnych,

???
Wczytujesz bajty i na nich operujesz, jakie pisanie konwersji?

Litera T w kodzie dziesiętnym w tablicy ASCII widnieje jako 84 co na binarny daje nam 10 10 10 00

Nope, 8410 to 5416 lub 10101002

żeby wykonać XOR musisz spojrzeć na tabelę prawdy

żeby wykonać mnożenie musisz spojrzeć na tabliczkę mnożenia?

i tutaj wykładowca popełnił błąd na wydruku, co konsekwencją jest, że dalsze obliczenia będą inne niż na wydruku

Nope, kolejnym argumentem xora jest w tym przykładzie numer operacji/bajtu.

Najważniejsze w tym programie, to musisz napisać rozkład na liczby binarne (wykorzystasz do tego dzielenie modulo)

Jest to kompletnie zbędne w tym zadaniu, i jest to wyważanie otwartych drzwi.

Niepotrzebnie fiksujesz się na detalu implementacyjnym, a pomijasz trudniejszą część zadania (poprawna obsługa fragmentarycznego działania na plikach)

2

@zkubinski: tyle demagogii opisującej jeden wiersz kodu?

#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdint>
using namespace std;

void encode(istream &sin,ostream &sout)
{
	uint8_t curr=0,prev=0xAA,count=0;
	for(int ch;(ch=sin.get())!=EOF;++count,prev=curr) sout.put(curr=(ch&0xFF)^prev^count);
}

int main()
{
	istringstream sin("To jest text");
	ostringstream sout;
	encode(sin,sout);
	for(char ch:sout.str()) cout<<hex<<setfill('0')<<setw(2)<<(0xFF&ch)<<' ';
	return 0;
}

https://ideone.com/8mu46d

1 użytkowników online, w tym zalogowanych: 0, gości: 1