Decode do Encode

0

Witajcie, jestem nowy na Tym forum.

Potrzebuje pomocy.

Otóż tak wygląda skrypt Decode + Key


	//Script C++

	FILE *fp		= NULL;
	if ((fp = fopen(FileName, "rb")) == NULL) //Read File
	{
		MessageBox(NULL, "File is not Exist.", "error!", MB_OK);
		return -1;
	}
	
	CTString strTempPath;
	wchar_t wchPath[MAX_PATH];
	GetTempPathW(MAX_PATH, wchPath);
	int key[200] = { 175, 69, 88, 154, 124, 169, 186, 145, 167, 95, 63, 59, 82, 175, 10, 4, 162, 163, 14, 121, 30, 143, 188, 167, 136, 161, 160, 59, 81, 77, 175, 11, 196, 90, 74, 187, 102, 118, 38, 112, 150, 27, 50, 91, 98, 84, 26, 135, 173, 11, 161, 42, 192, 189, 7, 32, 81, 120, 18, 163, 9, 127, 64, 91, 120, 53, 62, 191, 101, 22, 101, 45, 125, 102, 170, 4, 94, 98, 69, 53, 136, 26, 86, 71, 116, 133, 19, 8, 84, 42, 107, 181, 100,75, 103, 24, 162, 159, 170, 46, 22, 34, 34, 152, 109, 116, 117, 90, 20, 3,138, 183, 51, 164, 27, 183, 42, 193, 175, 187, 35, 55, 107, 60, 114, 119, 144, 50, 199, 146, 41, 134, 127, 24, 31, 102, 191, 133, 161, 199, 16, 128, 187, 81,104, 124, 130, 135, 48, 120, 182, 169, 184, 183, 12, 167, 126, 174, 38, 189, 172,68, 91, 73, 162, 5, 56, 28, 134, 125, 192, 108, 33, 175, 171, 106, 67, 27, 156,190, 189, 10, 2, 79, 164, 72, 150, 144, 13, 63, 176, 17, 96, 171, 28, 148, 37, 114, 119, 99 }; //Any chars will work, in an array of any size
	int key_size = 200;
	int i = 0;
	FILE *fp;
	char mbstr[MAX_PATH];
	std::wcstombs(mbstr, wchPath, MAX_PATH);
	strTempPath.PrintF(mbstr);
	fp = fopen(strTempPath + "tempsa", "w+b");
	int ch;
	while ((ch=getc(fe)) != EOF) {
		putc(ch ^ key[i % key_size], fp);
		i++;
	}

Potrzebowałbym przerobić go na Encode :-) pomoże ktoś?

0

Zdaje się, że jest to zwyczajny xor, czyli szyfrowanie następuje w taki sam sposób, jak deszyfrowanie (tj. tym samym kluczem oraz algorytmem) ;-)

0

A przekształcisz mi to w Funkcje Szyfrowania tego otwartego pliku?

if ((fp = fopen(FileName, "rb")) == NULL) //Read File

0

Wracając do tematu

Zrobiłem taki Endoding do pliku

void CFileSecure::EncodeFileAssasinPL( CFile *file )
{
	int size = file->GetLength();
	for (int i = 0; i < size; i++)
	{
	file->Seek(i, CFile::begin);
	int key[200] = { 175, 69, 88, 154, 124, 169, 186, 145, 167, 95, 63, 59, 82, 175, 10, 4, 162, 163, 14, 121, 30, 143, 188, 167, 136, 161, 160, 59, 81, 77, 175, 11, 196, 90, 74, 187, 102, 118, 38, 112, 150, 27, 50, 91, 98, 84, 26, 135, 173, 11, 161, 42, 192, 189, 7, 32, 81, 120, 18, 163, 9, 127, 64, 91, 120, 53, 62, 191, 101, 22, 101, 45, 125, 102, 170, 4, 94, 98, 69, 53, 136, 26, 86, 71, 116, 133, 19, 8, 84, 42, 107, 181, 100,75, 103, 24, 162, 159, 170, 46, 22, 34, 34, 152, 109, 116, 117, 90, 20, 3,138, 183, 51, 164, 27, 183, 42, 193, 175, 187, 35, 55, 107, 60, 114, 119, 144, 50, 199, 146, 41, 134, 127, 24, 31, 102, 191, 133, 161, 199, 16, 128, 187, 81,104, 124, 130, 135, 48, 120, 182, 169, 184, 183, 12, 167, 126, 174, 38, 189, 172,68, 91, 73, 162, 5, 56, 28, 134, 125, 192, 108, 33, 175, 171, 106, 67, 27, 156,190, 189, 10, 2, 79, 164, 72, 150, 144, 13, 63, 176, 17, 96, 171, 28, 148, 37, 114, 119, 99 }; //Any chars will work, in an array of any size
	int key_size = 200;
	file->Write(&key[i % key_size], sizeof(int));
	}
	return;
}

