【问题标题】:XOR-ing strings in C#C# 中的异或字符串
【发布时间】:2013-02-04 23:32:51
【问题描述】:

我最近开始使用 C#,并试图了解为什么以下代码无法编译。在错误注释的行中,我得到:

无法将类型“int”隐式转换为“char”。显式转换退出(您是否缺少演员表?)

我正在尝试对两个字符串进行简单的异或运算。

public string calcXor (string a, string b)
{
    char[] charAArray = a.ToCharArray();
    char[] charBArray = b.ToCharArray();
    char[] result = new char[6];
    int len = 0;

    // Set length to be the length of the shorter string
    if (a.Length > b.Length)
        len = b.Length - 1;
    else
        len = a.Length - 1;

    for (int i = 0; i < len; i++) {
        result[i] = charAArray[i] ^ charBArray[i]; // Error here
    }

    return new string (result);
}

【问题讨论】:

  • 如果你的字符串是 ASCII,试试这个result[i] =(char)((short) charAArray[i] ^ (short)charBArray[i]);
  • 位运算符只将数字作为操作数。您的字符串是一系列数字吗?还是您尝试根据 ASCII 值执行此操作?
  • 谢谢,我忘了 xor 是按位运算符,所以它需要 1 和 0,这就是它抱怨 int 转换的原因。
  • 为了向未来的读者澄清,bitwise operator 不是take 1 and 0。那将是一个boolean operator,它只有两个值。 bitwise operator 作用于两个整数的所有位,产生一个整数。如已接受的答案所示。

标签: c# xor


【解决方案1】:

如果结果的值很重要,那么艾伦是正确的(接受的答案)。如果您只是在寻找匹配并且不担心性能,请使用 strcmp() 或 memcmp() 作为替代。

在汇编程序中,由于 T 周期较少,通常通过对自身进行异或来初始化事物。如果我是暴力破解(哈希比较),那么这将是对 strcmp 或 memcmp 的改进,因为我真的不排序,只是匹配/不匹配。

读者还应该知道this可以调整。

【讨论】:

  • 恕我直言,这个答案与这个问题无关,它没有说明寻找匹配项。
  • 我会付钱的。我读了太多的代码。当对字符串进行异或运算时,我通常希望用前导 x'00' 填充较短的字符串。相反,从 LHS 取得进展让我相信正在寻找匹配或正在发生转换以使数据模糊。
【解决方案2】:

如果您使用 XOR-ing 来隐藏数据,请查看以下代码。只要需要,密钥就会重复。这可能是一种更短/更好的方法:

public static string xorIt(string key, string input)
{
    StringBuilder sb = new StringBuilder();
    for(int i=0; i < input.Length; i++)
        sb.Append((char)(input[i] ^ key[(i % key.Length)]));
    String result = sb.ToString ();

    return result;
}

【讨论】:

  • +1 代码。但是在没有适当 PRG(伪随机生成器)的情况下使用任何流密码都会破坏语义安全原则。我很抱歉这么说,但是在您的代码中,使用的 PRG 与随机外观相去甚远,而且完全可以预测。事实上,这可以在很短的时间间隔内通过仅密文攻击来破解。所以简而言之,永远不要使用这种加密,除非你将它与安全 PRP(伪随机排列)或任何其他类型的可靠安全密码一起使用。
  • 我完全同意。如果您想要一个安全的解决方案,请使用可用的工具和框架。他们将以正确的方式为您完成上述 PRG 和所有其他漂亮的花里胡哨的工作。
  • 恕我直言,XOR-ing 字符串的重点不是强大的安全性,而是obfuscation 中的一个步骤 - 让对您的代码进行逆向工程以了解您的应用程序的工作更有效在哪里做。具体来说,他们不能简单地搜索您的字符串。他们必须跟踪逻辑,找到 XOR 方法,并使用适当的键通过该方法提供所有字符串。
【解决方案3】:

您正在对 2 个字符执行 xor。这将为您执行到int 的隐式类型转换,因为没有数据丢失。但是,从int 转换回char 将需要您提供显式转换。

您需要将您的int 显式转换为char for result[i]

result[i] = (char) (charAArray[i] ^ charBArray[i]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2016-06-19
    • 2010-09-25
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多