• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

szyfr c++,problem

VPS Starter Arubacloud
0 głosów
1,475 wizyt
pytanie zadane 2 grudnia 2017 w C i C++ przez Krystek102 Bywalec (2,440 p.)

W zadaniu rozważamy teksty zbudowane tylko z wielkich liter alfabetu angielskiego, znaków odstępu i znaków przestankowych (przecinek, kropka). Oto litery alfabetu i numery ich pozy- cji w alfabecie:

A=0,B=1,C=2...Z=25

Szyfrowanie Vigenère’a polega na zastąpieniu każdej litery tekstu źródłowego literą odległą od niej cyklicznie w alfabecie o k pozycji.
Wartość k nie jest z góry ustalona dla całego tekstu źródłowego, lecz dla każdej litery w tekście jest określana osobno, w oparciu o słowo przyjęte jako klucz szyfrowania.
Przystępując do szyfrowania, należy przyporządkować kolejnym literom tekstu źródłowego kolejne litery klucza, chodząc po nim cyklicznie, jeśli jest krótszy od szyfrowanego tekstu. Znaki inne niż litery nie są szyfrowane, pomijamy je podczas przypisywania liter klucza. Po- zycja litery klucza w alfabecie jest tą wartością k, o jaką należy wykonać przesunięcie względem litery tekstu źródłowego w celu znalezienia odpowiadającej jej litery szyfru.
Przykład
tekst źródłowy: ”JEST OK”, klucz: ”EWA”

wynik szyfrowania: ”NASX KK”.

W pliku dokad.txt znajduje się jeden wiersz z tekstem. Długość tekstu nie przekracza 1024 znaków. Należy zaszyfrować ten tekst metodą Vigenère’a, używając jako klucza słowa: ”LUBIMYCZYTAC”.
a) Podaj liczbę powtórzeń klucza niezbędną do zaszyfrowania całego tekstu źródłowego (uwzględniając w nich ostatnie rozpoczęte powtórzenie).
b) Podaj zaszyfrowany tekst i zapisz go w pliku z odpowiedziami

na początku chciałem zaszyfrować tekst źródłowy przykładowy :"JEST OK" ,klucz"EWA",niestety,ale źle szyfruje,nie wiem gdzie mogłem popełnić błąd 

oto kod :

#include <iostream>
#include <fstream>

using namespace std;
 char znak[12]={'L','U','B','I','M','Y','C','Z','Y','T','A','C'};
 char znak1[3]={'E','W','A'};
string szyfr(string s)
{
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='A' && s[i]<='Z')
        {
            int c=s[i]-'A';
            c=s[i]+(znak1[(i%3)]-'A');
            c%=26;
            s[i]=c+'A';
        }

    }
    return s;
}
int main()
{
    /*
   string s;

   ifstream we("zz.txt");

      while(getline(we,s)!=NULL)
      {

      }
cout<<s;
cout<<"-------------------------------------------------------------"<<endl;
*/
cout<<szyfr("JEST OK");

    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 2 grudnia 2017 przez 0e85dc6eaf Dyskutant (8,840 p.)
Ok są dwa problemy:

1. c=s[i]+(znak1[(i%3)]-'A'); a powinno być c+=(klucz[(i%3)]-'A');

2. Kiedy masz spację w plaintext to i tak inkrementujesz zmienną i więc wyraz OK będzie zaszyfrowany literami AE z klucza zamiast WA (chyba że miałeś to zrobić właśnie w taki sposób), musisz dać drugą zmienną, którą będziesz inkrementować tylko w tym ifie
komentarz 2 grudnia 2017 przez Krystek102 Bywalec (2,440 p.)
1.zrobiłem ,działa :)

2.za bardzo nie rozumiem gdzie tkwi błąd,po spacji wypisuje zły szyfr...>
1
komentarz 2 grudnia 2017 przez 0e85dc6eaf Dyskutant (8,840 p.)

Powiedzmy, że coś w tym stylu

for(int i=0,k=0;i<s.size();i++)
{
	if(s[i]>='A' && s[i]<='Z')
	{
		int c=s[i]-'A';
		c+=(znak1[(k%3)]-'A');
		c%=26;
		s[i]=c+'A';
		k++;
	}
}

 

komentarz 2 grudnia 2017 przez 0e85dc6eaf Dyskutant (8,840 p.)
tylko zrób to w taki sposób, żeby działało niezależnie od użytego klucza ;)
komentarz 2 grudnia 2017 przez Krystek102 Bywalec (2,440 p.)
ok,dzięki za pomoc :)

Podobne pytania

0 głosów
0 odpowiedzi 10,613 wizyt
0 głosów
1 odpowiedź 1,422 wizyt
pytanie zadane 5 maja 2016 w C i C++ przez Linker Bywalec (2,690 p.)
+1 głos
1 odpowiedź 494 wizyt
pytanie zadane 12 czerwca 2016 w C i C++ przez Szejk Obywatel (1,510 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...