Problema Cifrario di cesare con chiave una stringa.

di Anonimizzato27780 il
12 risposte
Ciao, è da un po' che sto cercando di risolvere questo problema con il Cifrario di Cesare dove, assegnato un testo ed una chiave (entrambi stringhe e della stessa lunghezza), ogni lettera del testo originale viene sostituita aggiungendo la posizione della corrispondente lettera della chiave.

Per esempio, se ho C devo aggiungere due posizioni al testo, se ho D ne devo aggiungere tre ecc...

Il codice che ho sviluppato è il seguente, utilizzando i caratteri come interi secondo la codifica ASCII. E sembra funzionare con i singoli caratteri e con alcune stringhe, ma inizia a buggarsi all'interno di altre superando il valore '90' che corrisponde alla 'Z'.
La mia supposizione è che sia un problema di buffer (?) anche se non ne sono molto sicuro.

Di seguito il codice.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

void cifratura (char te[], char ch[], char ci[]);



void main()
{
    char testo[MAX], cifrato[MAX], chiave[MAX];
    printf("Inserire il testo da cifrare\n(N.B. il testo deve essere il maiuscolo e senza spazi.)\n\n");
    gets(testo);
    printf("Inserire una chiave di cifratura, con le stesse modalita' del testo.\n\n");
    gets(chiave);
    printf("La cifratura del vostro testo e':\n");

    cifratura(testo,chiave,cifrato);
}

void cifratura (char te[], char ch[], char ci[])
{
    int i=0;

        if (te[i]<65 || te[i]>90 || ch[i]<65 || ch[i]>90 || ch[i]==32 || te[i]==32)
            printf("Errore: chiave o testo inseriti in modo errato.\n");

else
{
            if ((te[i]+(ch[i]-65))<90)
            {
                for (i=0;i<strlen(te);i++)
                    ci[i]=te[i]+(ch[i]-65);
            }

            else
            {
                for (i=0;i<strlen(te);i++)
                ci[i]=(((ch[i]-65)+te[i])-90)+65;
            }
        for (i=0;i<strlen(te);i++)
            printf("%c",ci[i]);
    }
}

12 Risposte

  • Con quale input hai problemi? Dacci una stringa e una chiave
  • oregon ha scritto:


    Con quale input hai problemi? Dacci una stringa e una chiave
    Utilizzando

    Testo:
    FRA

    Chiave:
    FRA

    Mi aspetterei " K J A" mentre invece ho come output "K c A"


    Utilizzando invece

    RRR (TESTO)
    JJJ (CHIAVE)

    il risultato è corretto, cioè "BBB"
  • Ma scusa che senso ha
        int i=0;
    
            if (te[i]<65 || te[i]>90 || ch[i]<65 || ch[i]>90 || ch[i]==32 || te[i]==32)
                printf("Errore: chiave o testo inseriti in modo errato.\n");
    i non vale zero in quel punto?

    Comunque ti consiglio di rivedere l'impostazione e di fare
    
    if ((te[i] >= 'A') && (te[i] <= 'Z'))
    	te[i] = ((te[i] - 'A' + [carattere scelto maiuscolo] - 'A') % 26) + 'A';
    else if ((te[i] >= 'a') && (te[i] <= 'z'))
    	te[i] = ((te[i] - 'a' + [carattere scelto maiuscolo] + 32 - 'a') % 26) + 'a';
    // else te[i] rimane uguale		
    
    o qualcosa del genere
  • Beh ...
    
    te[i] + (ch[i] - 65);
    
    sarebbe

    82 + (82 - 65)

    che fa 99 ovvero il codice del carattere c

    Come mai ti attendi J ?

    P.S. Il controllo che fai all'inizio della funzione vale solo per i=0 ovvero solo per il primo carattere non essendoci una for ...
  • Sì, pensandoci mi sono sfuggite molte cavolate.
    Cercherò, di rivedere il codice attenendomi ai vostri consigli, chiedo scusa se ho scritto cose sbagliate ma sono un totale inesperto :C
  • All'ora:
    cominciamo col dire che quello non è un cifrario di Cesare ma un cifrario di Vigenere con verme (per Vigenere si dice verme, non chiave) lungo quanto il messaggio in chiaro
    e già questo la dice tutta sul tipo di "analisi preventiva" che è stata fatta su questo problema...
    ma vabbe' teniamocelo
    il problema in particolare è stato confondere la codifica ASCII con l'alfabeto utilizzato dal messaggio
    è ben vero che le stringhe sono rappresentate in ASCII, ma il testo in chiaro e quello cifrato e anche ilverme sono rappresentati in un SOTTO-insieme dell'alfabeto ASCII, ed è in quel SOTTO-insieme che vanno fatti i calcoli di somma, riporto etc etc
    per intenderci i calcoli non vanno fatti in modulo 256 (intero alfabeto a 8 bit) e nemmeno in moduli 128 (codifica ASCII classica), ma in modulo 26 (26 lettere, no spazi, no numeri, no segni, no minuscole)
    se fatti in questa maniera i conti tornano
    magia...? no: analisi del problema
  • StandardOil ha scritto:


    All'ora:
    cominciamo col dire che quello non è un cifrario di Cesare ma un cifrario di Vigenere con verme (per Vigenere si dice verme, non chiave) lungo quanto il messaggio in chiaro
    e già questo la dice tutta sul tipo di "analisi preventiva" che è stata fatta su questo problema...
    ma vabbe' teniamocelo
    il problema in particolare è stato confondere la codifica ASCII con l'alfabeto utilizzato dal messaggio
    è ben vero che le stringhe sono rappresentate in ASCII, ma il testo in chiaro e quello cifrato e anche ilverme sono rappresentati in un SOTTO-insieme dell'alfabeto ASCII, ed è in quel SOTTO-insieme che vanno fatti i calcoli di somma, riporto etc etc
    per intenderci i calcoli non vanno fatti in modulo 256 (intero alfabeto a 8 bit) e nemmeno in moduli 128 (codifica ASCII classica), ma in modulo 26 (26 lettere, no spazi, no numeri, no segni, no minuscole)
    se fatti in questa maniera i conti tornano
    magia...? no: analisi del problema
    Sono alle prime armi. Mi sto impegnando per imparare. Chiedo scusa per la mia ignoranza.
  • StandardOil ha scritto:


    All'ora:
    Direi che è meglio

    Allora

  • Sicuro?
    problema minore
    ma all'ora attuale è ora di cena, allora andiamo a mangiare

    e siccome all'ora che scrivevo era ora di fare chiarezza; allora non ho tolto l'apostrofo

    che comunque non cambia di uno jota il problema dello OP
    sempre Vigenere è
    (che poi sarebbe Vigenère, ma di questo non ti sei accorto?)
  • Mi dispiace che te la sei presa ...

    P.S. Io non sono francese, ma italiano ...
  • Vabbe' nulla di grave
  • FrankFranz ha scritto:



    Mi aspetterei " K J A" mentre invece ho come output "K c A"
    secondo me ti dovresti aspettare "K I A"
Devi accedere o registrarti per scrivere nel forum
12 risposte