扩展的Caesar Cipher C ++

时间:2014-04-11 16:30:35

标签: c++

我正在尝试制作和扩展版本的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;
}

2 个答案:

答案 0 :(得分:1)

简单:只需复制任何超出祝福范围的输入值而无需修改,只需要进行两次比较:

if(x<' ' || x>126)
    copy();
else
    encode();

凯撒密码的算法是:

  1. 将所有有效符号映射到以0
  2. 开头的连续非负数
  3. 以符号计数
  4. 的方式添加密钥
  5. 回来。
  6. 除此之外:您可能还需要在申请之前映射密钥。

答案 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;
}