Działa tak jak chciałem,
lecz próbuje zrobić Decode, i mam problem ponieważ nie dekoduje mi,
pomożecie oto mój decode:

bool CFileSecure::DecodeFileAssasinPL( CFile *file )
{
	int size = file->GetLength();
	for (int i = 0; i < size; i++)
	{
	file->Seek(i, CFile::begin);
	int key[200] = { 175, 69, 88, 154, 124, 169, 186, 145, 167, 95, 63, 59, 82, 175, 10, 4, 162, 163, 14, 121, 30, 143, 188, 167, 136, 161, 160, 59, 81, 77, 175, 11, 196, 90, 74, 187, 102, 118, 38, 112, 150, 27, 50, 91, 98, 84, 26, 135, 173, 11, 161, 42, 192, 189, 7, 32, 81, 120, 18, 163, 9, 127, 64, 91, 120, 53, 62, 191, 101, 22, 101, 45, 125, 102, 170, 4, 94, 98, 69, 53, 136, 26, 86, 71, 116, 133, 19, 8, 84, 42, 107, 181, 100,75, 103, 24, 162, 159, 170, 46, 22, 34, 34, 152, 109, 116, 117, 90, 20, 3,138, 183, 51, 164, 27, 183, 42, 193, 175, 187, 35, 55, 107, 60, 114, 119, 144, 50, 199, 146, 41, 134, 127, 24, 31, 102, 191, 133, 161, 199, 16, 128, 187, 81,104, 124, 130, 135, 48, 120, 182, 169, 184, 183, 12, 167, 126, 174, 38, 189, 172,68, 91, 73, 162, 5, 56, 28, 134, 125, 192, 108, 33, 175, 171, 106, 67, 27, 156,190, 189, 10, 2, 79, 164, 72, 150, 144, 13, 63, 176, 17, 96, 171, 28, 148, 37, 114, 119, 99 }; //Any chars will work, in an array of any size
	int key_size = 200;
	file->Read(&key[i % key_size], sizeof(int));
	}
	return size;
}
0

Dlaczego zapisujesz do pliku sam klucz?
Nie powinieneś szyfrować jakichś danych?

0

Mój programik polega na tym że :
Zczytuje z Bazy danych, zapisuje do pliku z kluczem jest ok
Jednak gdy próbuje zczytać to dostaje błąd

Encodinng pobiera mi długość pliku i zapisuje go na klucz
A decoding chce aby zczytywał klucz i dalej pokazał normalną wartość

1

Nie rozumiem WTF. Miałeś przecież sensowne decode a teraz dałeś jakieś file->Read(&key[i % key_size], sizeof(int)); totalnie z d**y, które nie robi nic sensownego. A te wszystkie seek i jakieś zapisywanie / czytanie po znaku to już dramat jest.

  1. Wczytaj cały plik
  2. Zrób xora w pętli z tym twoim kluczem
  3. Zapisz wynik

Jest to przepis zarówno dla encode jak i dla decode, bo przecież robią to samo.

0

Rozumiem, tyle że Jedno narzędzie Zczytuje z DB i zapisuje zaszyfrowany plik, inne narzędzie ma zczytać zaszyfrowany plik poprawnie używając klucza. Chyba teraz dobrze to napisałem

1

Jakbyś pisał ten kod po ludzku z zachowaniem zasady jednej odpowiedzialności to nie byłoby problemu. Podziel to na sensowne funkcje a nie pakuj wszystkiego do jednej i nagle nie trzeba będzie copypaste i kombinowania:

  1. Funkcja która czyta zawartość pliku i ją zwraca jako jakiegoś stringa/tablicę
  2. Funkcja która przyjmuje dane, xoruje je z kluczem i zwraca to co wyszło
  3. Funkcja która zapisuje podane dane do pliku

I nagle życie staje się proste bo zarówno decode jak i encode można sobie z tych 3 funkcji złożyć.

0

Kodowanie wyciągnięte do osobnej klasy:

class XorCoder {
public:
     template<typename T>
     XorCoder(T b, T e) : secret{ b, e } {}
     XorCoder(std::initializer_list<char> initList) : secret{ initList } {}
     XorCoder(std::string_view sv) : secret{ sv.begin(), sv.end() } {}

     void reset() { index =0; }

     char code(char ch) {
        return ch ^ secret[postIncIndex()];
     }

     template<typename T>
     void code(T b, T e) {
          std::transform(b, e, b, [this](char ch){ return code(ch); });
     }

     template<size_t n>
     void code(char (&tab)[n]) {
         code(std::begin(tab), std::begin(tab));
     }

private:
     size_t postIncIndex() {
        auto i = index++;
        if (index >= secret.size()) index=0;
        return i;
     }

private:
     const std::vector<char> secret;
     size_t index = 0;
};
0

Siedzę i się męczę, kompletnie nie ogarniam C++ ;-) a potrzebuje to dodać ponieważ chcę zablokować kilka plików przed edycją niechcianych użytkowników.

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