C#字符串异或加密工具问题:所有字符串复用首个密钥求助
解决C#异或加密工具的多字符串循环处理问题
我明白你的痛点——你现在的代码只处理了第一个匹配到的字符串,导致所有后续字符串都复用了第一个生成的密钥,完全没达到每个字符串独立加密的效果。咱们来把这个循环逻辑修对,让每个字符串都能生成自己的密钥并完成加密替换。
先说说现有代码的核心问题
- 你只取了
matches[0],完全没遍历所有匹配到的字符串 - 最后用
x.Replace(textBox1.Text, s2)是全局替换,会把所有匹配的字符串都换成同一个加密结果,而不是逐个处理 - 额外提两个小bug:
toAscii方法每次调用都会往symbols里追加字符,导致这个字符串越来越长;randByte里每次newRandom(),如果调用频繁会生成相同的随机数
修复后的完整代码
// 把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(); }
关键修改点解释
- 逐个处理每个匹配项:用
Regex.Replace的MatchEvaluator委托,这个委托会对每个匹配到的字符串单独执行加密逻辑,完美解决循环处理的问题。 - 独立密钥生成:每个匹配的字符串都会调用
randByte()生成自己的随机密钥,不再复用第一个的。 - 修复symbols重复追加:把
symbols改成类的只读字段,只初始化一次,避免每次调用toAscii都往里面加字符。 - 修复随机数重复问题:缓存
Random实例,而不是每次调用randByte()都new一个,避免短时间内生成相同的随机数。 - 补全十六进制位数:把
Dec2Hex里的ToString("X")改成ToString("X2"),确保生成两位十六进制字符(比如0变成00),避免格式错误。 - 无效字符处理:遇到不在ASCII 32-126的字符时,直接返回原匹配内容,避免整个加密过程失败。
这样修改后,每个被双引号包裹的字符串都会被独立加密,生成各自的密钥和加密内容,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Peatreat
相关产品推荐
相关产品推荐

