# PBinfo #2417 – criptare1 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Mircea şi Vasilică vor să-şi trimită mesaje pe care alţii să nu le înţeleagă. Au citit ei despre spioni şi modalităţi de a scrie mesaje şi, în final, au imaginat un mod de criptare a unui mesaj care foloseşte “cuvânt cheie” (le-a plăcut lor denumirea asta :-) ).

Alegându-şi un cuvânt cheie format numai din litere distincte, ei numără literele acestuia şi împart mesajul în grupe de lungime egală cu numărul de litere ale cuvântului cheie, şi le aşează una sub alta. Desigur, se poate întâmpla ca ultima grupă să fie incompletă, aşa că o completează cu spaţii. Apoi numerotează literele cuvântului cheie în ordinea apariţiei lor în alfabetul englez. În final, rescriu mesajul astfel: coloana de sub litera numerotată cu 1, urmată de coloana de sub litera numerotată cu 2, etc. înlocuind totodată şi spaţiile cu caracterul *. 

Exemplu:


cuvântul cheie: criptam
mesaj de criptat: Incercam sa lucram cu coduri si criptari.
cuvântul cheie criptam are 7 litere
numerotare: 2635714
deoarece, avem, în ordine: 
abcdefghijklmnopqrstuvwxzy
1 2     3   4  5 6 7
împărţire în grupe: Incerca|m sa lu|cram cu| coduri| si cri|ptari.
codificare:			
2635714
Incerca
m*sa*lu
cram*cu
*coduri
*si*cri
ptari.*
mesaj criptat:
clcrr.Imc**pcsaoiaauuii*eamd*rn*rcstr**uci
col1  col2  col3  col4  col5  col6  col7

Cerința
Fiind date un cuvânt cheie şi un mesaj criptat, decodificaţi mesajul trimis de Mircea pentru Vasilică.

Date de intrare
Fișierul de intrare criptare1.in conţine pe prima linie mesajul criptat iar pe linia a doua cuvântul cheie.

Date de ieșire
Fișierul de ieșire criptare1.out va conţine pe prima linie mesajul decriptat.

Restricții și precizări

lungimea mesajului este de minim 20 si maximum 1000 caractere
cuvântul cheie are minimum 5 şi maximum 20 de caractere
cuvântul cheie conţine numai litere mici ale alfabetului

Exemplu:
criptare1.in

clcrr.Imc**pcsaoiaauuii*eamd*rn*rcstr**uci
criptam
criptare1.out

Incercam sa lucram cu coduri si criptari.

## Cod sursă C++

```cpp
#include <fstream>
#include <cstring>
using namespace std;
char mesaj[1001], cheie[21], c;
int lgm, lgc, l, i, j, apare, cate, col, gasit, k;
int cod[201][21], alfabet[27];
ifstream f("criptare1.in");
ofstream g("criptare1.out");
void citire()
{
  f.getline(mesaj, 1001);
  f.getline(cheie, 21);
  f.close();
}
void decriptare()
{
  lgm=strlen(mesaj);
  lgc=strlen(cheie);
  cate=lgm/lgc;
  apare=0;
  for (c='a'; c<='z'; c++)
    {
      for (i=0; i<lgc; i++)
      if (cheie[i]==c)
	{
	  apare++;
	  alfabet[c-'a'+1]=apare;
	}
    }
  l=0;
  for (i=0; i<lgc; i++)
    for (j=1; j<=26; j++)
      if (alfabet[j]==i+1) ///am gasit litera a i-a (ca numerotare in cheie)
	{
	  ///caut pe ce pozitie in cheie este ca sa determin coloana
	  col=0; gasit=0;
	  while (!gasit)
	    {
	      if (cheie[col]==(char)(j+'a'-1))
		gasit=1;
	      col++;
	    }
	  for (k=1; k<=cate; k++)    //pun in coloana col
	    cod[k][col]=mesaj[l++];
	}
  for (i=1; i<=cate; i++)
    for (j=1; j<=lgc; j++)
      if ((char)cod[i][j]!='*')
	g<<(char)cod[i][j];
      else
	g<<' ';
  g<<endl;
  g.close();
}
int main()
{
  citire();
  decriptare();
  return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2417)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2417/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2417/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
