You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#字符串异或加密工具问题:所有字符串复用首个密钥求助

解决C#异或加密工具的多字符串循环处理问题

我明白你的痛点——你现在的代码只处理了第一个匹配到的字符串,导致所有后续字符串都复用了第一个生成的密钥,完全没达到每个字符串独立加密的效果。咱们来把这个循环逻辑修对,让每个字符串都能生成自己的密钥并完成加密替换。

先说说现有代码的核心问题

  • 你只取了matches[0],完全没遍历所有匹配到的字符串
  • 最后用x.Replace(textBox1.Text, s2)是全局替换,会把所有匹配的字符串都换成同一个加密结果,而不是逐个处理
  • 额外提两个小bug:toAscii方法每次调用都会往symbols里追加字符,导致这个字符串越来越长;randByte里每次new Random(),如果调用频繁会生成相同的随机数

修复后的完整代码

// 把symbols初始化放在类里,避免每次调用toAscii都追加
private readonly string symbols = " !\"#$%&'()*+,-./0123456789:;<=>?@" 
    + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    + "[\\]^_`" 
    + "abcdefghijklmnopqrstuvwxyz" 
    + "{|}~";

// 缓存Random实例,避免频繁创建导致随机数重复
private readonly Random _random = new Random();

string Dec2Hex(int test) 
{ 
    string hex = test.ToString("X2"); // 用X2确保两位十六进制,比如0变成00
    return hex; 
} 

int toAscii(string xx) 
{ 
    int loc = symbols.IndexOf(xx); 
    if (loc > -1) 
    { 
        return 32 + loc; // 对应ASCII 32-126
    } 
    return 0; // 不在范围内返回0
} 

byte[] randByte() 
{ 
    Byte[] RandByte = new Byte[5]; 
    _random.NextBytes(RandByte); 
    return RandByte; 
} 

public void RunEncrypter() 
{ 
    string inputText = textBox1.Text;
    if (string.IsNullOrEmpty(inputText))
        return;

    // 使用MatchEvaluator逐个处理每个匹配的字符串
    System.Text.RegularExpressions.Regex x = new System.Text.RegularExpressions.Regex("\"(.*?)\"", System.Text.RegularExpressions.RegexOptions.Singleline);
    string result = x.Replace(inputText, match => 
    {
        string s1 = match.Groups[1].Value;
        // 为每个字符串生成独立的随机密钥
        byte[] randombyte = randByte();
        double xvaluestart = randombyte[0];
        string xrefkill = "0x" + Dec2Hex(randombyte[1]) + Dec2Hex(randombyte[2]) + Dec2Hex(randombyte[3]) + Dec2Hex(randombyte[4]);
        int finallen = s1.Length + 1;
        string hexsequence = "\"";
        double xvalue = xvaluestart;

        for (int i = 0; i < s1.Length; i++) 
        { 
            string ch = s1.Substring(i, 1); 
            int chval = toAscii(ch); 
            if (chval == 0) 
            { 
                // 如果有无效字符,直接返回原匹配内容避免整个流程失败
                return match.Value;
            } 
            chval ^= (int)xvalue; 
            xvalue += 1; 
            xvalue %= 256; 
            hexsequence += "\\x" + Dec2Hex(chval); 
        } 
        hexsequence += '"'; 

        string s2 = $"/*{s1}*/XorStr<0x{Dec2Hex((int)xvaluestart)},{finallen},{xrefkill}>(''; {hexsequence}+{xrefkill}).s";
        return s2;
    });

    textBox1.Text = result;
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    RunEncrypter(); 
}

关键修改点解释

  1. 逐个处理每个匹配项:用Regex.Replace的MatchEvaluator委托,这个委托会对每个匹配到的字符串单独执行加密逻辑,完美解决循环处理的问题。
  2. 独立密钥生成:每个匹配的字符串都会调用randByte()生成自己的随机密钥,不再复用第一个的。
  3. 修复symbols重复追加:把symbols改成类的只读字段,只初始化一次,避免每次调用toAscii都往里面加字符。
  4. 修复随机数重复问题:缓存Random实例,而不是每次调用randByte()都new一个,避免短时间内生成相同的随机数。
  5. 补全十六进制位数:把Dec2Hex里的ToString("X")改成ToString("X2"),确保生成两位十六进制字符(比如0变成00),避免格式错误。
  6. 无效字符处理:遇到不在ASCII 32-126的字符时,直接返回原匹配内容,避免整个加密过程失败。

这样修改后,每个被双引号包裹的字符串都会被独立加密,生成各自的密钥和加密内容,完全符合你的需求啦!

内容的提问来源于stack exchange,提问作者Peatreat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:11:19