【问题标题】:Basic encrypt and decrypt method not working C++ 11基本加密和解密方法不起作用 C++ 11
【发布时间】:2019-01-23 01:58:21
【问题描述】:

我正在制作两个基本的加密和解密函数只是为了加密字符串,但是当输入某些字符时它似乎不起作用......

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

char characters[27][2] = {"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"," "};
char encrypted[27][2] = {"!","@","#","$","\%","^","&","*","(",")","_","-","+","=","~","`","{","}","[","]","|","\\",":",";","'","."};

bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
    return false;
    str.replace(start_pos, from.length(), to);
    return true;
}

string encrypt(string str) {
    int i = -1;
    for(string c : characters) {
        i += 1;
        replace(str,c,encrypted[i]);
    }
    return str;
}

string decrypt(string str) {
    int i = -1;
    for(string e : encrypted) {
        i += 1;
        replace(str,e,characters[i]);
    }
    return str;
}

int main() {
    string str = "testing-foo!";
    str = encrypt(str);
    cout << str;
    str = decrypt(str);
    cout << str;
}

我在编译时使用 std c++ 11,因此我可以初始化数组。
变量 str 的输出加密版本是 ]%[t(=&-^~o! 和 ]%[t(=&-^~o!testinglfooa。它似乎将 - 替换为 l 和 ! 替换为 a。

任何帮助将不胜感激!

【问题讨论】:

  • 为什么charactersencrypted 是静态二维数组?
  • @Bentoy13 什么意思?
  • @JesperJuhl 虽然这是一个非常有效的观点,但我非常怀疑 OP 是否出于实际安全目的而希望这样做。它看起来更像是一个练习,而不是一个真正的应用程序。
  • 如果我超出数组的大小会发生什么?

标签: c++ arrays string c++11 encryption


【解决方案1】:

这是因为您没有加密中的每个字符的映射。

您只提供字母和空格字符,而在您的字符串testing-foo! 中,您有字符-!。在您调用encrypt 函数期间,这些字符未加密。但是,在解密时,这些字符分别解密为la

解决方案:尝试添加您的列表以迎合角色-!

【讨论】:

  • 另一种选择是将encrypted 中但不在characters 中的任何源符号映射到字符前面的转义序列。请记住也要转义转义字符。缺点是你的输出字符串会比你的起始字符串长。
【解决方案2】:

当您一次加密一个字符时,可能的加密字符集必须与可能的原始字符集相同,或者您必须确保任何消息永远不会包含来自加密集的字符属于原来的。如果您不遵守该规则,则无法保证加密/解密操作是身份。

这里您的消息包含加密集中的字符,因此 crypt/encrypt 不是身份。


不相关,但您对charactersencrypted 的存储和处理很奇怪。如果你设法让你的代码正常工作,你真的应该把它提交到Code Review 以改进它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2016-04-22
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多