2017-05-06 31 views
0

HZVIG.cpp:Vigenere暗号C++

#include "HZVIG.h" 

char ROTEncode(char inchar, int rot) 
{ 
    if (IsBigLetter(inchar)) 
     return ((int)inchar - (int)'A' + rot) % 26 + 'A' - 1; 
    else if (IsSmallLetter(inchar)) 
     return ((int)inchar - (int)'a' + rot) % 26 + 'a' - 1; 
    else 
     return inchar; 
} 
char ROTDecode(char inchar, int rot) 
{ 
    if (IsBigLetter(inchar)) 
     return ((int)inchar - (int)'A' - rot + 26) % 26 + 'A' - 1; 
    else if (IsSmallLetter(inchar)) 
     return ((int)inchar - (int)'a' + rot + 26) % 26 + 'a' - 1; 
    else 
     return inchar; 
} 
std::string VIGDecode(std::string instring, std::string key) 
{ 
    std::string result; 
    for (int i = 0; i < instring.length(); i++) 
     result += ROTDecode(instring[i], key[i % key.length()] - 'A' + 1); 
    return result; 
} 
std::string VIGEncode(std::string instring, std::string key) 
{ 
    std::string result; 
    for (int i = 0; i < instring.length(); i++) 
     result += ROTEncode(instring[i], key[i % key.length()] - 'A' + 1); 
    return result; 
} 

HZVIG.h:このコードは動作しますが、間違った出力を持ってい

#include <string> 

#define IsBigLetter(a) a >= 'A' && a <= 'Z' 
#define IsSmallLetter(a) a >= 'a' && a <= 'z' 

std::string VIGDecode(std::string instring, std::string key); 
std::string VIGEncode(std::string instring, std::string key); 

C:\Users\adm1n\Desktop\C\HZToolkit>HZToolkit --evig --key ALPHA HZU18{CLASSICAL_CIPHER} 
HKJ18{NAHSSTRHL_NXWHEC} 

それは次のようになります。HKJ18 { JLADHPCAW_RPPHPG} 私は入力が問題ないと思う。 C:¥Users¥adm1n¥Desktop¥C¥HZToolkit> HZToolkit --evig --key ALPHA ALPHA 出力:AWEOA

答えて

0

なぜこれは間違っていると思いますか?平文が文字でないとしても、あなたはまだキーを "前進"させていることに注意してください(少なくとも、あなたのプログラムが現在行っていることです)。

プレーンテキストを並べると、キーの複製:場所は^が付い

 Plain: HZU18{CLASSICAL... 
     Key: ALPHAALPHAALPHA... 
      ^  ^^ ^
    You get: HKJ18{NAHSSTRHL... 
You expect: HKJ18{JLADHPCAW... 

注:(平文の文字が暗号文の文字になります)、これらのキーはAに等しいですので、暗号化は行われません。

私にはうまく見えます。

(解読は壊れています。ヒントとして、ROTDecodeは同じように小文字と大文字を処理しません)。

+0

ありがとうございました。何が間違っているのか理解しました。関数はアルファベット以外の記号を無視する必要があります。 –