Nie ogarniam tego.
Więc tak.
Chce stworzyć program który zabezpieczany będzie hasłem, lecz nie typowym hasłem które wpisze w kod aplikacji, tylko taki który wpisuje hasło w zaszyfrowany plik tak aby użytkownik sam mógł sobie je zmienić. Ale nie zdoła tego zrobić w pliku tekstowym dlatego, że w pliku jest ciąg nieużytecznych losowych znaków, a znaki które odpowiadają za hasło będą na wybranych pozycjach tego pliku (użytkownik tych pozycji nie zna). Te pozycje będą znajdować się bezpośrednio (lub kilka znaków dalej) za konkretnymi wymyślonymi przeze mnie łańcuchami znaków. Dlatego aby wyszukać te pozycje postanowiłem stworzyć 2 aplikacje nazwijmy je A1 i A2.
A1 tworzy plik (załózmy ze nazywa się "in.txt" z hasłem czyli dużo losowych znaków miedzy którymi znajduje się wspomniany konkretny ciąg znaków, a za nim jeden ze znaków odpowiadający za hasło. Można to zobrazować na przykład tak:
LLLLLLLLLmmmm(O1)LLLLLLLLLLLLmmmm(O2)LLLLLLLLLmmmm(O3)...
gdzie:
L -jakiś losowy znak
mmmm -m wymyślony przeze mnie stały ciąg znaków np "abcd"
(O1) -jeden ze znaków hasła (konkretny znak wpisany w kod) istnieje więcej (np 3) O1,O2,O3
algorytm działania A1
-otwiera plik którego nie ma (czyli tworzy plik)
-tworzy tablice typu char przechowującą losowe znaki L
{
-losuje znaki dla tabeli funkcją getch() i wypełnia ją
-wpisuje znaki z tabeli do pliku
-wpisuje łańcuch znaków do pliku czyli nasze mmmm
-wpisuje (O1) (później 2)
}<<tak kilka razy (np 3 razy)
A2 to aplikacja która sprawdza czy znaki po mmmm (czyli O)są takie jak były w pliku stworzonym przez A1.
Jak działa A2?
-sprawdza czy istnieje plik stworzony przez A1.
Krok1 Jeżeli NIE to zamknie aplikacje. (bez pliku aplikacja nie działa)
Krok2 Jeżeli TAK to sprawdzi czy "O" są takie jak wprowadziła aplikacja A1
Krok3 jeśli Krok2 TAK to każe wprowadzić nowe hasło i wpisze je do pliku(zamieni znaki oznaczone literą O [O1,O2,O3]))
Krok4 Jeśli Krok2 NIE to każe wprowadzić hasło które kiedyś było wprowadzone przez A2 po jej pierwszym odpaleniu.
Jak sprawdzić czy O są takie jak były?
-otwiera plk
-szuka ciągu (mmmm) znaków opcją find() i zapisuje pozycje na ktorej znajduje sie ten ciąg
-przeskakuje do miejsca w ktorym kończy sie ciąg(mmmm)
-odczytuje O1 (później O2)
-szuka następnego ciągu (mmmm) i jak wyzej odczytuje O2
az odczyta wszystkie i sprawdzi czy były takie same jak A1 to wprowadziła
jeśli nie to karze wprowadzić nowe hasło o analogicznie jak szukanie będzie zapisywało pojedyncze znaki char w miejsca O1,O2,O3
Jestem w fazie tworzenia i odczytywania "O" z pliku in.txt (na razie nie uwzgledniam mozliwosci braku pliku)lecz jak zawsze są problemy.
Nie wiem dlaczego A1 tworząc plik tworzy o 3 znaki za duźo na końcu pliku i są to znaki "@4A" (przynajmniej u mnie na kompie takie są) dlatego stwierdziłem, że może to posłużyć jako mój ciąg "mmmm".
Kody aplikacji wyglądają tak:
A1
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
void wypelnij( char znaki[] )
{
for( int i = 0; i < 10; i++ )
{
char x =( rand() % 93 + 33 );
znaki[ i ] = x;
}
}
int main()
{
srand( time( NULL ) );
std::cout << "Aplikacja do tworzenia plku z haslem\n";
std::fstream in;
in.open( "in.txt", std::ios::out );
char znaki[ 10 ];
wypelnij( znaki );
in << znaki;
in.close();
return 0;
}
A2
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main()
{
std::string dane;
std::string ciag = "@4A";
size_t poz_szuk;
std::cout << "Program\n";
std::fstream in;
in.open( "in.txt", std::ios::out | std::ios::in );
std::cout << "Czy otwarto? " << in.is_open() << "\n";
std::cout << "Grzie czyta?" << in.tellg() << "\n";
in >> dane;
std::cout << "Grzie czyta?" << in.tellg() << "\n";
poz_szuk =( dane.find( ciag ) );
in.seekp( poz_szuk, std::ios_base::beg );
dane = "";
std::cout << "Grzie czyta?" << in.tellg() << "\n";
in >> dane;
std::cout << dane;
in.close();
return 0;
}
Dlaczego wypisuje to "@4A" w aplikacji A1?
Dlaczego w aplikacji A2 za drugim razem nie wczytuje zawartości pliku do zmiennej chciaż wskaźnik jest na dobrej pozycji?