我被这个C++凯撒密码加密问题困住了

问题描述 投票:0回答:1

单文件编程问题

问题陈述

您的任务是构建一个程序,使用指定的加密技术对秘密消息进行加密。加密技术涉及根据加密密钥将消息中的每个字符移动一定数量的位置。加密的消息将通过不安全的通道发送,并且只能由知道加密密钥的预期接收者解密。

函数名称:字符串加密字符串

输入格式:

第一行输入是要加密的字符串str。

第二行输入由一个整数组成,n代表加密密钥。

输出格式:

输出显示问题陈述中所述的加密字符串。

代码限制:

1 <= Length of the string, str <= 100

1 <= n <= 5

示例测试用例:

输入1:

欢迎

2

输出1:

ygneqog

输入2:

你好@123

4

输出2:

唇D567

我多次尝试解决这个问题,并且还借助了 ChatGPT 等聊天机器人的帮助。我将我的代码提供给 ChatGPT,因为在我的代码中,一些隐藏的情况失败了。 ChatGPT 改进了我的代码,但现在一个隐藏的测试用例也失败了,我不知道该特定用例的输入。

这是我拥有的最好的代码:

#include <iostream>
#include <cstring>

using namespace std;

string encryptString(string str, int n)
{
    int length = str.length();
    for (int i = 0; i < length; ++i) {
        char ch = str[i];

        if (ch >= 'a' && ch <= 'z') {
            ch = ch + n;
            if (ch > 'z') {
                ch = ch - 'z' + 'a' - 1;
            }
            str[i] = ch;
        } else if (ch >= 'A' && ch <= 'Z') {
            ch = ch + n;
            if (ch > 'Z') {
                ch = ch - 'Z' + 'A' - 1;
            }
            str[i] = ch;
        } else if (ch >= 32 && ch <= 126) {
            ch = ch + n;
            if (ch > 126) {
                ch = ch - 95;
            }
            str[i] = ch;
        }
    }
    return str;
}

int main() {
    cout << "Enter the message: " << endl;
    string msg; getline(cin, msg);

    int key;
    cout << "Enter key: ";
    cin >> key;

    string encryptedMsg = encryptString(msg, key);
    cout << "Encrypted message: " << encryptedMsg << endl;

    return 0;
}

我提供的代码在一个隐藏的情况下失败了。指导我让它变得更加健壮,这样它也能够处理这种情况。

c++ encryption caesar-cipher
1个回答
0
投票
实现凯撒密码

以朱利叶斯·凯撒命名的密码使用了这样简单的移位方法。当您将密码限制为仅字母时,您可以按照此处所述实施。

  1. 将每个字符转换为从零开始的等效字符
  2. 添加加密密钥
  3. 将结果取模 26(即字母表的大小)。为此请使用
    ch % 26
  4. 转换回字符。
从零开始的等价转换

此步骤取决于字符集中彼此相邻的字母。对于 ASCII 字符来说是这样,但对于其他字符集则不一定。

通过减去大写字母

'A'
或小写字母减去
'a'
来转换为从零开始。

通过添加

'A'
(表示大写字母)或
'a'
(表示小写字母),转换回常规字符。

检测大写和小写字母

阅读 CppReference 中的 std::isupperstd::islower

剩下的就很明显了。

使用整个 ASCII 字符范围怎么样?

您问题中的一个示例表明,应将相同的技术应用于更大的字母表,即包含整个扩展 ASCII 字符集的字母表。

出现了几个潜在的问题:

  1. 对于无法打印的字符我们该怎么办?本讨论假设他们应该像任何其他角色一样对待。
  2. 我们使用 ASCII 字符集 (0-127) 还是扩展 ASCII 字符集 (0-255)。 本讨论假设后者。

基本上,我们这里有一个 256 个字符的“字母表”。优点之一是无需担心大小写。一切都只是一个角色。

基本算法更简单。您所需要的只是上面的步骤 2 和 3。

对于每个角色:

  • 添加加密密钥。
  • 将结果取模 256。

取模数很容易。您可以简单地将加法结果转换回类型

char
。没必要用
ch % 256

ch = static_cast<char>(ch + key);  // encrypt character ch

您还可以使用更简洁的:

ch += static_cast<char>(key);  // encrypt character ch

我有一个工作程序,但我不会将其发布在这里。我希望您能通过自己编码获得奖励。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.