2016-06-22 10 views
3

私はいくつかの入力を受け取り、vignere cypherを使ってそれを暗号化するC++プログラムを作成しようとしました。vigenere cypher in C++

私の入力は次のとおりです。

alpdvpjemqvayqnenfxozsgpqalpwgcozfg

迅速な茶色のキツネは、のろまなイヌに飛びかかっこの出力キー "hello" を与え、

復号化された、sp以下のうちells:

theshiftbcownfzxjumasovecthelsvkous

cypheringの50%を超えるビットが正確であると私は私がこれを行うことができたか見当がつかない。私はおそらく剰余演算子と間違って何かをやっているように私は感じ

#include <iostream> 
#include <string> 
#include <cstring> 
#include <fstream> 
#include <sstream> 
#include <streambuf> 
#include <locale> 

class Passcode { 
private: 
    std::string passcode; 
public: 
    void set_passcode(const std::string pc){ 
     passcode = pc; 
    } 
    char get_char(std::size_t index){ 
     return passcode[index]; 
    } 
    std::size_t get_size(){ 
     return passcode.length(); 
    } 
}; 

int find_index(char* arr, const std::size_t SIZE, const char flag){ 
    for(std::size_t i=0; i<SIZE; ++i){ 
     if (arr[i]==flag) return i; 
    } 
    return -1; 
} 

int main() { 
    char alphabet[26] = {'a','b','c','d','e','f','g','h', 
       'i','j','k','l','m','n','o','p', 
       'q','r','s','t','u','v','w','x', 
       'y','z'}; 

    //grab input 
    std::ifstream input("input.txt"); 
    std::stringstream buf; 
    buf << input.rdbuf(); 
    std::string str = buf.str(); 

    //codify string 
    //no spaces, no caps, etc. 
    std::locale loc; 
    std::string uncyphered_text; 
    for(std::size_t i=0; i<str.length(); ++i){ 
    if(str[i]!=' ') uncyphered_text+=std::tolower(str[i],loc); 
    } 

    //grab key 
    std::cout << "Enter your passcode: "; 
    std::string in; std::cin >> in; 
    Passcode pass; pass.set_passcode(in); 

    //encypher text 
    std::string encyphered_text; 
    for(std::size_t i=1; i<=uncyphered_text.length(); ++i){ 
    char current_char = pass.get_char(i%pass.get_size()-1); 
    int current_char_index = find_index(alphabet, 26, current_char); 
    int current_cypher_index = find_index(alphabet, 26, uncyphered_text[i-1]); 
    encyphered_text+=alphabet[(current_char_index+current_cypher_index)%26]; 
    } 

    std::cout << encyphered_text << std::endl; 

    return 0; 
} 

私のコードは次のようです。

+1

暗号化されたテキスト*は何であるべきかご存知ですか?暗号化に問題があり、復号化に問題はないと確信していますか?あなたは、デバッガで行ごとにコードをステップ実行しようとしましたか? –

+0

@Joachimは、ここではキャップで暗号化され、適切な暗号化をどのように見えるべきかですが、小文字で私の失敗した:(iのフォーマットで吸う申し訳ありません) ALPDK PJEMF VAYQC ENFXD ZSGPF ALPWO GCOZU alpdv pjemq vayqn enfxo zsgpq alpwg cozfg –

+0

まあ、 - 1は必要ありません。mod演算子は値[0..n-1]になります。あなたのforループは0から始まり、<を使い、 '++ 'は読者を混乱させるので、' i ++ 'を使ってください。 –

答えて

2

問題:モジュロと悪いインデックスの悪い使用。

//encypher text 
    std::string encyphered_text; 
    for(std::size_t i=0; i<uncyphered_text.length(); ++i){ 
    char current_char = pass.get_char(i%pass.get_size()); 
    int current_char_index = find_index(alphabet, 26, current_char); 
    int current_cypher_index = find_index(alphabet, 26, uncyphered_text[i]); 
    encyphered_text+=alphabet[(current_char_index+current_cypher_index)%26]; 
    } 

それは私のために働いた。