我正在尝试制作一个程序,该程序采用编码消息并解码Rot 13和Rot 6密码。 Rot 13部分可以正常工作,但Rot 6部分仅在特定情况下有效(输入“ Yngqkt,tuz yzoxxkj”应翻译为“ Shaken,而不是搅动”,而是返回“ Yhmkqn不是stirrqp”)
const int lCaseA = 97;
const int lCaseM = 109;
const int lCaseN = 110;
const int lCaseZ = 122;
const int uCaseA = 65;
const int uCaseM = 77;
const int uCaseN = 78;
const int uCaseY = 89;
const int uCaseZ = 90;
string rot6(string input) {
int inputSize = input.size();
int index{};
while (index != inputSize) {
if (input[index] >= lCaseA && input[index] <= lCaseM)
input[index] = input[index] + 6;
else if (input[index] >= lCaseN && input[index] <= lCaseZ)
input[index] = input[index] - 6;
else if (input[index] >= uCaseA && input[index] <= uCaseM)
input[index] = input[index] + 6;
else if (input[index] <= uCaseN && input[index] <= uCaseZ)
input[index] = input[index] - 6;
index++;
}
return input;
}
string rot13(string input) { //Decodes into rot 13
int inputSize = input.size();
int index{};
while (index != inputSize) {
if (input[index] >= lCaseA && input[index] <= lCaseM)
input[index] = input[index] + 13;
else if (input[index] >= lCaseN && input[index] <= lCaseZ)
input[index] = input[index] - 13;
else if (input[index] >= uCaseA && input[index] <= uCaseM)
input[index] = input[index] + 13;
else if (input[index] <= uCaseN && input[index] <= uCaseZ)
input[index] = input[index] - 13;
index++;
}
return input;
}
int main() {
string plaintext;
string ans13;
string ans6;
string ansCoffee;
cout << "Whats the message Spy Guy: ";
getline(cin, plaintext);
ans13 = rot13(plaintext);
ans6 = rot6(plaintext);
cout << "One of these is your decoded message" << endl << "In Rot 13: " << ans13 << endl << "In Rot 6: " << ans6 << endl;
return 0;
}
答案 0 :(得分:0)
只有ROT13是可逆的,因为它移动了字母大小的一半。
如果您将ROT6“摇晃,不搅动”,您将得到“ Yngqkt,图兹yzoxxkj”,但是再次使用ROT6时,您将不会得到“摇晃,不搅动”。选中https://rot13.com/。
您对ROT6的实现也是错误的。您仅使用了ROT13实现,并将13
更改为6
。但是ROT13的实现依赖于13是字母大小的一半的事实。对于ROT6而言并非如此。如果要在ROT6实现中使用相同的模式,则必须不将字母表分为两半,而应分为a-t
和u-z
范围。如果输入字母属于第一个范围,则添加6
;如果输入字母属于第二个范围,则减去20
。