[C] Cifratura polialfabetica... HELP

di il
7 risposte

[C] Cifratura polialfabetica... HELP

Salve... avrei bisogno di un aiutino, sono alle prese con un progetto universitario in c, e non so dove sbatterci la testa!
Vi posto la traccia... vorrei soltanto un aiuto per capire come impostare il programma, cosa utilizzare all'interno della function di cifratura per confrontare a coppie di 2 caratteri.
Sviluppare una coppia di algoritmi, implementati come function, per crittografare
e decrittografare un messaggio. L’algoritmo si basa sulla cosiddetta cifratura
polialfabetica, che consiste nel trasformare il messaggio in un testo di lunghezza
maggiore o uguale a quella del messaggio, detto il “testo cifrato”, utilizzando una
matrice di caratteri (prefissata), detta “matrice di sostituzione”. Il messaggio da
crittografare viene dapprima partizionato in coppie di lettere adiacenti; se in tale
partizionamento accade che una coppia è formata dalla stessa lettera, allora si
inserisce una X tra le due. Per esempio, il messaggio è LET US MEET AT
NOON viene partizionato in LE TU SM EX ET AT NO ON. Si è inserito una X
tra le due E, ma non tra le due O, che si trovano in coppie diverse. Si consideri la
seguente matrice di sostituzione:
8 J E Q D N 5 O
P U 3 A R F L W
4 V C 2 T M B I
K 7 Z S G X H Y
Ogni coppia di lettere viene crittografata nel seguente modo:
a. se le lettere sono nella stessa riga della matrice di sostituzione, le due
lettere da inserire nel testo cifrato saranno le lettere immediatamente a
destra nella stessa riga. Ogni riga è considerata circolare. Per esempio, la
coppia TI viene crittografata come M4.
b. se le lettere sono nella stessa colonna della matrice di sostituzione, le due
lettere da inserire nel testo cifrato saranno le lettere immediatamente sotto
nella stessa colonna. Ogni colonna è considerata circolare. Per esempio, la
coppia RG viene crittografata come TD.
c. se le lettere appaiono in differenti righe e colonne della matrice di
sostituzione, ognuna delle due lettere sarà crittografata con la lettera nella
stessa riga ma nella colonna dell’altra lettera.. Per esempio, la coppia LE
viene crittografata come 35.
Il messaggio LET US MEET AT NOON viene quindi crittografato in
35VRX2NZDCR25885.
Il main legge da tastiera il messaggio da crittografare (l’equivalente di LET US
MEET AT NOON nell’esempio), chiama la function di cifratura (passando come
parametro il messaggio e la matrice di sostituzione), che restituisce il teso cifrato,
visualizza il testo cifrato, chiama la function di decifratura, passando come
parametro il testo cifrato e la matrice di sostituzione, visualizza il messaggio
decifrato, che deve coincidere con il messaggio di partenza. Usare solo lettere
maiuscole. Usare le stringhe per rappresentare il messaggio e il testo crittografato
e decrittografato
AIUTOOOOOOOOOOOOOOOOOOOOOOOO

7 Risposte

  • Re: [C] Cifratura polialfabetica... HELP

    In C o in C++? cmq fai una funzione che ti ritorna le posizioni trovate nella matrice + un enum del tipo:
    
    enum
    {
    stessa_colonna,
    stessa_riga,
    pos_diverse
    }; 
    e fai un switch su questo enum e agisci di conseguenza.
  • Re: [C] Cifratura polialfabetica... HELP

    E lo spazio come viene gestito?!
  • Re: [C] Cifratura polialfabetica... HELP

    X qnt riguarda lo spazio bisogna mettere il "-"... scusa skynet nn ho capito cs vuoi dire precisamente...
  • Re: [C] Cifratura polialfabetica... HELP

    Skynet si è espresso chiaramente: crea una funzione che ti restituisca le posizioni e la tipologia della coppia definita con enum
  • Re: [C] Cifratura polialfabetica... HELP

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define RIGHE 4
    #define COLONNE 8
    char messaggio(char*);

    int main()
    {
    char mess[100];
    char mat_sost[4][8]={{'8','J','E','Q','D','N','5','O'},
    {'P','U','3','A','R','F','L','W'},
    {'4','V','C','2','T','M','B','I'},
    {'K','7','Z','S','G','X','H','Y'}};

    printf("Inserire il messaggio da crittografare:\n");
    messaggio(mess);
    system("PAUSE");
    return 0;
    }

    char messaggio(char mess[]){
    int i,l,j=0;
    char messbuffer[100];
    gets(mess);
    strupr(mess);
    puts(mess);
    l=strlen(mess);
    for(i=0;i<l-1;i++)
    {
    if (mess==mess[i+1])
    {
    messbuffer[j]=mess;
    messbuffer[j+1]='X';
    messbuffer[j+2]=mess[i+1];
    j=j+3;
    }
    if(mess==" ")
    {
    messbuffer[j]="-";
    j=j+1;
    }else
    {
    messbuffer[j]=mess;
    j++;
    }
    puts(messbuffer);
    }
    return(messbuffer);
    }


    ragazzi ho provato a fare la parte dv al posto degli spazi mette il trattino e dv trova 2 lettere uguali mette la X ma nn va.... secondo voi dove ho sbagliato????
  • Re: [C] Cifratura polialfabetica... HELP

    Da dove viene sta funzione non è nei standard che io conosco
    
    strupr(char *);
    
  • Re: [C] Cifratura polialfabetica... HELP

    
    for(i=0;i<l-1;i++)
    {
    	if (mess[i]==mess[i+1])
    	{
    		messbuffer[j]=mess[i];
    		messbuffer[j+1]='X';
    		messbuffer[j+2]=mess[i+1];
    		j=j+3;
    	}
    	else
    	{
    		if(mess[i]==" ")
    		{
    			messbuffer[j]="-";
    			j=j+1;
    		}
    		else
    		{
    			messbuffer[j]=mess[i];
    			j++;
    		}
    	}
    }
    
    non ho provato ma credo che ti manchi un else.
Devi accedere o registrarti per scrivere nel forum
7 risposte