加密算法的字符串替换功能无法正常工作?

Posted

技术标签:

【中文标题】加密算法的字符串替换功能无法正常工作?【英文标题】:string replace function for encryption algorithm not working properly? 【发布时间】:2021-08-21 07:30:36 【问题描述】:

我正在尝试制作一个简单的字母替换加密程序,但是在加密过程中,它以某种方式无法正常工作。请告诉我代码有什么问题。下面代码的要点是它要求输入,然后将输入发送到 ReplaceLowercase 函数,该函数查看每个字母,直到在输入字符串中找到对应的字母,然后将其替换为 17 个字符的字符串在第一部分中定义,然后继续加密下一个字母。

#include <iostream>
using namespace std;

string ReplaceLowercase(string input)
    string A = "7W^S;/vB(6%I|w[fl";
    string B = "<w7>4f//Z55ZxK'z.";
    string C = "_W5g(lu<pTu3^_A7n";
    string D = "OfLm%8:EF0V1?BSS";
    string E = "|+E6t;AZ~XewXP17T";
    string F = "L-nIbhm5<z:92~+;x";
    string G = "L-nIbhm5<z:92~+;x";
    string H = "9bC5f0q@qA(RKZ>|r";
    string I = "9bC5f0q@qA(RKZ>|r";
    string J = "k=5;ln(08IAl(gGAK";
    string K = "|N;8]dGu)'^MaYpu[";
    string L = "!&;Y*nz8C*;J+d]";
    string M = "Us9%^%?n5!~e@@*+@";
    string N = "zF8,1KV#¥]$k?|9R#";
    string O = "0B4>=nioEjp>4rhgi";
    string P = "EG@0[W9.N4i~E<f3x";
    string Q = "(0Pwkk&IPchJHs.7A";
    string R = "7XgmQ6fW<|J+NY[m0";
    string S = ".g4CwX/DU!!~!zbtZ";
    string T = "+_U'qn_/9Fo|gT/!n";
    string U = "=0s(mYh&F%y=MBS5(";
    string V = "cg71(bo+Q5P8F[T6";
    string W = "lc|a\%5.9pOpooU+QR";
    string X = "E_(3A:o+.]qL3MYA6";
    string Y = "H@O'X_RiVS@8l0bKD";
    string Z = "Y1gbGD`~8d>HSWN35";
    

    int n = input.find("a",0);
    while(n < input.length())
        input.replace(n,A.size(),A); 
        n=input.find("a",n+17);
    

    n =input.find("b",0);
    while(n < input.length())
        input.replace(n,B.size(),B); 
        n=input.find("b",n+17);
    

    n =input.find("c",0);
    while(n < input.length())
        input.replace(n,C.size(),C); 
        n=input.find("c",n+17);
    

    n =input.find("d",0);
    while(n < input.length())
        input.replace(n,D.size(),D); 
        n=input.find("d",n+17);
    

    n =input.find("e",0);
    while(n < input.length())
        input.replace(n,E.size(),E); 
        n=input.find("e",n+17);
    

    n =input.find("f",0);
    while(n < input.length())
        input.replace(n,F.size(),F); 
        n=input.find("f",n+17);
    

    n =input.find("g",0);
    while(n < input.length())
        input.replace(n,G.size(),G); 
        n=input.find("g",n+17);
    

    n =input.find("h",0);
    while(n < input.length())
        input.replace(n,H.size(),H); 
        n=input.find("h",n+17);
    

    n =input.find("i",0);
    while(n < input.length())
        input.replace(n,I.size(),I); 
        n=input.find("i",n+17);
    

    n =input.find("j",0);
    while(n < input.length())
        input.replace(n,J.size(),J); 
        n=input.find("J",n+17);
    

    n =input.find("k",0);
    while(n < input.length())
        input.replace(n,K.size(),K); 
        n=input.find("k",n+17);
    

    n =input.find("l",0);
    while(n < input.length())
        input.replace(n,L.size(),L); 
        n=input.find("l",n+17);
    

    n =input.find("m",0);
    while(n < input.length())
        input.replace(n,M.size(),M); 
        n=input.find("m",n+17);
    

    n =input.find("n",0);
    while(n < input.length())
        input.replace(n,N.size(),N); 
        n=input.find("n",n+17);
    

    n =input.find("o",0);
    while(n < input.length())
        input.replace(n,O.size(),O); 
        n=input.find("o",n+17);
    

    n =input.find("p",0);
    while(n < input.length())
        input.replace(n,P.size(),P); 
        n=input.find("p",n+17);
    

    n =input.find("q",0);
    while(n < input.length())
        input.replace(n,Q.size(),Q); 
        n=input.find("q",n+17);
    

    n =input.find("r",0);
    while(n < input.length())
        input.replace(n,R.size(),R); 
        n=input.find("r",n+17);
    

    n =input.find("s",0);
    while(n < input.length())
        input.replace(n,S.size(),S); 
        n=input.find("s",n+17);
    

    n =input.find("t",0);
    while(n < input.length())
        input.replace(n,T.size(),T); 
        n=input.find("t",n+17);
    

    n =input.find("u",0);
    while(n < input.length())
        input.replace(n,U.size(),U); 
        n=input.find("u",n+17);
    

    n =input.find("v",0);
    while(n < input.length())
        input.replace(n,V.size(),V); 
        n=input.find("v",n+17);
    

    n =input.find("w",0);
    while(n < input.length())
        input.replace(n,W.size(),W); 
        n=input.find("w",n+17);
    

    n =input.find("x",0);
    while(n < input.length())
        input.replace(n,X.size(),W); 
        n=input.find("x",n+17);
    

    n =input.find("y",0);
    while(n < input.length())
        input.replace(n,Y.size(),Y); 
        n=input.find("y",n+17);
    

    n =input.find("z",0);
    while(n < input.length())
        input.replace(n,Z.size(),Z); 
        n=input.find("z",n+17);
    
    return input;


