我正在尝试制作和扩展版本的Caesar Cipher,其中包括ASCII值32(这是一个空格)的所有7位ASCII字符到126(这是一个代字号),但问题是我怎样才能确定我的程序只使用那些ASCII字符而不是跳转到使用奇怪的DEL符号或扩展的ASCII图表。
对于ex - 如果我键入小写“u”并输入10作为键我会得到del符号,但是当我输入小写“u”时我想得到一个空格
这是我到目前为止的代码
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
string Encrypt(string, int);
int main(int argc, char *argv[])
{
string Source;
int Key;
cout << "Source: ";
getline(cin, Source);
cout << "Key: ";
cin >> Key;
cout << "Encrypted: " << Encrypt(Source, Key) << endl;
system("pause");
}
string Encrypt(string Source, int Key)
{
string Crypted = Source;
for (int Current = 0; Current < Source.length(); Current++)
Crypted[Current] += Key;
return Crypted;
}
答案 0 :(得分:1)
简单:只需复制任何超出祝福范围的输入值而无需修改,只需要进行两次比较:
if(x<' ' || x>126)
copy();
else
encode();
凯撒密码的算法是:
除此之外:您可能还需要在申请之前映射密钥。
答案 1 :(得分:1)
好吧我发现我所做的只是修改公式以强制程序循环通过ASCII值32 - 126,
Crypted[Current] = ((Crypted[Current] + key) - 32) % 95 + 32;(Encrypting)
Crypted[Current] = ((Crypted[Current] - key) - 32 + 3 * 95) % 95 + 32; (Decrypting)
感谢Greg的想法
这是完整的代码工作
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
string encrypt(string, int);
string decrypt(string source, int key);
int main(int argc, char *argv[])
{
string Source;
int Key;
cout << "Source: ";
getline(cin, Source);
cout << "Key: ";
cin >> Key;
cout << "Encrypted: " << decrypt(Source, Key) << endl;
system("pause");
}
string encrypt(string source, int key)
{
string Crypted = source;
for (int Current = 0; Current < source.length(); Current++)
Crypted[Current] = ((Crypted[Current] + key) - 32) % 95 + 32;
return Crypted;
}
string decrypt(string source, int key)
{
string Crypted = source;
for (int Current = 0; Current < source.length(); Current++)
Crypted[Current] = ((Crypted[Current] - key) - 32 + 3 * 95) % 95 + 32;
return Crypted;
}