Problema Cifrario di cesare con chiave una stringa.

di il
12 risposte

Problema Cifrario di cesare con chiave una stringa.

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

  • Re: Problema Cifrario di cesare con chiave una stringa.

    Con quale input hai problemi? Dacci una stringa e una chiave
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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"
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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 ...
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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.
  • Re: Problema Cifrario di cesare con chiave una stringa.

    StandardOil ha scritto:


    All'ora:
    Direi che è meglio

    Allora

  • Re: Problema Cifrario di cesare con chiave una stringa.

    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?)
  • Re: Problema Cifrario di cesare con chiave una stringa.

    Mi dispiace che te la sei presa ...

    P.S. Io non sono francese, ma italiano ...
  • Re: Problema Cifrario di cesare con chiave una stringa.

    Vabbe' nulla di grave
  • Re: Problema Cifrario di cesare con chiave una stringa.

    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