szyfrowanie danych jak ulepszyć

szyfrowanie danych jak ulepszyć
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

jak można jeszcze lepiej ulepszyć ten algorytm:

Kopiuj
char *crypt(char *data,char *key)
{
	int i2=0;
	int k = strlen(data);
	for(int i=0;i<k;i++)
	{
		data[i]+=key[i2];
		data[i] = data[i] ^ key[i2];
		data[i] += 8;
		i2+=1;
		if(i2==strlen(key))
			i2=0;
	}
	return data;
}
AN
  • Rejestracja: dni
  • Ostatnio: dni
2

Zanim będziemy cokolwiek ulepszać, napisz, jaki algorytm ma realizować ten kod i czy ewentualne ulepszenie jest modyfikacją algorytmu, czy poprawą wydajności.

Wrzucić kawałek kodu i nawet nie napisać, jakie zadanie on realizuje jest raczej słabe. Sam fakt, że szyfruje tekst za pomocą innego tekstu będącego kluczem to jest zbyt ogólnikowe. To jakiś tradycyjny algorytm (nazwa), czy customowy algorytm (opis)?

several
  • Rejestracja: dni
  • Ostatnio: dni
3

chodzi o to jak tutaj bardziej nagadać aby szyfrowanie było lepsze, tylko o to mi chodzi ...

Ah, tylko tyle... Całkiem sporo trzeba by zrobić. Obecny szyfr to generalanie xor, pozostałe operacje są zbyt primytywne by zrobiły różnicę więc mógłbyś je usunać bez wpływu na jakość szyfrowania. Kryptolodzy poświęcają całe kariery wokół tego w jaki sposób budować szyfry na podstawie xor, jakbyś chciał zacząć temat to polecam darmowy kurs Cryptography I na courserze autorstwa profesora stanford Dana Boneh.

BTW

Kopiuj
data[i]+=key[i2];

przekręcanie typów znakowych, jak Twój char w tym przypadku. jest Undefined Behaviour.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Dałeś taga C++ a nie C a ten kod wygląda jak kiepskie C.
Nie podoba się projekt tego API. Lepiej, gdy argumenty wejściowe nie są modyfikowane.

Kilka lepszych wersji API

Kopiuj
std::vector<char> crypt(const std::vector<char>& in, const std::vector<char>& key);
std::string crypt(const std::string& in, const std::string& key);
std::string crypt(std::string_view in, std::string_view key);

void crypt(const std::vector<char>& in, const std::vector<char>& key, std::vector<char>* out);
void crypt(std::string_view in, std::string_view key, std::string* out);

Co do samej implementacji:

Kopiuj
void crypt(std::string_view in, std::string_view key, std::string* out) {
    out->clear();
    out->resize(in.size());
    auto key_it = key.begin();

    for (auto [a, r] : std::views::zip(in, *out)) {
        r = (a ^ *key_it) + 8;
        ++key_it;
        if (key_it == key.end()) {
            key_it = key.begin();
        }
    }
}

Niestety w C++ ranges nie ma widoku cycle (jest w bibliotece ranges v3, która była wzorem do ranges ze standardu C++)
Demo.

Swoją drogą wymyślanie swoich prymitywów kryptograficznych nie jest najlepszym pomysłem.
Lepiej nauczyć się używać gotowych rozwiązań z OpenSSL lub innej biblioteki.
Pytanie po co ci to jest potrzebne?


Mały poprawka:

Kopiuj
template <typename R>
concept RangeSafeForCycle = std::ranges::forward_range<R> && std::copyable<R>;

template <RangeSafeForCycle R>
auto make_inf_cycle(R r) -> std::generator<std::ranges::range_value_t<R>> {
    auto it = std::ranges::begin(r);
    const auto end = std::ranges::end(r);

    while (true) {
        co_yield *it;
        if (++it == end) {
            it = std::ranges::begin(r);
        }
    }
}

void crypt(std::string_view in, std::string_view key, std::string* out) {
    out->clear();
    out->resize(in.size());

    for (auto [r, a, k] : std::views::zip(*out, in, make_inf_cycle(key))) {
        r = (a ^ k) + 8;
    }
}

https://godbolt.org/z/Y5MfeT3s1

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.