Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23

    [C++] cifrario di vigenere

    ho trovato questo esempio interessante di unìimplementazione del cifrario di Vigenere, ma non riesco a capire bene il funzionamento di queste due funzioni.

    codice:
    string encrypt(string text)   {
          string out; for(int i = 0, j = 0; i < text.length(); ++i)
         {
                char c = text[i];
              if(c >= 'a' && c <= 'z')
              c += 'A' - 'a';
              else if(c < 'A' || c > 'Z')
                continue;
         out += (c + key[j] - 2*'A') % 26 + 'A';
         j = (j + 1) % key.length();
          }
     return out;
     }
    
      string decrypt(string text)
       {
          string out;
            for(int i = 0, j = 0; i < text.length(); ++i)
         {
            char c = text[i];
              if(c >= 'a' && c <= 'z')
              c += 'A' - 'a';
            else if(c < 'A' || c > 'Z')
              continue;
              out += (c - key[j] + 26) % 26 + 'A';
             j = (j + 1) % key.length();
          }
            return out;
        }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    a parte che non ho capito quanto cambia col precedente post (e si capiva che era c++), dove è la tua difficoltà maggiore?
    Sai come funziona il cifrario di vigenere?
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    si conosco il cifrario di vigenere. in particolare non riesco bene a capire queste due istruzioni

    codice:
    c+='A'-'a'
    codice:
    out+=(c+key[j]-2*'A')%26+'A'

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    già è qualcosa.
    Sai che le lettere possono essere rappresentate tramite 7 bit (l'ASCII) e che un char e un intero, nel range 0-127, possono essere considerati intercambiabili?
    in fase di cifratura tu sommi al tuo carattere la differenza tra il valore decimale di A (65) e quello di a (97) e l'output in questo caso vale
    codice:
    out+=(c+key[j]-2*'A')%26+'A'
    key[i] - (2*'A') = temp1

    c + temp1 = temp2

    temp2%26 = temp3 //per avere circolarità

    temp3+'A'


    il perché è stata scelta questa implementazione devi chiederlo a chi lo ha scritto (io avrei fatto in altro modo)
    RTFM Read That F*** Manual!!!

  5. #5
    Originariamente inviato da robdb
    codice:
    c+='A'-'a'
    Beh qui semplicemente sta convertendo in maiuscolo...

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    grazie, adesso è molto chiaro.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23

    [C++] Vigenere con alfabeto italiano

    devo scrivere un programma che implementi l'algoritmo di Vigenere utilizzando l'alfabeto italiano. Dopo quasi un giorno (mi considero fortunato essendo all'inizio) sono riuscito a scrivere qualcosa, pensando fosse corretto. Inutile dirvi il rammarico quando ho scoperto che non era cosi. il codice è il seguente:
    codice:
    #include "vigenere.h"
    #include <string>
    using namespace std;
    
    Vigenere::Vigenere(string str){
                           key = str;
                           key = StringToUpper(key);
                           for(int cnt = 0; cnt < key.length(); cnt++){
                                   if(key[cnt] < 'A' || key[cnt] > 'Z')
                                   key.erase(cnt,1);
                           }
                           
                           //nel caso in cui la chiave sia più corta del testo
                           for(int cnt = 0; cnt < text.length(); cnt++){
                                   if(key.length() != text.length()){
                                                   if(key.length() < text.length())
                                                   key += key[cnt];
                                                   }                
                           }
                                                                          
                           return;
    }                   
    
    //tavola di Vigenere con alfabeto italiano
    char Vigenere::Table(string alphabet){
                           int temp;
                           temp = alphabet.length(); 
                           int ROWS(temp);
                           int COLS(temp);
                           char ALPH[temp];
                           for(int i = 0; i < temp; i++){
                                   ALPH[i] = alphabet[i];
                           }
                           char VIG[ROWS][COLS];
                           
    	                   for(int i = 0; i < ROWS; i++){		                       
    		                           for(int j = 0; j < COLS; j++){
    			                       VIG[i][j]=ALPH[(i + j)%21];
    			                       }
                            }
                            return VIG[ROWS][COLS];
    }
    
    string Vigenere::StringToUpper(string convstr){
           for(int cnt = 0; cnt < convstr.length(); cnt++){
                   convstr[cnt] = toupper(convstr[cnt]);
                   }
           return convstr;
    }
    
    //elimina i caratteri speciali, tenendo solo le lettere
    string Vigenere::EraseChar(string str){
           for (int i = 0; i < str.length(); i++){
               if(!(str[i] >= 'A' && str[i] <= 'Z'))
                           str.erase(i,1);
                           i--;
                           }
           return str;
    }   
    
    string Vigenere::encode(string text){
           string line;
                  
           //cerca il valore corrispondente alla chiave nella prima colonna di VIG
           int index_k;
           for(int i = 0; i < ROWS; i++){ 
                   if(key[i]==VIG[i][1])
                   index_k = i;
           }
           
           //cerca il valore corrispondente al testo nella prima riga di VIG
           int index_t;
           for(int i = 0; i < COLS; i++){
                   if(text[i]==VIG[1][i])
                   index_t = i;
           }
           
           //calcola la lettera codificata
           for(int i = 0; i < text.length(); i++){
                   line[i] = ALPH[(index_k + index_t)%21];
           }
           
           line = StringToUpper(line); 
           if(!line.empty()){
               line = EraseChar(line);
               }
               
           return line;
    }
    
    string Vigenere::decode(string text){
           string line;
                  
           //cerca il valore corrispondente alla chiave nella prima colonna di VIG
           int index_key;
           for(int i = 0; i < ROWS; i++){
                   if(key[i]==VIG[i][1])
                   index_k = i;
           }
           
           //nella riga i-esima cerca la lettera corrispondente al carattere cifrato
           int index_d;
           for(int i = 0; i < COLS; i++){
                   if(text[i] == VIG[index_key][i])
                   index_d = i;
           }
           
           //calcola la lettera decodificata
           for(int i = 0; i < text.length(); i++){
                   line[i] = ALPH[index_d];
           }
           
           line = StringToUpper(line);
           if(!line.empty()){
               line = EraseChar(line);
               }
               
           return line;
    }
    potete per favore darmi una mano

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Ho unito la discussione a quella aperta precedentemente, visto che si tratta della continuazione del medesimo problema/esercizio.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: [C++] Vigenere con alfabeto italiano

    Originariamente inviato da robdb
    potete per favore darmi una mano
    la mano te la diamo volentieri, ma che errore hai? cosa fa il programma che non dovrebbe e cosa invece non fa?
    Un modo per capire l'errore ci aiuta ad aiutarti, non sempre si può prendere e debuggare un programma di altri solo per un aiutino
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    fortunatamente ho risolto da solo, almeno per quel che riguarda l'implementazione della classe. speriamo che il resto proceda meglio. sono quasi sicuro che ci sentiremo molto presto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.