int main()
    string input;
    cin >> input;
    input = ReplaceLowercase(input);
    cout << input << std::endl;
    cout << "encryption complete" << endl;
    return 0;

【问题讨论】:

除非您的目标是一些深奥的系统,否则您可以假设字母是连续编码的 ASCII。这意味着您的所有代码都可以替换为从 'a''z' 的循环以及用于字符串替换的数组。 W.size() 不是 17 你在哪里检查find是否返回-1? 为什么要将 pos 转换为 int 而不是只使用 find 返回的类型? auto n = input.find(...); std:string::npos 很可能无法在 int 中表示;你最终可能会得到一个负值而不是一个正值。 @PatrickParker W.size() 可能是 17。implementation-defined 似乎是如何解释 "\%" 的。我试过的编译器将其转换为"%",使W的大小为17。 【参考方案1】:

上面的代码将替换已经替换的字母 也就是 'a' 被替换后, 'b' 被替换会超过 'a' 替换 并替换任何“b”,我保持这种方式

string Subs[]=

    "7W^S;/vB(6%I|w[fl",
    "<w7>4f//Z55ZxK'z.",
    "_W5g(lu<pTu3^_A7n",
    "OfLm%8:EF0V1?BSS",
    "|+E6t,AZ~XewXP17T",
    "L-nIbhm5<z:92~+,x",
    "L-nIbhm5<z:92~+,x",
    "9bC5f0q@qA(RKZ>|r",
    "9bC5f0q@qA(RKZ>|r",
    "k=5,ln(08IAl(gGAK",
    "|N,8]dGu)'^MaYpu[",
    "!&,Y*nz8C*,J+d]",
    "Us9%^%?n5!~e@@*+@",
    "zF8,1KV#¥]$k?|9R#",
    "0B4>=nioEjp>4rhgi",
    "EG@0[W9.N4i~E<f3x",
    "(0Pwkk&IPchJHs.7A",
    "7XgmQ6fW<|J+NY[m0",
    ".g4CwX/DU!!~!zbtZ",
    "+_U'qn_/9Fo|gT/!n",
    "=0s(mYh&F%y=MBS5(",
    "cg71(bo+Q5P8F[T6",
    "lc|a\%5.9pOpooU+QR",
    "E_(3A:o+.]qL3MYA6",
    "H@O'X_RiVS@8l0bKD",
    "Y1gbGD`~8d>HSWN35"
;

string ReplaceLowercase(string input)

    for(char cChar = 'a'; cChar <= 'z'; cChar++)
    
        size_t n = input.find(cChar, 0);
        
        string CurSub   =   Subs[cChar-97]; //  cChar-97 to get zero-based index into Subs
        
        while(n < input.length())
        
            input.replace(n, CurSub.size(), CurSub);
        
            n   =   input.find(cChar, n+CurSub.size());
        
    
    
    return input;


int main(void)

    string input;
    
    cin >> input;
    
    input = ReplaceLowercase(input);
    
    cout << input << std::endl;
    cout << "encryption complete" << endl;

    return 0;

编辑:

string ReplaceLowercase(string input)

    for(size_t pos = 0; pos<input.length(); )
    
        char cChar  =   input[pos];
        
        if(cChar>='a' && cChar<='z')    //  it's lowercase
        
            string CurSub   =   Subs[cChar-97]; //  cChar-97 to get zero-based index into Subs
            
            //  replace cChar with corresponding Sub
            input.replace(pos, 1, CurSub);
            
            //  Skip to the next letter in original input
            //  by jumping over newly inserted Sub
            pos +=  CurSub.length();
        
        else    //  not lowercase, next
            pos++;
    
    
    return input;

【讨论】:

感谢您的回答。也许问题本身不够具体,但你能不能让代码继续到原始输入的下一个字符进行替换,而不是在已经替换的字符串中进行替换,如果不是无限循环,这将创建一个相当长的循环。我希望这是有道理的。 我调整了函数,让它从原始输入跳转到下一个字母 谢谢。它工作得很好。一个问题。我怎样才能加密一个空格并在空格后面得到字符串?【参考方案2】:

有几个问题

    std::string::replace 的第二个参数应该是要替换的字符数,即1

    您未能针对std:string::npos 测试find 结果,因此它将无限循环。 (-1 总是小于字符串长度)

    W.size() 不是17.. 是吗?删除流浪\ 或将其转义为\\

    更多错误...(不是完整列表。请参阅 Errorist 的回答)

此外,还有大量的代码重复很容易避免。

最后,在以后的问题中,请比说代码“不起作用”更具体。它在哪些方面不起作用?说出来。

【讨论】:

以上是关于加密算法的字符串替换功能无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

恺撒加密

替换innerHTML中的字符串

UDF 替换功能 - 无法识别字符串

c#替换文件中的字符串

单表代替密码原理及算法实现

无法替换熊猫中的值