大小写字符串加解密,基本密码c++

Posted

技术标签:

【中文标题】大小写字符串加解密,基本密码c++【英文标题】:upper and lowercase string encryption and decryption, basic cipher c++ 【发布时间】:2017-12-15 23:56:48 【问题描述】:
#include<iostream>
#include<string>
#include<array>
#include<locale>
using namespace std;
class endeMachine

public:
    int findIndex(char letter)
    
        int index = 0;
        while (letter != alphabet[index])
        
            index++;
    //end while letter test
    return index;
    //findIndex
    string subEncrypt(string clear)
    
        string subString = clear;
        for (int i = 0; i < clear.length(); i++)
        
            subString[i] = substitution[findIndex(clear[i])];
        //end for
        return subString;
    //subEncrypt
    string transEncrypt(string clear)
    
        string subString = clear;
        for (int i = 0; i < clear.length(); i++)
        
            subString[i] = alphabet[findIndex(clear[i]) + offset];
        //end for
        return subString;
    //transEncrypt
private://---------------------------------------------------------
    array<char, 26> alphabet =  'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' ;
    array<char, 26> substitution =  'm','l','k','j','i','h','g','f','e','d','c','b','a','z','y','x','w','v','u','t','s','r','q','p','o','n' ;
    int offset = 3;
;//end endoMachine
int main()

    endeMachine text;
    string clear_text =  "Hello" ;
    cout << text.subEncrypt(clear_text) << endl;
    cout << text.transEncrypt(clear_text) << endl;
    cin >> clear_text;
//end main

所以在这个程序中,我试图最终达到它可以达到的程度:

加密最终用户输入的字符串 在加密的替换或转置方法之间进行选择 解密之前加密的后输入字符串 在其中一种加密方法中进行选择 在不知道加密方法的情况下解密加密字符串,从而生成所有可能的结果

我的问题是:

当输入字符串包含大写字母时,整个程序关闭。但是,如果我在第 12 行中执行以下操作:

while (tolower(letter) != alphabet[index])

加密方法都有效,但返回原始输入单词的严格小写版本,使得“Hello”的输入导致:

fibby
knoor

在输出时,而不是:

Fibby
Knoor

这意味着在某种程度上,我需要单独检查单词中每个字母的大小写,所以当需要输出时,可以在输出到屏幕之前将加密字符串的对应字母大写.

请帮忙!!!

【问题讨论】:

请整理一下缩进 第一次使用,抱歉。我已经修复了格式。希望现在我能得到一些帮助。 @EdHeal 您的字母替换键(在您的代码中)似乎只考虑小写... @Grantly 这就是重点,我想要一个方法来单独识别字符串的字符,将它们转换为小写字母,加密它们,然后将相应的加密字符大写。 【参考方案1】:

如果传递了大写字符,您的 findIndex 函数将失败。

原因是它使用了下面的常量数组:

array<char, 26> alphabet =  'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' ;
array<char, 26> substitution =  'm','l','k','j','i','h','g','f','e','d','c','b','a','z','y','x','w','v','u','t','s','r','q','p','o','n' ;

所以它不会找到匹配大写字母的匹配项,并且您的 while 循环意味着您返回的索引值将超出范围......这比您的数组大小大 1。

你可以:

检查 char 是否为大写 转换为小写 通过您的函数正常处理 如果是大写,则将您的加密字符设置为大写

...我猜想反向重复解密。

有一些丑陋而优雅的方法可以检查一个 char 是否为大写...

丑陋:

转换为小写并与原来的比较..它们是一样的吗?如果不是,则 Original 为大写。这可能在类似的语言中更具可移植性。降低函数here。

优雅:

char 值(对于普通英语)大写字符介于 65 和 90 之间。您可以检查此范围内的 char 值

【讨论】:

这就是我陷入困境的部分。如果是大写字母,我似乎不知道如何标记。 编辑了我的回答以提供帮助 很公平。我可能只是在这个项目上满足于更少,并在提示用户时记下这将在加密之前将所有输入的单词转换为小写。因此,省去了一个头痛。 啊,会很简单很刺激的....这是用来检查cplusplus.com/reference/cctype/tolower的功能 我认为你可以简单地通过在你的 findIndex 函数中添加一个指针参数来做到这一点...new param bool *isUpper; ...请原谅 C 语法...

以上是关于大小写字符串加解密,基本密码c++的主要内容,如果未能解决你的问题,请参考以下文章

字符串加解密

牛客 HJ29 字符串加解密

华为机试HJ29: 字符串加解密

你好,我刚接触Python,要做一个RSA密码加密,是这样的

华为OD机试真题 C++ 实现字符串解密2022.11 Q4 新题

华为OD机试真题 C++ 实现字符串解密2022.11 Q4 新题