2017-05-06 39 views
0

HZVIG.cpp:V @ genere加密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

謝謝你的回答。我明白了什麼是錯誤的:函數應該忽略非字母符號。 –